Wie setze ich den Cache für getJSON in jQuery auf false?

78

Ich verwende getJSON, um die Ergebnisse von der Serverseite abzurufen, habe aber Probleme mit dem Browser-Cache. Ich möchte, dass der Cache falsch ist. Ich habe versucht, dies kurz vor meinem getJSONAnruf zu verwenden.

 $.ajaxSetup({
                cache: false
            })

Aber ich bekomme nicht die erwarteten Ergebnisse. Es zeigt immer noch die alten Ergebnisse.

Ich habe auch einige andere Lösungen wie die Verwendung identifiziert, .ajaxaber ich möchte das wirklich nicht verwenden.

Abhinav
quelle

Antworten:

126

Ihr Code benötigt nur einen Auslöser, damit er aktiviert wird.

Auf diese Weise können Sie den Cache in allen zukünftigen Ajax deaktivieren

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

Ich hoffe es hilft :)

Bonesnatch
quelle
7
Dies setzt es global, was schlecht ist und andere Ajax-Aufrufe in Ihrem Programm beeinflussen kann, die zwischengespeichert werden müssen
vsync
@helloChris - hier ist eine gute Erklärung von jQuery: "Eine Seite kann nicht sicher bearbeitet werden, bis das Dokument" fertig "ist. jQuery erkennt diesen Bereitschaftszustand für Sie. Der in $ (document) .ready () enthaltene Code wird nur einmal ausgeführt Auf der Seite Document Object Model (DOM) kann JavaScript-Code ausgeführt werden. "
LESEN
7
@bonesnatch Der meiste jQuery-Code würde das brauchen, richtig, aber diese Einstellung hat nichts mit dem DOM zu tun. Das Dokument könnte sich in einem beliebigen Zustand befinden, wenn Sie diese Einstellung vornehmen, und es würde, soweit ich das beurteilen kann, keinen Unterschied machen. Es gibt keine Seitenmanipulation.
Chris Anderson
Warum braucht es einen Auslöser? Bitte erklären Sie, warum es nicht so funktioniert, wie es auf dem Originalplakat verwendet wurde.
Rune Jeppesen
2
Ästhetischer im Gebrauch; $ .ajaxSettings.cache = false;
Mustafa Çakıroğlu
83

Sie können entweder Folgendes verwenden, um den Cache global zu deaktivieren:

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

oder dass, anstatt $.getJSONden Cache nur für eine solche Anfrage zu deaktivieren:

$.ajax({
    cache: false,
    url: "/path/to.json",
    dataType: "json",
    success: function(data) {
        ...
    }
});
semente
quelle
49

Die Antworten von Semente und Bonesnatch sind korrekt, aber wenn Sie $ .getJSON und anderswo verwenden möchten, nutzen Sie das Caching (Sie möchten den Cache nicht für alle Aufrufe auf false setzen), sondern möchten den Cache nur für a sprengen Mit einem einzigen Aufruf können Sie einen Zeitstempel in die Dateneigenschaft $ .getJSON () einfügen. Durch Hinzufügen eines eindeutigen Werts zur Abfragezeichenfolge der Anforderung ist die Anforderung immer eindeutig und wird nicht vom Browser zwischengespeichert. Sie erhalten immer die neuesten Daten.

Lange Version:

var ts = new Date().getTime();
var data = {_: ts};
var url = '/some/path.json';

$.getJSON(url, data);

Alles in einer Version:

$.getJSON('/some/path', {_: new Date().getTime()});

Beides führt zu folgender Anfrage:

/some/path.json?_=1439315011130 

Dabei ist die Nummer am Ende der Zeitstempel für den Moment, in dem der Code aufgerufen wird, und ist daher immer eindeutig.

TriumphST
quelle
2
Ich würde mit Abstand die beste Lösung für das gestellte Problem sagen. Sie müssen Ihr Javascript nicht ändern, keine Änderung der globalen Konfiguration, nur ein einfacher zusätzlicher Parameter, der an die Funktion übergeben wird.
Chris
Dies ist keine Lösung, wenn Sie Azure CDN verwenden. Azure gibt zwischengespeicherte Objekte zurück, wenn Sie zusätzliche Parameter senden
Abgabe