如何设置缓存:jQuery.get调用中为false


75

jQuery.get()jQuery.ajax()get呼叫的简写。但是,当我设置调用cache:false的数据时.get(),发送到服务器的是一个名为false的参数,称为cache。虽然我的意图是将带有数据的时间戳发送到服务器以防止缓存,但是如果我cache: false在jQuery.ajax数据中使用它,将会发生这种情况。我如何做到这一点而不重写我的jQuery.get调用到jQuery.ajax调用或使用

$.ajaxSetup({
    // Disable caching of AJAX responses
    cache: false
});

更新:谢谢大家的答案。你们都是正确的。但是,我希望有一种方法可以让get调用知道您不想缓存,或将该值发送到基础.ajax()以便知道如何处理。

我一个 寻找除目前已确定的三种方式以外的第四种方式:

  1. 通过ajaxSetup全局执行

  2. 使用.ajax呼叫而不是.get呼叫

  3. 手动执行此操作,方法是将一个带有时间戳的新参数添加到您的.get调用中。

我只是认为应该将此功能内置到.get调用中。


1
显示完整的get()例子?
Jivings 2012年

我喜欢将文件的日期/时间与页面一起传递(假设我使用的是服务器端脚本语言),然后将页面请求作为querystring参数传递给日期/时间。我这样做的原因是因为它允许缓存,除非页面实际已更改。
恢复莫妮卡·切里奥(Monica Cellio)2012年

1
使用cache:false会将时间戳添加到ajax / json请求,例如{“ get”:“ modified”}&_ = 1394836303603,这破坏了我的API请求。花费大量时间弄清楚是什么添加了时间戳,因为它被嵌入到jQuery文档中。代替使用cache:false,只需添加自己的时间戳即可,假设您的API不在乎是否添加未知参数。像这样:{“ get”:“ modified”,“ timestamp”:“ 1394836303603”}这也使您可以更好地控制哪些内容被缓存,哪些不被缓存。
Jim Bergman 2014年

为什么您不想使用$ .ajaxSetup?这很简单,可以完成工作。
有用的蜜蜂

Answers:


36

对我来说,正确的方法是列出的方法。无论是ajaxajaxSetup。如果您真的想使用get而不是使用ajaxSetup则可以创建自己的参数,并为其指定当前日期/时间的值。

但是,我会质疑您不使用其他方法之一的动机。


1
值得注意的是,在我的特定应用中,我在ajaxSetup中使用cache:false(我的大多数调用是对JSON端点进行有效负载),然后对任何特定模板或事物使用$ .ajax(...,cache:true)我要缓存的 无论如何,我还是更喜欢这种方式,因为它使事情变得很明确,而且与静态数据相比,我正在调用更多的有效负载调用。
大卫,

109

自己添加参数。

$.get(url,{ "_": $.now() }, function(rdata){
  console.log(rdata);
});

从jQuery 3.0开始,您现在可以执行以下操作:

$.get({
  url: url, 
  cache: false
}).then(function(rdata){
  console.log(rdata);
});

6
谢谢$ .now()是new Date()。getTime()的简写。api.jquery.com/jQuery.now
巴卡(Barka)

1
您现在也可以这样做Date.now()
Jivings

2
或者,由于我们拥有jquery,因此只需使用已有的功能即可。:)
凯文B

1
这应该是公认的答案...因为OP专门询问有关问题$.get();
Serj Sagan

1
@SerjSagan我不同意这一点,因为在jQuery 3.0之前,更好的选择是使用$ .ajax。在3.0中,$ .get也可以接受options对象。:)
Kevin B

64

我认为您必须改用AJAX方法,该方法允许您关闭缓存:

$.ajax({
  url: "test.html",
  data: 'foo',
  success: function(){
    alert('bar');
  },
  cache: false
});

2
IE9缓存,似乎真的不喜欢.get
罗斯,

4
@Ross如果您按照我的回答进行设置cache,则不应该这样做false
吉文斯,2012年

2
三年后,我只是失去了半天完全相同的问题
乔尔-

@Joel Haha,很高兴能为您提供帮助:)
Jivings

7

根据JQuery文档,.get()仅将urldata(内容)dataType,和success回调作为其参数。您真正要在这里做的是在发送jqXHR对象之前对其进行修改。使用.ajax(),这是通过beforeSend()方法完成的。但由于.get()是捷径,所以不允许这样做。

不过,.ajax().get()呼叫切换为呼叫应该相对容易。毕竟,.get()它只是的一个子集.ajax(),因此您可能可以使用的所有默认值.ajax()(当然,除了beforeSend())。

编辑:

::看吉文斯的答案::

哦,是的,忘记了cache参数!虽然beforeSend()对于添加其他标头很有用,但内置cache参数在这里要简单得多。


5

设置缓存:使用以下方法在jQuery.get调用中为false

使用newDate().getTime(),可以避免冲突,除非您在同一毫秒内发生多个请求。

要么

无论您使用哪种jQuery方法($ .get,$。ajax等),以下内容都将阻止所有以后的AJAX请求被缓存。

$.ajaxSetup({ cache: false });

3

请注意,不建议使用回调语法:

弃用通知

jQuery 1.5中不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调方法。要准备将其最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

这里是使用promise界面的现代化解决方案

$.ajax({url: "...", cache: false}).done(function( data ) {
    // data contains result
}).fail(function(err){
    // error
});

0

我在游戏中很晚,但这可能会对其他人有所帮助。我用$ .get遇到了同样的问题,我不想盲目地关闭缓存,而且我不喜欢时间戳补丁。因此,经过一些研究,我发现您可以简单地使用$ .post而不是不使用缓存的$ .get。就那么简单。:)


我也迟到了:)感谢您的贡献,它工作正常
Angel M.

3
这是一个不好的建议,因为GET和POST是不同的动词,应用于不同的事物。相同的服务器URL可能被动词过滤,例如,如果服务器仅期望GET,则POST将不起作用。甚至更糟的是,服务器对于GET和POST可能具有不同的行为(实际上非​​常常见)。
安德鲁
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.