你能清除jquery ajax缓存吗?

时间:2010-06-02 19:10:07

标签: 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个字符)。

1 个答案:

答案 0 :(得分:10)

您误解了cache: true的默认$.ajax参数。在文档中,您将找到以下内容:

  

如果设置为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”值。
  3. 如果您希望始终拥有最新版本的数据,但又不希望服务器发送数据,则此方法非常适合动态内容(例如,对于基于数据库中数据的响应)如果自上次回复后没有改变,再次。如果你按照这种方法,浏览器(每个浏览器)添加到发送到服务器的数据的标题,在第二次单击“显示数据”按钮时,"If-None-Match"内的本地兑现页面中的“Etag”值HTTP请求标头。然后,服务器可以定义数据是否已更改。如果没有,服务器可以使用响应和"304 Not Modified"而不是"200 OK"进行响应。浏览器知道这一点,它直接从当地现金获取数据。因此,您的$.ajax请求将成功结束,您将获得当地现金的数据。

    你可以将两种方式结合起来。只需设置一个非零值,而不是“max-age = 0”,这是当地现金有效期的秒数(见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3