Wie kann verhindert werden, dass eine jQuery Ajax-Anforderung in Internet Explorer zwischengespeichert wird?

275

Wie verhindere ich, dass eine jQuery Ajax-Anforderung in Internet Explorer zwischengespeichert wird?

SABU
quelle
1
Die Verwendung von POST anstelle von GET verhindert das Caching. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta
8
Die Entwicklungstools von YSlow und Chrome warnen Sie, wenn Sie POST-Anforderungen für AJAX verwenden. Im Allgemeinen sollte GET die bevorzugte Methode sein, es sei denn, Sie müssen wirklich POST.
Pawel Krakowiak
Hier ist Ihre Antwort: Cache im IE deaktivieren
S.Mohamed Mahdi Ahmadian zadeh

Antworten:

524

Sie können das Caching global deaktivieren, indem Sie $.ajaxSetup()beispielsweise Folgendes verwenden :

$.ajaxSetup({ cache: false });

Dies hängt einen Zeitstempel an den Querystring an, wenn die Anforderung gestellt wird. Um den Cache für einen bestimmten $.ajax()Anruf zu deaktivieren, legen cache: falseSie ihn wie folgt lokal fest:

$.ajax({
  cache: false,
  //other options...
});
Nick Craver
quelle
2
Ich wünschte, ich hätte dieses globale Setup-Element schon einmal gesehen. Ich habe mich nur davor bewahrt, Dutzende einzelner Anrufe aktualisieren zu müssen.
James Skemp
2
Ich weiß, dass dies eine alte Antwort ist. Ich frage mich nur, ob dies alle Ajax-Anrufe (Ajax, Get and Post) oder nur bestimmte Ajax-Anrufe betrifft.
Klumpiger
6
@Lumpy nach jQuery.ajax () Dokumentation , cache: falsewird nur korrekt mit HEAD arbeiten und GET - Anfragen. Auch, wenn Sie setzen cache: falsein $.ajaxSetup, nach jQuery.ajaxSetup () Dokumentation , wird es „Standardwerte für die zukünftige Ajax - Anfragen.“ Ja, der Cache wird für alle zukünftigen HEAD- und GET AJAX-Anforderungen deaktiviert.
John Washam
11
Ein Wort der Vorsicht: Dies fügt Ihrer URL "? _ = Somenumber" hinzu. Stellen Sie sicher, dass Ihr Backend das "_" in den Abfrageparametern der URL ignorieren kann.
4
+1 für cache: false. Das globale Deaktivieren des Caching scheint übertrieben, aber die Kontrolle pro Anforderung ist perfekt. Danke
Gone Coding
21

Wenn Sie eindeutige Parameter festlegen, funktioniert der Cache nicht. Beispiel:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});
Koss
quelle
13
Das macht der cacheParameter bereits hinter den Kulissen.
Jose Rui Santos
Der obige ajaxSetup-Code funktionierte bei mir nicht und verbrachte nicht viel Zeit damit, herauszufinden, warum. Globale Variablen sind schlecht und manchmal möchten Sie zwischenspeichern. Diese Antwort ist meiner Meinung nach am besten.
Bladefist
@bladefist du scheinst das gleiche Problem wie ich getroffen zu haben. Wissen Sie, ob es neben dem Ändern von Daten noch andere Optionen gibt, damit der IE das Caching beendet? Der Grund, den ich frage, ist, dass meine Anfragen tatsächlich keine 'Daten' verwenden und alle Daten mit der URL übereinstimmen.
Badri
1
Dies ist sicherlich genau das, was der Cache hinter den Kulissen gemäß diesen Informationen aus dem Cache - api.jquery.com/jquery.ajax (Standard: true, false für Datentyp 'script' und 'jsonp') tun sollte. Typ: Boolean Wenn festgelegt Bei false wird erzwungen, dass angeforderte Seiten nicht vom Browser zwischengespeichert werden. Hinweis: Das Setzen des Caches auf false funktioniert nur bei HEAD- und GET-Anforderungen ordnungsgemäß. Es funktioniert, indem "_ = {Zeitstempel}" an die GET-Parameter angehängt wird.
Badri
@bladefist Es ist klar, dass ein Zeitstap an die GET-Parameter angehängt wird. Fragen Sie sich also, warum der von Koss bereitgestellte Code für Sie funktioniert und das Deaktivieren des lokalen oder globalen Caches nicht?
Badri
12
Cache-Control: no-cache, no-store

Diese beiden Header-Werte können kombiniert werden, um die erforderlichen Auswirkungen auf IE und Firefox zu erzielen

Zoltan Toth
quelle
12
Das Problem ist, dass IE dies leider nicht immer hört :)
Nick Craver
1
@ Nick, ist es sicher? Ich habe diese Cache-Steuerung nicht getestet. Funktioniert Jquery Ajax Chache in allen Browsern?
7
Es sollte auf allen Browsern funktionieren, ja ... aber manchmal mag IE es einfach, die Dinge
auszuspeichern
@Nick - Ich habe den Ajax-Cache auf false gesetzt. Die Ajax-Erfolgsmeldung wurde jedoch nicht im IE und auch in FF angezeigt. Können Sie bitte meinen Code überprüfen? Ist mein Code falsch? Danke var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", cache: false, success: function (msg) {$ ("# popup"). html (msg);}});
SABU
Ich habe gerade bestätigt, dass IE11 diesen Header ignoriert. Chrome warf ebenfalls einen CORS-Fehler.
Lenin
5

Hier ist ein Antwortvorschlag:

http://www.greenvilleweb.us/how-to-web-design/problem-with-ie-9-caching-ajax-get-request/

Die Idee ist, Ihrer Ajax-Abfrage einen Parameter hinzuzufügen, der beispielsweise das aktuelle Datum und die Uhrzeit enthält, damit der Browser ihn nicht zwischenspeichern kann.

Schauen Sie sich den Link an, er ist gut erklärt.

DRK
quelle
13
Das macht der cacheParameter bereits hinter den Kulissen.
Jose Rui Santos
1

Sie können es so definieren:

let table = $('.datatable-sales').DataTable({
        processing: true,
        responsive: true,
        serverSide: true,
        ajax: {
            url: "<?php echo site_url("your url"); ?>",
            cache: false,
            type: "POST",
            data: {
                <?php echo your api; ?>,
            }
        }

oder so:

$.get({url: <?php echo json_encode(site_url('your api'))?>, cache: false})

ich hoffe es hilft

Fajar A. R.
quelle
-4

Dies ist ein alter Beitrag, aber wenn der IE Ihnen Probleme bereitet. Wenn Sie Ihre GET-Anforderungen in POST ändern, werden sie vom IE nicht mehr zwischengespeichert.

Ich habe viel zu viel Zeit damit verbracht, dies auf die harte Tour herauszufinden. Ich hoffe es hilft.

Irgendein Typ
quelle
Ich denke nicht, dass Sie HTTP-Aktionen missbrauchen sollten. Einstellungen cache:falsevon Fall zu Fall sind der richtige Weg.
Tommybond