2011-07-25 119 views
4

为什么按下后退按钮时Firefox 5.0.1不刷新此页面?为什么Firefox 5会忽略document.ready?

<html> 
<head> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <script src="http://code.jquery.com/jquery-1.6.2.min.js" type="text/javascript"></script> 
    <script> 
    $(document).ready(function() { alert('ready'); }); 
    $(window).load(function() { alert('load'); }); 
    </script> 
</head> 
<body> 
    <form action="http://www.google.com" method="get"> 
    <input name="q" type="text"> 
    <input type="submit"> 
    </form> 
</body> 
</html> 

重现步骤:

  1. 点击 “提交按钮”
  2. 按返回
  3. 既不的document.ready或window.load火灾

更新:

这将迫使火狐刷新页面:

$(window).unload(function() {}); 

但是,我结束了使用此:

window.addEventListener('pageshow', function() {alert('pageshow'); }, false); 
+0

+1 Firefox不会重新加载任何资源,并且在“按回”时不会触发任何回调。我用萤火虫调试它 – Anatoly

+0

$(document).ready()似乎对我来说...至少在jsfiddle iframe中 - > http://jsfiddle.net/qwRPS/ – Tomm

+0

@Tomm yes ready for fires for me在您的jsfiddle.net示例中,现在介绍如何让我的独立示例正常工作。 –

回答

9

为什么Firefox 5.0.1在按下后退按钮时不刷新此页面?

因为它不需要。

当你在Firefox中“返回”并且Firefox可以从后退按钮缓冲区中完全加载页面时,那么你将返回的不是新的页面,而是你以前离开它的确切状态的页面就好像两者之间没有任何事情发生,并且包括所有Javascript代码和变量的状态。就你的脚本(和jQuery)而言,ready()已经被触发了。如果它已被解雇,jQuery将不会再次启动它。

你可能想要的是listen to the 'pageshow' event,即使页面从缓冲区重新加载,即使其状态完全保留,Firefox也会触发。

+0

你看了我的想法,pageshow为我的真正目的工作(重新启用提交按钮,我禁用) –

+1

这真的取决于你想要什么。有时你想让Firefox完全恢复你的状态(在这种情况下,你甚至可能甚至不需要为pageshow做任何事情)。或者,有时您可能需要重新初始化页面(在这种情况下,您想绕过Firefox的状态缓存)。重要的是有意识地决定哪一个适合你的页面和设计。 – jfriend00

1

Ajax, back button and DOM updatesRestore object classes on back button in Firefox关于存储页面的整个状态和Firefox的网页缓存在大多数情况下不会触发加载事件。如果你想避免让Firefox保存你的页面状态(这取决于你在页面中拥有什么样的状态),看起来你可以通过注册页面的卸载事件来让它跳过它。因为卸载事件可能会使页面状态无效,所以如果您有一个页面状态,Firefox不会缓存页面状态,并且后退按钮将在后退按钮上新加载页面,并且所有正常加载事件都将触发。

+0

使用虚拟卸载功能起作用。 –

+1

这会减慢后退按钮的速度,这意味着您不会回到与您离开相同状态的页面,特别是如果您与页面上的元素进行了交互。这有点破坏了用户体验。如果您聆听pageshow事件,则不需要执行此操作。 – thomasrutter