2010-10-07 56 views
1

jqGrid是否在文件系統上存儲網格數據?如果是這樣,您是否需要清除瀏覽器的緩存以將其刪除?jqGrid數據存儲在瀏覽器緩存中?

或者它只是通過JavaScript(和瀏覽器)存儲在內存中?只是關閉你的瀏覽器刪除數據?

這些問題的答案是否會根據您是否使用loadOnce而改變?

回答

4

默認情況下,從服務器(JSON或XML數據)加載的數據將保存在瀏覽器緩存中,但在下次請求時不會使用。原因是每個默認的jqGrid實現了相同的行爲,如cache:false參數jQuery.ajax。這意味着所有請求都有一個附加參數nd,如nd=1286296925096,這是時間戳。它使得所有GET請求的URL都是唯一的,因此本地保存的數據不會被使用兩次。所以如果你想讓jqGrid不使用本地瀏覽器緩存中的數據,你不需要做任何事情

如果您還想在本地保存數據(例如,出於安全原因,或者爲了減少填充本地緩存而使用永不會使用的信息),您可以在服務器響應的HTTP標頭中包含no-store指令。

如果你想要緩存服務器請求和使用數據,你應該prmNames: { nd:null}jqGrid option。然後,來自下一個請求的數據可以從本地瀏覽器緩存中獲取。如果你這樣做,我會建議你在服務器響應的HTTP頭中包含Cache-Control指令,這些指令強制使用你需要的緩存行爲。例如,我個人使用Cache-Control: max-age=0,並使用ETag以及發送數據中的散列。所以所有的ajax請求將發送到服務器到重新驗證本地緩存。所有請求將自動包含If-None-Match HTTP標頭,其中ETag數據來自本地緩存。如果數據未更改,則服務器可以回答HTTP/1.1 304 Not Modified,而不是HTTP/1.1 200 OK,而主體具有該數據。響應HTTP/1.1 304 Not Modified允許瀏覽器使用本地緩存。

更新:我使用另外Cache-Control: private其關掉緩存代理上的數據,並宣佈該數據可以被高速緩存,但不與其它用戶共享。

如果您想要了解有關HTTP標頭緩存控制的更多信息,我會建議您閱讀以下Caching Tutorial

+0

如果我們不使用HTTP頭,該怎麼辦?我只用了prmNames:{nd:null},它的工作原理完全符合我的要求。 – Jaikrat 2015-08-28 14:02:36

+0

@Jaikrat:我不明白「如果我們不使用HTTP頭怎麼辦?」每個啓動'http:// ...'的URL都將使用HTTP協議來加載相應的HTML頁面。您可以使用[Fiddler](http://www.telerik.com/fiddler)或IE/Chrome的開發人員工具(按F12啓動並進入網絡選項卡)進行網絡跟蹤(正是它的HTTP跟蹤)。如果你使用'prmNames:{nd:null}'和'mtype:「GET」',那麼你可能會在Internet Explorer(尤其是舊版本)中遇到問題,因爲它會緩存舊請求並且不會向服務器發送新請求。 – Oleg 2015-08-28 15:06:34

+0

@Jaikrat:所以我建議在服務器響應中設置HTTP標頭'Cache-Control:private,max-age = 0'。另外可以使用'prmNames:{nd:null}'去除絕對不需要的參數。'Cache-Control'是HTTP標準的一部分,並且**所有Web瀏覽器**都會向服務器發送新的Ajax請求,而不僅僅是從Web瀏覽器緩存中獲取先前的請求。這是最乾淨的方式。 – Oleg 2015-08-28 15:10:30