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

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

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


当前回答

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

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

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

其他回答

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

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

基本上只需要添加cache:false;在ajax中,你认为内容会随着进程的进行而改变。在内容不会改变的地方,你可以省略这个。这样你每次都会得到新的响应

另一种方法是在生成ajax调用响应的代码中不提供来自服务器端的缓存头:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

参考文档: http://api.jquery.com/jquery.ajax/

你可以使用缓存属性:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});

对于那些在移动Safari上使用$. ajaxsetup()缓存选项的人来说,似乎必须为post使用时间戳,因为移动Safari也会缓存这个选项。根据$.ajax()的文档(你可以从$.ajaxSetup()跳转到该文档):

将cache设置为false将只对HEAD和GET请求有效。它通过将“_={timestamp}”附加到GET参数来工作。对于其他类型的请求,该参数不需要,除非在IE8中,当对一个已经被GET请求的URL进行POST时。

因此,单独设置这个选项在我上面提到的情况下是没有帮助的。