对于所有主要浏览器(除IE外),当页面由于返回按钮操作而加载时,JavaScript的onload
事件不会触发 - 它只在页面第一次加载时触发。
有人可以给我指出一些可解决这个问题的跨浏览器示例代码(Firefox,Opera,Safari,IE等)吗?我熟悉Firefox的pageshow
事件,但不幸的是,Opera和Safari都没有实现此功能。
对于所有主要浏览器(除IE外),当页面由于返回按钮操作而加载时,JavaScript的onload
事件不会触发 - 它只在页面第一次加载时触发。
有人可以给我指出一些可解决这个问题的跨浏览器示例代码(Firefox,Opera,Safari,IE等)吗?我熟悉Firefox的pageshow
事件,但不幸的是,Opera和Safari都没有实现此功能。
大家好,我发现JQuery只有一个作用:在按下后退按钮时重新加载页面。这与"ready"无关。
它是如何工作的呢?JQuery 添加了一个onunload事件监听器。
// http://code.jquery.com/jquery-latest.js
jQuery(window).bind("unload", function() { // ...
默认情况下,它没有任何作用。但不知为何,在Safari、Opera和Mozilla中,似乎会触发重新加载。无论事件处理程序包含什么。
[编辑(Nickolay):它为什么能这样工作的原因在这里:webkit.org,developer.mozilla.org。请阅读这些文章(或者我在另一个答案中的摘要),并考虑您是否真的需要这样做,并使您的页面加载速度变慢。
难以置信吗?试试这个:
<body onunload=""><!-- This does the trick -->
<script type="text/javascript">
alert('first load / reload');
window.onload = function(){alert('onload')};
</script>
<a href="http://stackoverflow.com">click me, then press the back button</a>
</body>
使用JQuery时,您将看到类似的结果。
您可能想与没有onunload的情况进行比较。
<body><!-- Will not reload on back button -->
<script type="text/javascript">
alert('first load / reload');
window.onload = function(){alert('onload')};
</script>
<a href="http://stackoverflow.com">click me, then press the back button</a>
</body>
onunload
处理程序(页面已经销毁了所有内容,为什么要缓存它?),它就无法被缓存。 - Casey Chupushstate
和replacestate
,那么bfcache非常容易出现错误。我们有一些真正有效的解决方案吗? - Pacerier我遇到了一个问题,当用户点击后退或前进时,我的JS代码没有执行。我首先尝试停止浏览器缓存,但这似乎不是问题的原因。我的JavaScript设置为在所有库等加载完成后执行。我使用readyStateChange事件检查了它们。
经过一些测试,我发现页面中元素的readyState在点击“后退”后不是“已加载”,而是“已完成”。将||element.readyState == 'complete'
添加到我的条件语句中解决了我的问题。
只是想分享我的发现,希望能帮助其他人。
编辑完整内容
我的代码如下:
script.onreadystatechange(function(){
if(script.readyState == 'loaded' || script.readyState == 'complete') {
// call code to execute here.
}
});
在上述代码示例中,script变量是一个新创建的脚本元素,已被添加到DOM中。好的,这里是一个最终解决方案,基于ckramer的初始解决方案和palehorse的示例,在所有浏览器中都有效,包括Opera。如果将history.navigationMode设置为“compatible”,那么jQuery的ready函数将在Opera中的后退按钮操作以及其他主要浏览器中启动。
此页面有更多信息。
示例:
history.navigationMode = 'compatible';
$(document).ready(function(){
alert('test');
});
我在Opera 9.5、IE7、FF3和Safari中测试过,它们都可以正常工作。
我无法使上述示例正常工作。我只是想在通过后退按钮返回页面时触发对某些修改的div区域进行刷新。我使用的技巧是,当div区域从原始状态更改时,将隐藏输入字段(称为“脏位”)设置为1。当我点击后退时,隐藏输入字段实际上会保留其值,因此在onload中,我可以检查这个位是否被设置。如果设置了,我就刷新页面(或只刷新div区域)。然而,在最初加载时,该位未设置,因此我不会浪费时间加载页面两次。
<input type='hidden' id='dirty'>
<script>
$(document).ready(function() {
if ($('#dirty').val()) {
// ... reload the page or specific divs only
}
// when something modifies a div that needs to be refreshed, set dirty=1
$('#dirty').val('1');
});
</script>
每当我点击返回按钮时,它都能正确触发。
<html>
<head>
<title>Test Page</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
var d = new Date();
$('#test').html( "Hi at " + d.toString() );
});
</script>
</head>
<body>
<div id="test"></div>
<div>
<a href="http://www.google.com">Go!</a>
</div>
</body>
</html>
我以为这是针对“onunload”,而不是页面加载,因为我们讨论的是在点击“返回”时触发事件。$document.ready()用于希望在页面加载时触发的事件,无论您如何到达该页面(即重定向、直接在浏览器中打开URL等),而不是在单击“返回”时,除非您正在谈论当上一页再次加载时要触发什么。而且我不确定页面是否没有被缓存,因为我发现即使在其中包含了$document.ready(),JavaScript仍然会被缓存。每当我们编辑具有此事件的脚本并希望在页面中测试结果时,我们不得不按Ctrl+F5。
$(window).unload(function(){ alert('do unload stuff here'); });
当用户点击“返回”并卸载当前页面时,以及关闭浏览器窗口时,您希望的是onunload事件。即使我在$document.ready()响应方面处于少数派,这似乎更符合要求。基本上,区别在于一个事件在当前页面关闭时触发,另一个事件在单击“返回”并加载时触发。在IE 7中测试过,其他浏览器无法确定。但这可能是另一种选择。
如果我没记错的话,添加unload()事件意味着页面不能被缓存(在前进/后退缓存中)-因为它的状态会随着用户导航而改变。因此,在通过历史对象导航返回页面时恢复最后一秒钟的状态是不安全的。