So legen Sie den Cache fest: false im Aufruf von jQuery.get

75

jQuery.get()ist eine Abkürzung für jQuery.ajax()mit einem get call. Wenn ich jedoch cache:falsedie Daten des .get()Aufrufs einstelle , wird an den Server ein Parameter namens Cache mit dem Wert false gesendet. Während meine Absicht ist, einen Zeitstempel mit den Daten an den Server zu senden, um das Caching zu verhindern, was passiert, wenn ich cache: falsein jQuery.ajax-Daten verwende. Wie kann ich dies erreichen, ohne meine jQuery.get-Aufrufe in jQuery.ajax-Aufrufe umzuschreiben oder zu verwenden?

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

Update: Vielen Dank an alle für die Antworten. Sie sind alle richtig. Ich hatte jedoch gehofft, dass es eine Möglichkeit gibt, dem get-Aufruf mitzuteilen, dass Sie nicht zwischenspeichern möchten, oder diesen Wert an die zugrunde liegende .ajax () zu senden, damit er weiß, was damit zu tun ist.

Ich a. Suche nach einem anderen vierten Weg als den drei bisher identifizierten Wegen:

  1. Global über ajaxSetup

  2. Verwenden eines .ajax-Aufrufs anstelle eines .get-Aufrufs

  3. Führen Sie dies manuell aus, indem Sie Ihrem .get-Aufruf einen neuen Parameter hinzufügen, der einen Zeitstempel enthält.

Ich dachte nur, dass diese Funktion in den .get-Aufruf integriert werden sollte.

Barka
quelle
1
Das vollständige get()Beispiel zeigen?
Jivings
Ich möchte das Datum / die Uhrzeit einer Datei mit der Seite übergeben (vorausgesetzt, ich verwende eine serverseitige Skriptsprache) und diese dann mit der Anforderung für die Seite als Querystring-Parameter übergeben. Der Grund, warum ich das mache, ist, dass es das Caching erlaubt, es sei denn, die Seite hat sich tatsächlich geändert.
Stellen Sie Monica Cellio am
1
Verwenden des Cache: false hängt einen Zeitstempel an die Ajax / JSON-Anforderung an, z. B. {"get": "modifiziert"} & _ = 1394836303603, wodurch meine API-Anforderungen beschädigt wurden. Es hat viel zu viele Stunden gedauert, um herauszufinden, was den Zeitstempel hinzugefügt hat, da er in den jQuery-Dokumenten vergraben ist. Anstatt cache: false zu verwenden, fügen Sie einfach Ihren eigenen Zeitstempel hinzu, vorausgesetzt, Ihre API kümmert sich nicht darum, ob Sie einen unbekannten Parameter hinzufügen. So: {"get": "modifiziert", "Zeitstempel": "1394836303603"} Auf diese Weise können Sie auch genauer steuern, welche Elemente zwischengespeichert werden und welche nicht.
Jim Bergman
Warum möchten Sie $ .ajaxSetup nicht verwenden? Es ist unkompliziert und erledigt die Arbeit.
nützlichBee

Antworten:

36

Für mich wäre die richtige Vorgehensweise die aufgeführte. Entweder ajaxoder ajaxSetup. Wenn Sie wirklich verwenden getund nicht verwenden möchten, können ajaxSetupSie Ihren eigenen Parameter erstellen und ihm den Wert des aktuellen Datums / der aktuellen Uhrzeit geben.

Ich würde jedoch Ihre Motive in Frage stellen, keine der anderen Methoden anzuwenden.

James Montagne
quelle
1
Es ist erwähnenswert, dass ich in meiner speziellen App cache: false in ajaxSetup verwende (die meisten meiner Aufrufe beziehen sich auf json-Endpunkte für Nutzdaten) und dann $ .ajax (..., cache: true) für bestimmte Vorlagen oder Dinge verwende dass ich zwischengespeichert werden will. Ich bevorzuge dies sowieso, da es die Dinge ziemlich explizit macht und ich mehr Nutzlastaufrufe als statische Daten aufrufe.
David
106

Fügen Sie den Parameter selbst hinzu.

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

Ab jQuery 3.0 können Sie Folgendes tun:

