防止浏览器缓存AJAX调用结果

289

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

在查询字符串中添加一些随机字符串似乎可以解决此问题(我使用new Date().toString()),但这感觉像是一个hack。

是否有其他方法可以实现这一点? 或者,如果唯一的方法是使用唯一字符串,除了new Date()之外还有什么建议吗?


你可以使用简短的符号 $.now() 代替每次都执行 (new Date().getTime())。 - epicwhale
4
你是否考虑选另一个答案作为被采纳的答案? - M4N
21个回答

5
使用POST请求而不是GET请求怎么样……?(反正你也应该这么做……)

我认为那是一个更好的解决方案,但不幸的是,我(不知何故)只能进行GET请求。所以...现在只能用new Date().getTime()。 - Salamander2007
1
请在您的答案中添加一些解释,以便其他人可以从中学习 - 为什么需要POST请求? - Nico Haase

4
对于那些在移动Safari上使用$.ajaxSetup()选项中的cache的用户,似乎您需要对POST请求使用时间戳,因为移动Safari也会缓存它。 根据$.ajax()文档(您从$.ajaxSetup()被引用到的),将cache设置为false仅适用于HEAD和GET请求。 它通过将“_ ={timestamp}”附加到GET参数来工作。 对于其他类型的请求,该参数是不必要的,除非在IE8中进行POST,但已经通过GET请求了URL。 因此,在上述情况下,仅设置该选项是无效的。

3

对于没有JavaScript的用户,如果您使用非Ajax备份解决方案,您将不得不正确获取那些服务器端头部信息。虽然我理解有些人放弃了这个方法,但这并不是不可能的。

我相信在SO上有另一个问题会给出适当的完整标头集合。我并不完全相信miceus的回答覆盖了所有基础100%。


2

基本上只需在您认为内容会随着进度而改变的ajax中添加cache:false;。而在内容不会改变的地方,您可以省略此选项。通过这种方式,您将每次都获得新的响应。


2

Internet Explorer的Ajax缓存:你会怎么做?提出了三种方法:

  1. 在查询字符串中添加一个缓存破坏令牌,比如?date=[timestamp]。在jQuery和YUI中,您可以告诉它们自动执行此操作。
  2. 使用POST而不是GET
  3. 发送一个HTTP响应头,明确禁止浏览器缓存它

1
现在,通过在您的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);
    }
});

4
你已经连续6年回复跟Jonathan一样的内容? ಠ_ಠ - redent84
人们可以看出这个问题是在6年后发布的。而我的回答与任何其他人都不同,更不用说现在它是正确的了。回答这样的问题不是为了“提问者”,而是为了社区和初学者!无论如何,感谢您添加澄清! - El Don
1
你的代码和这个有什么不同?https://dev59.com/hnRC5IYBdhLWcg3wP-Zh#735084 - redent84
也许对于一个初学者来说,问这样的问题是很清晰的! - El Don

1
如果您正在使用 .NET ASP MVC,请在端点函数上添加以下属性以禁用控制器操作的缓存:
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]

你能进一步解释一下吗?那个数组与AJAX有什么关系? - Nico Haase
这不是一个数组,而是MVC控制器操作上的一个属性。attribute - Marius

1
根据jQuery文档,如@Athasach所述,$.ajaxSetup({cache:false})仅适用于GET和HEAD请求。你最好从服务器发送Cache-Control: no-cache头文件。这样可以更清晰地分离关注点。当然,对于不属于项目的服务URL,这种方法不起作用。在这种情况下,你可以考虑通过服务器代码代理第三方服务,而不是从客户端代码调用它。

0

0

添加头部

headers: {
                'Cache-Control':'no-cache'
            }

请在您的答案中添加一些解释,以便其他人可以从中学习 - 这样的标题应该添加在哪里? - Nico Haase

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