看起来,如果我使用$.get()加载动态内容,结果会缓存在浏览器中。
在QueryString中添加一些随机字符串似乎解决了这个问题(我使用new Date(). tostring()),但这感觉像是一个黑客。
还有别的办法吗? 或者,如果唯一字符串是实现这一点的唯一方法,除了new Date()还有其他建议吗?
看起来,如果我使用$.get()加载动态内容,结果会缓存在浏览器中。
在QueryString中添加一些随机字符串似乎解决了这个问题(我使用new Date(). tostring()),但这感觉像是一个黑客。
还有别的办法吗? 或者,如果唯一字符串是实现这一点的唯一方法,除了new Date()还有其他建议吗?
当前回答
另一种方法是在生成ajax调用响应的代码中不提供来自服务器端的缓存头:
response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );
其他回答
我使用new Date().getTime(),这将避免冲突,除非你有多个请求发生在同一毫秒内:
$.get('/getdata?_=' + new Date().getTime(), function(data) {
console.log(data);
});
编辑:这个答案是几年前的了。它仍然可以工作(因此我没有删除它),但现在有更好/更干净的方法来实现这一点。我倾向于使用这种方法,但是如果您想在页面的生命周期内为每个请求禁用缓存,那么这个答案也很有用。
我个人觉得查询字符串方法比试图在服务器上设置头文件更可靠——不能保证代理或浏览器不会缓存它(有些浏览器比其他浏览器更差——没有命名)。
我通常使用Math.random(),但我不认为使用日期有任何错误(您不应该以足够快的速度执行AJAX请求来两次获得相同的值)。
用POST请求代替GET请求怎么样? (无论如何你应该……)
如果你正在使用ie9,那么你需要在你的控制器类定义前使用以下代码:
[OutputCache(NoStore = true, duration = 0, VaryByParam = “*”)]
公共类TestController:控制器
这将阻止浏览器缓存。
有关此连结的详情: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
实际上这解决了我的问题。
现在,通过在ajax请求中启用/禁用缓存选项很容易做到这一点,就像这样
$(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);
}
});