2011-03-14 123 views
23

由於最近Safari 5發佈了,它導致我的網站出現一些問題。我有一個運行傳統ASP的動態網站(儘管這應該不重要),並且該網站有一些創造性的歷史堆棧使用。例如,您可以在列出產品的頁面上,然後查看有關產品的詳細信息並更改產品(admin-view)。當您點擊產品上的保存時,信息將通過AJAX發送到服務器,併發出history.back()。這在所有瀏覽器(包括safari < = 4)都很好,但是,在新發布的safari 5中,它停止工作。看起來,當您在Safari 5中單擊時,它實際上並未刷新頁面,它只會從緩存中加載它,這意味着不會顯示在詳細信息視圖中所做的更改。我如何才能在safari 5中完成這項工作?這是當前的代碼,我不得不關閉緩存(包括在每一個頁面的頂部):防止Safari 5中的後退按鈕上的緩存

Dim pStr 
pStr = "private, no-cache, no-store, must-revalidate" 
Response.AddHeader "pragma","no-cache"  '? 
Response.AddHeader "cache-control", pStr '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "cache-control", "post-check=0, pre-check=0"  '? Er ikke sikker på om disse 3 siste er nødvendige. 
Response.AddHeader "Expires", "Mon, 26 Jul 1997 05:00:00 GMT"  '? 
Response.AddHeader "Last-Modified", Now() 

回答

45

空的unload處理程序將不再工作。相反,您可以檢查onpageshow事件的persisted屬性。它在初始頁面加載時設置爲false。當頁面從bfcache加載時,它被設置爲true。

Kludgish解決方案是在從bfcache加載頁面時強制重新加載。

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

如果您正在使用jQuery然後執行:

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload() 
    } 
}); 
+1

偉大的修復 - 確認從iOS 6(iPhone和iPad)開始工作!謝謝Mika! – Jesse 2013-04-07 12:15:36

+2

這也適用於Safari 6,桌面。 window.onunload的舊黑客不再一貫地工作 - 現在應該被認爲是「正確的」答案。 – 2013-06-06 20:34:06

+1

這適用於iPad。不幸的是(至少對我而言),當它從睡眠模式喚醒時,它有重新加載頁面的副作用。如果用戶做了一堆表單元素的更改導致各種顯示更改,用戶必須重新開始。有沒有辦法重新加載頁面只有從後退按鈕,但不是如果醒來? – 2013-10-16 20:37:14

7

一些googeling後挖我已經找到了解決方案,但我不是太高興。在body-tag中設置onunload=""會導致Safari無效並重新加載頁面window.history.back();

+1

我一直有一個類似的問題,但我希望用戶在瀏覽器的背部進行重新驗證(學生在iPad上輪流) 。 onunload =「」hack似乎很好地在筆記本電腦上強制重新驗證Safari,但不在iPad上的移動Safari上。有什麼想法嗎? – John 2011-08-09 04:29:17

3

這裏的另一種方式:

function invalidateBackCache() { 
     // necessary for Safari: mobile & desktop 
    } 

    window.addEventListener("unload", invalidateBackCache, false); 

我選擇走這條路,因爲添加HTML(onunload的=「」),以在.net body標籤參與我的情況下修改三個文件。在jQuery中設置onunload屬性也沒有解決它。

這也適用於手機Sarfari(iPad)。

+2

nope,這也不適用於我(後退按鈕在ipad上)。它只是在刷新。 – sirmak 2012-02-14 07:14:54

+1

這個想法是正確的/爲我工作。我使用了下面的jquery相關代碼:'$(window).on('unload',function(){});' – Sam 2014-04-15 23:25:21

+0

請注意,在移動版Safari上最近的版本報告卸載事件有問題,因此您可能想要仔細檢查 – 2016-11-14 21:32:32