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


275

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


1
使用POST而不是GET可以防止缓存。stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
如果您对AJAX使用POST请求,则YSlow和Chrome开发者工具会警告您-通常,除非您确实需要POST,否则GET应该是首选方法。
Pawel Krakowiak

Answers:


524

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

$.ajaxSetup({ cache: false });

发出请求时,会将时间戳添加到查询字符串。要关闭特定$.ajax()呼叫的缓存,请cache: false在本地对其进行设置,如下所示:

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

2
希望我以前会看到此全局设置项目。只是让我不必更新数十个个人电话。
James Skemp 2012年

2
我知道这是一个古老的答案,只是想知道这是否会影响所有的ajax调用(ajax,get和post)或仅影响特定的ajax调用?
笨拙的

6
@Lumpy,根据jQuery.ajax()文档cache: false仅适用于HEAD和GET请求。此外,如果您设置cache: false$.ajaxSetup,根据jQuery.ajaxSetup()的文件,它将“为未来的Ajax请求设置的默认值。” 因此,可以,它将为所有将来的HEAD和GET AJAX请求禁用缓存。
John Washam

11
请注意:在您的网址中添加“?_ = somenumber”。确保后端可以忽略URL查询参数中的“ _”。

4
为+1 cache: false。全局关闭缓存似乎有些过头,但是对每个请求进行控制是完美的。谢谢
Gone Coding 2014年

21

如果设置唯一参数,则缓存将不起作用,例如:

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

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

上面的ajaxSetup代码对我不起作用,没有花太多时间弄清楚原因。全局变量是错误的,有时您想缓存。我认为这个答案是最好的。
bladefist 2013年

@bladefist您似乎遇到了与我相同的问题。您是否知道除了更改数据以使IE停止缓存外,还有其他选择吗?我问的原因是因为我的请求实际上没有使用“数据”,并且所有数据都随URL一起传送。
badri

1
实际上,根据api.jquery.com/jquery.ajax 缓存中的此信息,这肯定是后台应该执行的缓存(默认值:true,对于dataType'script'和'jsonp',false)类型:Boolean如果设置设置为false,将强制浏览器不缓存请求的页面。注意:将缓存设置为false只能与HEAD和GET请求一起正常使用。它通过在GET参数后面附加“ _ = {timestamp}”来工作。
badri

@bladefist明确表示它将在GET参数上附加时间戳。所以想知道为什么Koss提供的代码对您有用,而禁用本地或全局缓存却没有呢?
badri

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

可以将这两个标头值组合在一起,以在IE和Firefox上获得所需的效果


12
问题是,不幸的是,IE并非总是会听到此消息:)
Nick Craver

1
@尼克,确定吗?我没有测试这个缓存控件。Jquery Ajax chache是​​否可以在所有浏览器上正常工作?

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”,缓存:false,成功:function(msg){$(“#popup”)。 html(msg);}});
SABU 2010年

我刚刚确认IE11会忽略此标头。Chrome也引发了CORS错误。
列宁


1

您可以这样定义它:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.