如何防止jQuery Ajax请求在Internet Explorer中缓存?

280

如何在Internet Explorer中防止jQuery Ajax请求被缓存?


1
使用 POST 而不是 GET 可以防止缓存。 https://dev59.com/MG025IYBdhLWcg3wHR4Y - Prashant Gupta
8
YSlow和Chrome开发者工具会警告您,如果您在AJAX中使用POST请求,一般来说GET应该是首选的方法,除非您真的需要使用POST。 - Pawel Krakowiak
这是您的答案: 在IE中禁用缓存 - S.Mohamed Mahdi Ahmadian zadeh
6个回答

534

您可以使用$.ajaxSetup()来全局禁用缓存,例如:

$.ajaxSetup({ cache: false });

当发出请求时,这会在查询字符串中添加一个时间戳。要为特定的$.ajax()调用关闭缓存,请在本地设置cache: false,例如:

$.ajax({
  cache: false,
  //other options...
});

2
我知道这是一个旧答案,只是想知道这是否影响所有的ajax调用(ajax、get和post),还是只影响特定的ajax调用? - Lumpy
6
根据jQuery.ajax()文档cache: false只能在HEAD和GET请求中正确使用。另外,如果你在$.ajaxSetup中设置了cache: false,根据jQuery.ajaxSetup()文档,它将“为未来的Ajax请求设置默认值”。因此,是的,它会禁用所有未来的HEAD和GET AJAX请求的缓存。 - John Washam
11
注意事项:这会在您的URL中添加"?=somenumber"。请确保您的后端可以忽略URL查询参数中的""。 - user3458
4
对于 cache: false 给予 +1 的支持。全局禁用缓存似乎过于极端,但对每个请求进行控制则非常完美。谢谢。 - iCollect.it Ltd
2
我认为所有浏览器默认都不会缓存ajax。只有IE会这样做。这个答案真的帮了我大忙。该死的IE,总是要与众不同。 - Leeish
显示剩余5条评论

23

如果您设置了唯一的参数,那么缓存将不起作用,例如:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});

13
这就是cache参数在幕后已经执行的操作。 - Jose Rui Santos
上面的ajaxSetup代码对我没有起作用,没有花太多时间去弄清楚为什么。全局变量是不好的,有时你想要缓存。在我看来,这个答案是最好的。 - bladefist
@bladefist,你似乎遇到了和我一样的问题。除了更改数据以停止IE缓存之外,你知道是否还有其他选项吗?我问这个问题的原因是因为我的请求实际上并不使用“数据”,所有数据都随URL一起传输。 - badri
1
实际上,根据来自 http://api.jquery.com/jquery.ajax 的信息,这肯定是缓存应该在后台执行的操作。 缓存(Default: true, false for dataType 'script' and 'jsonp') 类型:布尔值 如果设置为false,则会强制浏览器不缓存请求的页面。注意:将cache设置为false仅对HEAD和GET请求有效。它通过将“_={timestamp}”附加到GET参数来工作。 - badri
@bladefist 明确表示它将在GET参数中附加时间戳。所以不知道为什么Koss提供的代码对您有效,而禁用本地或全局缓存却无效? - badri
如果您不使用参数,可以将唯一参数添加到URL中:$.ajax({url: "my_url?uniq_param="+ (new Date()).getTime()}); - Koss

13
Cache-Control: no-cache, no-store

这两个头部值可以结合使用,以在IE和Firefox上获得所需的效果


12
问题在于,不幸的是,IE并不总是会听从这个。 :) - Nick Craver
1
@Nick,确定吗?我没有测试过这个Cache-Control。Jquery Ajax缓存在所有浏览器上都有效吗? - user407283
7
是的,它“应该”在所有浏览器上都能正常工作......但有时IE倾向于过度缓存。 - Nick Craver
@Nick - 我将ajax缓存设置为false,但是在IE和FF中并没有成功获取ajax成功消息。你能否请验证一下我的代码?我的代码是有问题的吗?谢谢。 var ajaxfile = base+"index.php/msc/popup_view/"+obj+"/"+id+"/"+no_tab; $.ajax({type: "GET",url: ajaxfile, //contentType: "application/json; charset=utf-8", cache: false, success: function(msg){ $("#popup").html(msg); } }); - SABU
我刚刚确认IE11忽略了这个头部信息。Chrome也抛出了CORS错误。 - Lenin

6

13
这就是 cache 参数在幕后已经执行的操作。 - Jose Rui Santos

3
您可以这样定义它:
let table = $('.datatable-sales').DataTable({
        processing: true,
        responsive: true,
        serverSide: true,
        ajax: {
            url: "<?php echo site_url("your url"); ?>",
            cache: false,
            type: "POST",
            data: {
                <?php echo your api; ?>,
            }
        }

或者像这样:
$.get({url: <?php echo json_encode(site_url('your api'))?>, cache: false})

希望能够帮到您


-4

这是一篇旧文章,但如果IE浏览器给你带来了麻烦。将你的GET请求改为POST,IE就不会再缓存它们。

我花了太多时间才通过艰难的方式弄清楚这一点。希望能对你有所帮助。


我认为你不应该滥用HTTP动作。根据情况设置cache:false是正确的做法。 - tommybond

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