簡體   English   中英

你能清除jquery ajax緩存嗎?

[英]Can you clear jquery ajax cache?

我想知道是否可以從特定的AJAX方法清除緩存。

說我有這個:

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

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

因此,如果我可以為此方法選擇此緩存並清除它並且所有其他緩存的內容都會保留,那將會很酷。

可以這樣做嗎?

編輯

我不跟隨。 我看到如果你將cache設置為false,它會創建一個唯一的URL來阻止瀏覽器緩存它。

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

基本上,我有一個更新模型對話框(jquery UI),它會顯示一個更新表單,以便用戶可以更新表行。 當他們單擊“更新”時,它會更新該表行。 現在,一列可以有幾個段落的數據,這會使表看起來很糟糕。

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

如果他們點擊它5次就會重新加載5次。 這就是我想要緩存它的原因。 但是,如果他們點擊它並且它被緩存,那么無論出於什么原因他們去更新該行並單擊“顯示數據”,他們將獲得緩存版本,而不是更新版本。

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

您誤解了默認cache: true $.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. “Cache-Control”設置為“max-age = 0”,關閉本地緩存
  2. “Etag”具有一些值(例如,發送數據的MD5哈希值)以標識數據包含的內容。 該值是完全免費的,您可以按照自己喜歡的方式計算它,但是兩個不同的響應應該具有不同的“Etag”值。

如果您希望始終擁有最新版本的數據,但又不希望服務器再次發送數據,則此方法非常適用於動態內容(例如,基於來自數據庫的數據的響應)自上次回復以來沒有改變。 如果您按照這種方法,瀏覽器(每個瀏覽器)添加到發送到服務器的數據的標題,在第二次單擊“顯示數據”按鈕時,“Etag”值來自"If-None-Match"的本地兌現頁面"If-None-Match" HTTP請求標頭。 然后,服務器可以定義數據是否已更改。 如果沒有,服務器可以響應響應和"304 Not Modified"而不是"200 OK" 瀏覽器知道這一點,它直接從當地現金獲取數據。 因此,您的$.ajax請求將成功結束,您將獲得當地現金的數據。

你可以將兩種方式結合起來。 只需設置一個非零值,而不是“max-age = 0”,這是當地現金有效期的秒數(見http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html# sec14.9.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM