How to set cache: false in jQuery.get call
JqueryCachingJquery Problem Overview
jQuery.get()
is a shorthand for jQuery.ajax()
with a get call. But when I set cache:false
in the data of the .get()
call, what is sent to the server is a parameter called cache with a value of false. While my intention is to send a timestamp with the data to the server to prevent caching which is what happens if I use cache: false
in jQuery.ajax data. How do I accomplish this without rewriting my jQuery.get calls to jQuery.ajax calls or using
$.ajaxSetup({
// Disable caching of AJAX responses
cache: false
});
update: Thanks everyone for the answers. You are all correct. However, I was hoping that there was a way to let the get call know that you do not want to cache, or send that value to the underlying .ajax() so it would know what to do with it.
I a. looking for a fourth way other than the three ways that have been identified so far:
-
Doing it globally via ajaxSetup
-
Using a .ajax call instead of a .get call
-
Doing it manually by adding a new parameter holding a timestamp to your .get call.
I just thought that this capability should be built into the .get call.
Jquery Solutions
Solution 1 - Jquery
Add the parameter yourself.
$.get(url,{ "_": $.now() }, function(rdata){
console.log(rdata);
});
As of jQuery 3.0, you can now do this:
$.get({
url: url,
cache: false
}).then(function(rdata){
console.log(rdata);
});
Solution 2 - Jquery
I think you have to use the AJAX method instead which allows you to turn caching off:
$.ajax({
url: "test.html",
data: 'foo',
success: function(){
alert('bar');
},
cache: false
});
Solution 3 - Jquery
To me, the correct way of doing it would be the ones listed. Either ajax
or ajaxSetup
. If you really want to use get
and not use ajaxSetup
then you could create your own parameter and give it the value of the the current date/time.
I would however question your motives in not using one of the other methods.
Solution 4 - Jquery
Per the JQuery documentation, .get()
only takes the url
, data
(content), dataType
, and success
callback as its parameters. What you're really looking to do here is modify the jqXHR object before it gets sent. With .ajax()
, this is done with the beforeSend()
method. But since .get()
is a shortcut, it doesn't allow it.
It should be relatively easy to switch your .ajax()
calls to .get()
calls though. After all, .get()
is just a subset of .ajax()
, so you can probably use all the default values for .ajax()
(except, of course, for beforeSend()
).
Edit:
::Looks at Jivings' answer::
Oh yeah, forgot about the cache
parameter! While beforeSend()
is useful for adding other headers, the built-in cache
parameter is far simpler here.
Solution 5 - Jquery
Set cache: false in jQuery.get call using Below Method
use new Date().getTime(),
which will avoid collisions unless you have multiple requests happening within the same millisecond.
Or
The following will prevent all future AJAX requests from being cached, regardless of which jQuery method you use ($.get, $.ajax, etc.)
$.ajaxSetup({ cache: false });
Solution 6 - Jquery
Note that callback syntax is deprecated:
> Deprecation Notice > > The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callback > methods introduced in jQuery 1.5 are deprecated as of jQuery 1.8. To > prepare your code for their eventual removal, use jqXHR.done(), > jqXHR.fail(), and jqXHR.always() instead.
Here a modernized solution using the promise
interface
$.ajax({url: "...", cache: false}).done(function( data ) {
// data contains result
}).fail(function(err){
// error
});
Solution 7 - Jquery
I'm very late in the game, but this might help others. I hit this same problem with $.get and I didn't want to blindly turn off caching and I didn't like the timestamp patch. So after a little research I found that you can simply use $.post instead of $.get which does NOT use caching. Simple as that. :)