$.get({
  url: url, 
  cache: false
}).then(function(rdata){
  console.log(rdata);
});
Kevin B.
quelle
6
danke $ .now () ist die Abkürzung für new Date (). getTime (). api.jquery.com/jQuery.now
Barka
Sie können jetzt auch tun Date.now().
Jivings
2
oder, da wir jquery haben, verwenden Sie einfach das, was wir haben. :)
Kevin B
1
Dies sollte die akzeptierte Antwort sein ... da das OP speziell nach$.get();
Serj Sagan
1
@SerjSagan Ich bin damit nicht einverstanden, da vor jQuery 3.0 die bessere Option wäre, $ .ajax zu verwenden. In 3.0 kann $ .get auch ein Optionsobjekt akzeptieren. :)
Kevin B
64

Ich denke, Sie müssen stattdessen die AJAX-Methode verwenden, mit der Sie das Caching deaktivieren können:

$.ajax({
  url: "test.html",
  data: 'foo',
  success: function(){
    alert('bar');
  },
  cache: false
});
Jivings
quelle
2
IE9 zwischenspeichert und scheint .get
Ross
4
@Ross Es sollte nicht tun , wenn Sie festgelegt , cacheum falsewie pro meine Antwort.
Jivings
2
3 Jahre später verlor ich nur einen halben Tag wegen genau des gleichen Problems
Joel
@ Joel Haha, froh, dass ich helfen konnte :)
Jivings
7

Per der JQuery Dokumentation, .get()nimmt nur den url, data(Inhalt), dataTypeund successCallback als Parameter. Was Sie hier wirklich tun möchten, ist, das jqXHR-Objekt zu ändern, bevor es gesendet wird. Mit .ajax()erfolgt dies mit der beforeSend()Methode. Da .get()es sich jedoch um eine Verknüpfung handelt, ist sie nicht zulässig.

Es sollte jedoch relativ einfach sein, Ihre .ajax()Anrufe auf .get()Anrufe umzustellen . Immerhin .get()handelt es sich nur um eine Teilmenge von .ajax(), sodass Sie wahrscheinlich alle Standardwerte für verwenden können .ajax()(außer natürlich für beforeSend()).

Bearbeiten:

:: Sieht sich Jivings 'Antwort an ::

Oh ja, den cacheParameter vergessen ! Während beforeSend()es nützlich ist, andere Header hinzuzufügen, ist der eingebaute cacheParameter hier viel einfacher.

Thomas Kelley
quelle
5

Setzen Sie den Cache: false im Aufruf von jQuery.get mit der Below-Methode

Verwenden Sie new Date().getTime(),, um Kollisionen zu vermeiden, es sei denn, Sie haben mehrere Anforderungen innerhalb derselben Millisekunde.

Oder

Im Folgenden wird verhindert, dass alle zukünftigen AJAX-Anforderungen zwischengespeichert werden, unabhängig davon, welche jQuery-Methode Sie verwenden ($ .get, $ .ajax usw.).

$.ajaxSetup({ cache: false });
Sangeet Shah
quelle
3

Beachten Sie, dass die Rückrufsyntax veraltet ist :

Verfallserklärung

Die in jQuery 1.5 eingeführten Rückrufmethoden jqXHR.success (), jqXHR.error () und jqXHR.complete () sind ab jQuery 1.8 veraltet. Verwenden Sie stattdessen jqXHR.done (), jqXHR.fail () und jqXHR.always (), um Ihren Code für das eventuelle Entfernen vorzubereiten.

Hier eine modernisierte Lösung über die promiseSchnittstelle

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

Ich bin sehr spät im Spiel, aber das könnte anderen helfen. Ich habe das gleiche Problem mit $ .get festgestellt und wollte das Caching nicht blind deaktivieren, und der Zeitstempel-Patch hat mir nicht gefallen. Nach ein wenig Recherche stellte ich fest, dass Sie einfach $ .post anstelle von $ .get verwenden können, das KEIN Caching verwendet. So einfach ist das. :) :)

RitchieD
quelle
Ich bin auch zu spät :) Danke für deinen Beitrag, es funktioniert gut
Angel M.
3
Dies ist ein schlechter Rat, da GET und POST unterschiedliche Verben sind und für unterschiedliche Zwecke verwendet werden sollten. Dieselbe Server-URL wird möglicherweise nach Verb gefiltert, sodass beispielsweise ein POST nicht funktioniert, wenn der Server nur ein GET erwartet. Oder noch schlimmer, der Server hat möglicherweise unterschiedliche Verhaltensweisen für GET und POST (was eigentlich sehr häufig ist).
Andrew