如何在jQuery.get调用中设置cache:false

79

jQuery.get()是使用get请求的jQuery.ajax()的速记法。但当我在.get()调用的数据中设置cache:false时,发送到服务器的是一个名为cache且值为false的参数。而我的意图是将时间戳与数据一起发送到服务器以防止缓存,如果我在jQuery.ajax数据中使用cache: false,则会发生这种情况。如何在不重写我的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
我喜欢在页面中传递文件的日期/时间(假设我正在使用服务器端脚本语言),然后将其作为查询字符串参数随请求一起传递。我这样做的原因是它允许缓存,除非页面实际上已更改。 - Reinstate Monica Cellio
1
使用cache:false会在ajax/json请求中添加时间戳,例如:{"get":"modified"}&_=1394836303603。这破坏了我的API请求。花费了太多时间才弄清是什么添加了时间戳,因为它埋藏在jQuery文档中。不要使用cache:false,只需添加自己的时间戳,假设您的API不介意添加未知参数。像这样:{"get":"modified", "timestamp":"1394836303603"}这也让您更好地控制缓存哪些项以及哪些不缓存。 - Jim Bergman
为什么你不想使用$.ajaxSetup?它很简单直接,能够完成工作。 - usefulBee
7个回答

116

自行添加参数。

$.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()的简写形式。http://api.jquery.com/jQuery.now/ - Barka
2
现在你也可以使用 Date.now() - Jivings
Date.now() 只在 ECMA-262 第 5 版中标准化。为了支持旧版引擎,您可以使用以下代码进行 polyfill:(Date.now ? Date.now() : (new Date().valueOf())),参考链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now - Steven
2
或者,既然我们有jQuery,就用我们已经拥有的东西吧。 :) - Kevin B
1
这应该是被接受的答案...因为OP特别询问了$.get(); - Serj Sagan
1
@SerjSagan 我不同意这个观点,因为在 jQuery 3.0 之前,更好的选择是使用 $.ajax。在 3.0 中,$.get 也可以接受一个选项对象。 :) - Kevin B

64

我认为你需要使用 AJAX 方法,这样可以关闭缓存:

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

2
IE9缓存且似乎真的不喜欢.get。 - Ross
4
如果您按照我的答案将“cache”设置为“false”,那么它就不应该这样做。 - Jivings
2
三年后,我刚刚因为同样的问题浪费了半天时间。 - Joel
@Joel 哈哈,很高兴我能帮到你 :) - Jivings
六年之后,我因同样的问题浪费了半天时间... - Brian Stinar
8年后,我陷入了投票功能AJAX调用的困境,该功能依赖于FormData和JSON返回数据(这意味着我无法设置ContentType: false)。实际上,这两个选项都让我陷入了困境。 - WiiLF

37

在我看来,正确的做法应该是列出以下这些方法中的一个。要么使用 ajax,要么使用 ajaxSetup。如果您真的想使用 get 并且不想使用 ajaxSetup,那么您可以创建自己的参数并将其值设置为当前日期/时间。

然而,我会质疑您不使用其他方法的动机。


1
值得注意的是,在我的特定应用程序中,我在ajaxSetup中使用cache:false(我的大多数调用都是针对负载的json端点),然后我使用$.ajax(...,cache:true)来缓存任何特定的模板或我想要缓存的内容。无论如何,我更喜欢这种方式,因为它使事情变得非常明确,并且我调用的是更多的负载调用而不是静态数据。 - David

7
根据JQuery文档,.get()只接受urldata(内容)、dataTypesuccess回调函数作为参数。你真正想要做的是在发送之前修改jqXHR对象。使用.ajax()方法可以通过beforeSend()方法实现。但由于.get()是一种快捷方式,因此它不允许这样做。
不过,将.ajax()调用转换为.get()调用应该相对容易。毕竟,.get()只是.ajax()的子集,因此您可以使用.ajax()的所有默认值(当然,除了beforeSend())。 编辑: ::看着Jivings的答案::
哦,对了,忘记了cache参数!虽然beforeSend()可用于添加其他标头,但内置的cache参数在这里更简单。

5
在jQuery.get调用中使用cache: false选项,可以通过以下方式设置:

使用新的Date().getTime(),除非您在同一毫秒内有多个请求,否则它将避免冲突。

或者

以下将防止所有未来的AJAX请求被缓存,无论使用哪种jQuery方法($.get、$.ajax等):

$.ajaxSetup({ cache: false });

3
请注意,回调语法已被弃用:(参考链接)
以下是更新声明的内容:
自jQuery 1.8版开始,引入于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
});

现在是2023年,jQuery没有在官方版本中计划弃用此功能。如果你真的想领先于其他人,完全移除jQuery,并使用带有fetch/async/await方法的纯JS。 - WiiLF

2

虽然我来晚了,但这可能对其他人有所帮助。 我在使用$.get时遇到了同样的问题,我不想盲目地关闭缓存,也不喜欢时间戳修补程序。 因此,在进行了一些研究后,我发现您可以简单地使用$.post代替$.get,它不使用缓存。就这么简单。 :)


1
我也来晚了 :) 感谢您的贡献,它运行得很好。 - Angel M.
3
这是一条糟糕的建议,因为GET和POST是不同的动词,应该用于不同的事情。同一个服务器网址可能会根据动词进行过滤,因此,如果服务器只期望GET,则POST将无法正常工作。更糟糕的是,服务器可能会对GET和POST有不同的行为(这实际上非常普遍)。 - Andrew
@Andrew:如果不是jQuery Ajax一直存在选择首先使用get的缺陷,而这不是post和ajax的正确动词。因此,post是好的,也是正确的。 - hakre
我不确定我是否理解你的意思。如果你使用 get 而不是 post,那也是错误的。你应该根据端点的功能来决定 使用 get 还是 post,而不是使用 post 来解决 get 的缓存问题。 - Andrew

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