你能清除jQuery AJAX缓存吗?

8

我想知道是否有可能清除特定 AJAX 方法的缓存。

假设我有以下代码:

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

现在大部分时间应该可以使用缓存结果,因为它应该始终具有相同的内容。但是,如果用户更新此内容,则会更改它。(当然)如果它已被缓存,则仍将显示旧内容。因此,如果我可以挑选出此方法的缓存并清除它,那就太棒了,所有其他缓存的内容都将保留。这可以做到吗?
编辑
我不明白。我看到如果将缓存设置为false,则会创建一个唯一的URL以防止浏览器对其进行缓存。 我的问题是,我希望它被缓存,直到有人对其进行更新。 然后,只要他们再次点击它,它就不应该被缓存。 然后它应该再次被缓存。 基本上,我有一个更新模型对话框(jquery UI),它会带来一个更新表格行的表单,以便用户可以更新表格行。 当他们单击“更新”时,它将更新该表格行。现在,一个列可以有几段文字的数据,这使得表格看起来很糟糕。因此,为了保护表格,我在它的位置上放了一个名为“显示数据”的链接。 现在,当它被点击时,它将显示一个对话框模型框,并从服务器获取数据。 如果他们点击5次,它就会重新加载5次。 这就是为什么我想要缓存它。然而,如果他们单击它并被缓存,然后由于某种原因他们去更新该行并单击“显示数据”,他们将获得缓存版本,而不是更新版本。 我可能可以使用jquery隐藏所有段落,并在需要时显示它们,但我宁愿根据需要进行操作。 否则,将有很多垃圾被隐藏,这将减慢页面(想象一下,如果某个人有50行,每行的列都有1000个字符)。
1个回答

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 : "");
}
如果在jQuery中使用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" HTTP请求头中。然后服务器可以定义数据是否改变。如果没有改变,则服务器可以使用"304 Not Modified"而不是"200 OK"回复响应。浏览器知道这一点,并直接从本地缓存获取数据。因此,您的$.ajax请求将成功结束,并且您将获得来自本地缓存的数据。
当然,您也可以将两种方法组合起来。只需设置非零值,即为本地缓存的有效期时间(请参见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3)。

我刚刚编辑了我的帖子。很抱歉比预期多花了几分钟。 - chobo2
嗨,好帖子。我面临了不同的情况:我正在为图像制作一个简单的全尺寸预览,我必须从服务器加载一个常规文件。没有服务器端代码。只有客户端的 AJAX 请求。问题在于 - 当我更改服务器上的图像文件时,我总是看到第一次加载的旧文件。在这种情况下该怎么办?谢谢。 - AntonAL
@AntonAL:在你的情况下,使用jQuery.ajax的参数cache: false应该会有所帮助。 - Oleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接