Come impedire la memorizzazione nella cache di una richiesta Ajax jQuery in Internet Explorer?


275

Come posso impedire la memorizzazione nella cache di una richiesta jQuery Ajax in Internet Explorer?


1
L'uso di POST anziché GET impedisce la memorizzazione nella cache. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
Gli strumenti di sviluppo YSlow e Chrome ti avviseranno se utilizzi richieste POST per AJAX, in genere GET dovrebbe essere il metodo preferito a meno che tu non abbia realmente bisogno di POST.
Pawel Krakowiak,

Risposte:


524

È possibile disabilitare la memorizzazione nella cache a livello globale utilizzando $.ajaxSetup(), ad esempio:

$.ajaxSetup({ cache: false });

Ciò accoda un timestamp alla stringa di query quando si effettua la richiesta. Per disattivare la cache per una determinata $.ajax()chiamata, impostala cache: falselocalmente, in questo modo:

$.ajax({
  cache: false,
  //other options...
});

2
Vorrei aver visto prima questa voce di installazione globale. Mi ha appena salvato dal dover aggiornare dozzine di chiamate individuali.
James Skemp,

2
So che questa è una vecchia risposta, mi chiedo solo se questo influenzi tutte le chiamate ajax come (ajax, get e post) o solo chiamate ajax specifiche?
Lumpy,

6
@Lumpy, secondo la documentazione di jQuery.ajax () , cache: falsefunzionerà correttamente solo con le richieste HEAD e GET. Inoltre, se si imposta cache: falsenel $.ajaxSetupsecondo jQuery.ajaxSetup documentazione () , lo farà "impostare i valori predefiniti per le richieste future Ajax". Quindi sì, disabiliterà la cache per tutte le future richieste HEAD e GET AJAX.
John Washam,

11
Un avvertimento: questo aggiunge "? _ = Somenumber" al tuo URL. Assicurati che il tuo back-end possa ignorare "_" nei parametri di query dell'URL.

4
+1 per cache: false. Disattivare la cache a livello globale sembra eccessivo, ma avere il controllo per richiesta è perfetto. Grazie
Gone Coding

21

Se si impostano parametri univoci, la cache non funziona, ad esempio:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});

13
Questo è ciò che il cacheparametro fa già dietro le quinte.
Jose Rui Santos,

Il codice ajaxSetup sopra non ha funzionato per me, non ha impiegato molto tempo a capire perché. Le variabili globali sono errate e talvolta si desidera memorizzare nella cache. Questa risposta è la migliore secondo me.
pugnale

@bladefist sembra che tu abbia riscontrato lo stesso problema. Sai se ci sono altre opzioni oltre alla modifica dei dati per interrompere la memorizzazione nella cache di IE? Il motivo che sto chiedendo è perché le mie richieste in realtà non fanno uso di "dati" e tutti i dati vanno insieme all'URL.
badri,

1
In realtà, questo è sicuramente ciò che la cache dovrebbe fare dietro le quinte secondo queste informazioni da - api.jquery.com/jquery.ajax cache (default: true, false per dataType 'script' e 'jsonp') Tipo: Booleano Se impostato su false, forzerà le pagine richieste a non essere memorizzate nella cache dal browser. Nota: l'impostazione della cache su false funzionerà correttamente solo con le richieste HEAD e GET. Funziona aggiungendo "_ = {timestamp}" ai parametri GET.
badri,

@bladefist Dice chiaramente che aggiungerà una timestap ai parametri GET. quindi ti chiedi perché il codice fornito da Koss funziona per te e disabilitare la cache locale o globale no?
badri,

12
Cache-Control: no-cache, no-store

Questi due valori di intestazione possono essere combinati per ottenere l'effetto richiesto su IE e Firefox


12
Il problema è che IE non sempre ascolta questo, purtroppo :)
Nick Craver

1
@Nick, è sicuro? non ho testato questo Cache-Control. Jquery Ajax Chache funziona su tutti i browser?

7
Esso dovrebbe funzionare su tutti i browser, sì ... ma a volte IE piace solo per mettere in cache l'inferno di cose
Nick Craver

@Nick - Ho impostato la cache ajax su false, ma il messaggio di successo ajax non è arrivato in IE e anche in FF. Potete per favore verificare il mio codice? il mio codice è sbagliato? Grazie 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, esito positivo: funzione (msg) {$ ("# popup"). html (msg);}});
SABU,

Ho appena confermato che IE11 ignora questa intestazione. Chrome ha anche generato un errore CORS.
Lenin,


1

puoi definirlo così:

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; ?>,
            }
        }

o in questo modo:

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

spero che sia d'aiuto


-4

Questo è un vecchio post, ma se IE ti sta dando problemi. Cambia le tue richieste GET in POST e IE non le memorizzerà più nella cache.

Ho passato troppo tempo a capirlo nel modo più duro. Spero che sia d'aiuto.


Non penso che dovresti fare un uso improprio delle azioni HTTP. Le impostazioni cache:falsecaso per caso sono la strada da percorrere.
TommyBond,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.