看起来如果我使用$.get()
加载动态内容,结果会被浏览器缓存。
在查询字符串中添加一些随机字符串似乎可以解决此问题(我使用new Date().toString()
),但这感觉像是一个hack。
是否有其他方法可以实现这一点?
或者,如果唯一的方法是使用唯一字符串,除了new Date()
之外还有什么建议吗?
看起来如果我使用$.get()
加载动态内容,结果会被浏览器缓存。
在查询字符串中添加一些随机字符串似乎可以解决此问题(我使用new Date().toString()
),但这感觉像是一个hack。
是否有其他方法可以实现这一点?
或者,如果唯一的方法是使用唯一字符串,除了new Date()
之外还有什么建议吗?
对于没有JavaScript的用户,如果您使用非Ajax备份解决方案,您将不得不正确获取那些服务器端头部信息。虽然我理解有些人放弃了这个方法,但这并不是不可能的。
我相信在SO上有另一个问题会给出适当的完整标头集合。我并不完全相信miceus的回答覆盖了所有基础100%。
基本上只需在您认为内容会随着进度而改变的ajax中添加cache:false;
。而在内容不会改变的地方,您可以省略此选项。通过这种方式,您将每次都获得新的响应。
Internet Explorer的Ajax缓存:你会怎么做?提出了三种方法:
- 在查询字符串中添加一个缓存破坏令牌,比如?date=[timestamp]。在jQuery和YUI中,您可以告诉它们自动执行此操作。
- 使用POST而不是GET
- 发送一个HTTP响应头,明确禁止浏览器缓存它
$(function () {
var url = 'your url goes here';
$('#ajaxButton').click(function (e) {
$.ajax({
url: url,
data: {
test: 'value'
},
cache: true, //cache enabled, false to reverse
complete: doSomething
});
});
});
//ToDo after ajax call finishes
function doSomething(data) {
console.log(data);
}
});
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]
$.ajaxSetup({cache:false})
仅适用于GET和HEAD请求。你最好从服务器发送Cache-Control: no-cache
头文件。这样可以更清晰地分离关注点。当然,对于不属于项目的服务URL,这种方法不起作用。在这种情况下,你可以考虑通过服务器代码代理第三方服务,而不是从客户端代码调用它。如果您正在使用IE 9,则需要在控制器类定义前面使用以下内容:
[OutputCache(NoStore = true,Duration = 0,VaryByParam =“ *”)]
public class TestController:Controller
这将防止浏览器缓存。
有关详细信息,请参见此链接: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
实际上,这解决了我的问题。
添加头部
headers: {
'Cache-Control':'no-cache'
}
$.now()
代替每次都执行 (new Date().getTime())。 - epicwhale