2012-02-25 27 views
6

我使用HTML 5歷史api來保存Ajax請求發生時的狀態,如果用戶請求同一頁面沒有ajax請求,我提供完整的html內容。「重新打開最後關閉的選項卡」導致顯示最後一個Ajax請求內容

瀏覽器的「重新打開最後關閉的選項卡」功能會將最後一個Ajax請求內容帶到服務器。如果瀏覽器請求不帶最後的請求內容,那麼一切都會毫無問題地工作。但瀏覽器只顯示最後的ajax請求內容。

我已經經歷過這個在Chrome 17,Firefox的10。(我還沒有嘗試過在IE9,因爲它不支持歷史API)

什麼是衆所周知的解決方案,這個問題?

編輯:這些ajax請求只是「獲取」請求到服務器。

真的不可能在jsfiddle.net中演示它,因爲幾個原因。您可以在下面的localhost中演示它。

向服務器發出「請求」請求,並拉動json對象,然後將該url推入歷史api中,如下所示。

history.pushState(null,null,url); 

然後關閉該選項卡,然後單擊瀏覽器的「重新打開最後關閉的選項卡」功能。你看到了什麼 ? Json響應正文?瀏覽器顯示它沒有向服務器發出請求,對嗎?

+0

任何人有一個想法? – Freshblood 2012-02-25 16:57:11

+1

你可以發佈一些代碼,或鏈接到一個頁面來演示這個問題嗎? – robertc 2012-02-25 22:29:37

+0

@robertc我更新了問題並提供了演示信息。 – Freshblood 2012-02-26 01:29:24

回答

4

問題是由http響應頭引起的。標題包含ajax請求的可緩存信息,因此瀏覽器顯示的是從緩存沒有命中到數據庫的url內容。

從響應頭中刪除緩存參數後,瀏覽器能夠在沒有從緩存中獲取內容的情況下點擊服務器。

0

這一切都取決於您使用的瀏覽器以及啓用了哪些優化。

谷歌瀏覽器會將頁面保存在內存中,所以當你回到一個新的網站時,或者當你重新打開關閉的標籤時,它會從內存中恢復頁面。

舊版/慢版瀏覽器只會刷新任何內容。

雖然這不應該是一個問題,因爲你的javascript狀態應該被恢復 - 當它們重新打開那個頁面時,它應該完全一樣。

+0

我正在使用Chrome和Firefox最新版本而不修改任何設置。應該不是問題嗎?用戶總是看到最後一個是json的ajax請求內容,我無法向他顯示頁面的最後狀態,我正在使用sammy js實現這些。 – Freshblood 2012-02-26 15:37:39

1

當您重新打開一個關閉的選項卡時,允許瀏覽器從給定的URL的緩存中重用數據來填充窗口。由於緩存中的數據來自ajax請求響應,這就是它使用的,並且您可以看到JSON。

因此,這導致了一個問題:爲什麼瀏覽器在滿足ajax請求時不使用緩存中的HTML?瀏覽器使用不同的規則來確定是否使用緩存內容,具體取決於他們正在做什麼。在這種情況下,Chrome很高興在還原最近關閉的選項卡時重用它,而不是在執行ajax請求時重用它。

您可以通過告訴瀏覽器永不緩存響應來糾正它。這是否可取決於您的使用情況。

例如,在你的文件的頂部插入這(開幕<?php標籤後,當然),使得它不會發生對我來說:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
相關問題