2011-07-25 104 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