2010-06-02 43 views
8

我想知道是否有可能從特定的AJAX方法清除緩存。你能清除jquery ajax緩存嗎?

說我有這樣的:

$.ajax({ 
    url: "test.html", 
    cache: true, 
    success: function(html){ 
    $("#results").append(html); 
    } 
}); 

現在的99%的時間,緩存的結果可以使用,因爲它應該始終有相同的內容。但是,如果用戶更新此內容,它(當然)會發生變化。如果它被緩存,它仍然會顯示舊內容。

因此,如果我可以爲此方法挑選此緩存並將其清除並保留所有其他緩存內容,那將很酷。

可以這樣做嗎?

編輯

我不明白。我發現如果您將cache設置爲false,則會生成一個唯一的URL,以防止瀏覽器對其進行緩存。

我的問題是,我希望它被緩存,直到有人對它進行更新。然後它不應該被緩存,直到他們再次點擊它。然後它應該被再次緩存。

基本上,我有一個更新模型對話框(jQuery UI),它提供了一個更新表單,以便用戶可以更新表格行。當他們點擊「更新」時,它會更新該表格行。現在,一列可能會有兩個段落值的數據,這使得表格看起來很糟糕。

因此,爲了保存表格,我在其中放置了一個名爲「顯示數據」的鏈接。現在,單擊此按鈕時,將顯示一個對話框模型框,並從服務器中提取數據。

如果他們點擊5次,它會重新加載5次。這就是爲什麼我想緩存它。但是,如果他們點擊它並獲取緩存,那麼無論出於何種原因他們將更新該行並單擊「顯示數據」,他們將獲得緩存版本,而不是更新版本。

我可能隱藏所有的段落,並顯示他們將使用jquery,但我寧願按需提供。否則,會隱藏很多垃圾,它會減慢頁面的速度(想象一下,如果某個人有50行,並且每個列有1000個字符)。

回答

10

您誤解了$.ajax的默認cache: true參數。在文檔中,你會發現以下幾點:

如果設置爲false,這將迫使你要求不被 緩存瀏覽器的網頁 。

要了解該參數確實,你應該看看jQuery的源代碼:

if (s.cache === false && type === "GET") { 
    var ts = now(); 

    // try replacing _= if it is there 
    var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 

    // if nothing was replaced, add timestamp to the end 
    s.url = ret + ((ret === s.url) ? 
      (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); 
} 

所以如果你使用cache: false,jQuery的只是增加了一個額外的參數與當前時間的URL。然後瀏覽器看到一個不同的URL並決定它的緩存中沒有該URL的數據,所以它將請求轉發給服務器。而已。

已更新基於問題的已編輯部分:如果我正確理解你,你想使用本地瀏覽器緩存,但你想控制它。如果是這樣,則應使用默認值cache: true(不要在$.ajax中添加此參數)。而不是依賴於$.ajax()選項,您應該添加一些額外的緩存信息到您的服務器響應。瀏覽器將始終明確地遵循緩存說明,因爲它們寫在相應的頁面標題中。

因此,例如,您可以在響應標題中添加時間,以指定頁面有效的時間。如果您不需要客戶端上絕對最新版本的數據(見http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html),這非常有效。

的另一種方式,這是我在我的大多數應用程序使用,是以下內容添加到服務器響應頭

  1. 「緩存控制」設置爲「最大年齡= 0」,這將關閉本地高速緩存
  2. 「Etag」具有某個值(例如,發送數據的MD5哈希)以標識數據包含的內容。這個值是完全免費的,你可以用任何你喜歡的方式來計算它,但是兩個不同的響應應該有不同的「Etag」值。

如果您希望始終擁有最新版本的數據,但不希望服務器能夠使用此方法,那麼對於動態內容(例如,基於來自數據庫的數據的響應)如果自上次響應以來沒有發生變化,則再次發送數據。如果按照此方法,則在第二次點擊「顯示數據」按鈕時,瀏覽器(每個瀏覽器)將添加到發送到服務器的數據的標頭中。"If-None-Match" HTTP請求標頭中的本地兌現頁面中的「Etag」值。然後服務器可以定義數據是否改變。如果不是,服務器可以用空的響應和"304 Not Modified"而不是"200 OK"進行響應。瀏覽器知道這一點,它直接從本地獲得數據。因此,您的$.ajax請求將成功結束,您將獲得本地現金的數據。

你可以結合兩種方式。只是設置而不是「最大年齡= 0」一些非零值,這是本地現金有效期的秒數(見http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

+0

請參閱編輯....... – chobo2 2010-06-02 19:26:07

+0

對不起,不要理解你的意思是「請參閱編輯.......」。 – Oleg 2010-06-02 19:30:24

+0

我剛剛編輯我的帖子。對不起,花了幾分鐘時間超過預期。 – chobo2 2010-06-02 19:31:16