说我有这个:
$.ajax({ url: "test.html",cache: true,success: function(html){ $("#results").append(html); } });
现在有99%的时间可以使用缓存结果,因为它应该始终具有相同的内容.但是,如果用户更新此内容,它(当然)会更改.如果它被缓存,它仍然会显示旧内容.
因此,如果我可以为此方法选择此缓存并清除它并且所有其他缓存的东西都会保留,那将会很酷.
可以这样做吗?
编辑
我不跟随.我看到,如果将cache设置为false,它会创建一个唯一的URL来阻止浏览器缓存它.
我的问题是我希望它被缓存,直到有人对它进行更新.然后它不应该被缓存,直到他们再次点击它.然后它应该再次缓存.
基本上,我有一个更新模型对话框(jquery UI),它会显示一个更新表单,以便用户可以更新表行.当他们单击“更新”时,它会更新该表行.现在,一个列可以有几个段落的数据,这会使表看起来很糟糕.
因此,为了保留表格,我在其中放置了一个名为“显示数据”的链接.现在,单击此按钮时,将显示一个对话框模型框,并从服务器中提取数据.
如果他们点击它5次就会重新加载5次.这就是我想要缓存它的原因.但是,如果他们点击它并且它被缓存,那么无论出于何种原因他们去更新该行并单击“显示数据”,他们将获得缓存版本,而不是更新版本.
我可能会隐藏所有段落并使用jquery显示它们,但我宁愿按需提供它们.否则会有很多隐藏的垃圾,它会减慢页面的速度(想象一下,如果某个人有50行,并且每列中的每一行都有1000个字符).
解决方法
If set to false it will force the
pages that you request to not be
cached by the browser.
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).
我在大多数应用程序中使用的另一种方法是将以下内容添加到服务器响应标头中
>“Cache-Control”设置为“max-age = 0”,关闭本地缓存
>“Etag”具有一些值(例如,发送数据的MD5哈希值)以标识数据包含的内容.该值是完全免费的,您可以按照自己喜欢的方式计算它,但是两个不同的响应应该具有不同的“Etag”值.
如果您希望始终拥有最新版本的数据,但又不希望服务器再次发送数据,则此方法非常适用于动态内容(例如,基于来自数据库的数据的响应)自上次回复以来没有改变.如果您按照这种方法,浏览器(每个浏览器)添加到发送到服务器的数据的标题,在第二次单击“显示数据”按钮时,“Etag”值来自“If-None-”中的本地兑现页面匹配“HTTP请求标头.然后,服务器可以定义数据是否已更改.如果没有,服务器可以响应空响应和“304 Not Modified”而不是“200 OK”.浏览器知道这一点,它直接从当地现金获取数据.因此,您的$.ajax请求将成功结束,您将获得当地现金的数据.
你可以将两种方式结合起来.只需设置一个非零值,而不是“max-age = 0”,这是当地现金有效期的秒数(见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3)