【问题标题】:Can you clear jquery ajax cache?你能清除jquery ajax缓存吗?
【发布时间】:2010-06-02 19:10:07
【问题描述】:

我想知道是否可以从特定的 AJAX 方法中清除缓存。

说我有这个:

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

现在 99% 的情况下,可以使用缓存的结果,因为它应该始终具有相同的内容。但是,如果用户更新此内容,它(当然)会改变。如果它被缓存,它仍然会显示旧内容。

所以,如果我可以为这个方法选择这个缓存并清除它,并且所有其他缓存的东西都会保留,那就太棒了。

这个可以吗?

编辑

我不跟随。我看到如果您将cache 设置为false,它会生成一个唯一的URL 以防止浏览器缓存它。

我的问题是我希望它被缓存,直到有人对其进行更新。然后它不应该被缓存,直到他们再次点击它。然后应该再次缓存。

基本上,我有一个更新模型对话框(jquery UI),它会显示一个更新表单,以便用户可以更新表格行。当他们单击“更新”时,它会更新该表行。现在一列可以包含几段数据,这会使表格看起来很糟糕。

所以为了保留表格,我在其中放置了一个名为“显示数据”的链接。现在,当单击它时,会显示一个对话框模型框,并从服务器中提取数据。

如果他们点击它 5 次,它会重新加载 5 次。这就是为什么我想缓存它。但是,如果他们点击它并且它被缓存,那么无论出于何种原因他们去更新该行并点击“显示数据”,他们将获得缓存的版本,而不是更新的版本。

我可能会隐藏所有段落并使用 jquery 将它们显示出来,但我宁愿按需使用。否则会隐藏很多废话,并且会减慢页面速度(想象一下,如果某个人有 50 行,而这些列中的每一列都有 1000 个字符)。

【问题讨论】:

    标签: jquery


    【解决方案1】:

    您误解了$.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”值。

    如果您希望始终拥有最新版本的数据,但不希望服务器发送数据,此方法非常适用于动态内容(例如,基于数据库数据的响应)如果自上次响应以来它没有改变,则再次。如果您遵循此方法,浏览器(每个浏览器)会在第二次单击“显示数据”按钮时将来自"If-None-Match" HTTP 请求的本地兑现分页的“Etag”值添加到发送到服务器的数据的标题中标题。然后服务器可以定义数据是否改变。如果没有,服务器可以用 empty 响应和"304 Not Modified" 而不是"200 OK" 进行响应。浏览器知道这一点,它直接从本地现金中获取数据。这样您的$.ajax 请求将成功结束,您将获得本地现金的数据。

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

    【讨论】:

    • 我刚刚编辑了我的帖子。抱歉,比预期的时间长了几分钟。
    • 嗨,好帖子。我遇到了不同的情况:我正在为图像制作一个简单的全尺寸预览,我必须从服务器加载一个常规文件。没有服务器端代码。只是来自客户端的 AJAX 请求。问题如下 - 当我更改服务器上的图像文件时,我总是看到第一次加载的旧文件。在这种情况下该怎么办?谢谢。
    • @AntonAL:在您的情况下,jQuery.ajax 的参数 cache: false 的使用应该会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2022-11-18
    • 2012-02-01
    • 2011-05-02
    • 2012-06-29
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多