看起来,如果我使用$.get()加载动态内容,结果会缓存在浏览器中。

在QueryString中添加一些随机字符串似乎解决了这个问题(我使用new Date(). tostring()),但这感觉像是一个黑客。

还有别的办法吗? 或者,如果唯一字符串是实现这一点的唯一方法,除了new Date()还有其他建议吗?


当前回答

我个人觉得查询字符串方法比试图在服务器上设置头文件更可靠——不能保证代理或浏览器不会缓存它(有些浏览器比其他浏览器更差——没有命名)。

我通常使用Math.random(),但我不认为使用日期有任何错误(您不应该以足够快的速度执行AJAX请求来两次获得相同的值)。

其他回答

用POST请求代替GET请求怎么样? (无论如何你应该……)

我使用new Date().getTime(),这将避免冲突,除非你有多个请求发生在同一毫秒内:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

编辑:这个答案是几年前的了。它仍然可以工作(因此我没有删除它),但现在有更好/更干净的方法来实现这一点。我倾向于使用这种方法,但是如果您想在页面的生命周期内为每个请求禁用缓存,那么这个答案也很有用。

除了给出的优秀答案,还有一个小小的补充:如果您正在为没有javascript的用户运行非ajax备份解决方案,那么无论如何您都必须使服务器端头正确。这不是不可能的,尽管我理解那些放弃它的人;)

我相信还有另一个关于SO的问题会给你全套合适的标题。我不完全相信老鼠的回答涵盖了所有的基础100%。

如果你正在使用。net ASP MVC,通过在end point函数上添加以下属性禁用控制器动作上的缓存:

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]

正如@Athasach所说,根据jQuery文档,$. ajaxsetup ({cache:false})将不适用于GET和HEAD请求。

你最好从你的服务器发送回一个Cache-Control: no-cache头。它提供了更清晰的关注点分离。

当然,这对不属于项目的服务url不起作用。在这种情况下,您可以考虑从服务器代码代理第三方服务,而不是从客户端代码调用它。