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?


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

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...
});

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
    }});

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


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


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


-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.


Ich denke nicht, dass Sie HTTP-Aktionen missbrauchen sollten. Einstellungen cache:falsevon Fall zu Fall sind der richtige Weg.
Tommybond
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.