¿Cómo evitar que una solicitud jQuery Ajax se almacene en caché en Internet Explorer?

275

¿Cómo evito que una solicitud jQuery Ajax se almacene en caché en Internet Explorer?

SABU
fuente
1
El uso de POST en lugar de GET evita el almacenamiento en caché. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta
8
Las herramientas de desarrollo de YSlow y Chrome le avisarán si usa solicitudes POST para AJAX; en general, GET debería ser el método preferido a menos que realmente necesite POST.
Pawel Krakowiak
Aquí está su respuesta: deshabilite la caché en IE
S.Mohamed Mahdi Ahmadian zadeh

Respuestas:

524

Puede deshabilitar el almacenamiento en caché globalmente $.ajaxSetup(), por ejemplo:

$.ajaxSetup({ cache: false });

Esto agrega una marca de tiempo a la cadena de consulta al realizar la solicitud. Para desactivar el caché para una $.ajax()llamada en particular , configúrelo cache: falselocalmente, así:

$.ajax({
  cache: false,
  //other options...
});
Nick Craver
fuente
2
Ojalá hubiera visto este elemento de configuración global antes. Simplemente me salvó de tener que actualizar docenas de llamadas individuales.
James Skemp
2
Sé que esta es una respuesta anterior, solo me pregunto si esto afecta a todas las llamadas ajax como (ajax, get y post) o solo a llamadas específicas de ajax.
Abultado
66
@Lumpy, de acuerdo con la documentación de jQuery.ajax () , cache: falsesolo funcionará correctamente con las solicitudes HEAD y GET. Además, si se establece cache: falseen $.ajaxSetup, según jQuery.ajaxSetup documentación () , lo hará "valores predeterminados para futuras peticiones Ajax". Entonces sí, deshabilitará el caché para todas las futuras solicitudes HEAD y GET AJAX.
John Washam
11
Una advertencia: esto agrega "? _ = Somenumber" a su URL. Asegúrese de que su back-end pueda ignorar el "_" en los parámetros de consulta de la URL.
44
+1 para cache: false. Desactivar el almacenamiento en caché a nivel mundial parece excesivo, pero tener control por solicitud es perfecto. Gracias
Gone Coding
21

Si establece parámetros únicos, entonces el caché no funciona, por ejemplo:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});
Koss
fuente
13
Eso es lo que el cacheparámetro ya hace detrás de escena.
Jose Rui Santos
El código ajaxSetup de arriba no funcionó para mí, no pasó mucho tiempo descubriendo por qué. Las variables globales son malas, y a veces quieres almacenar en caché. Esta respuesta es la mejor en mi opinión.
bladefist
@bladefist parece que has tenido el mismo problema que yo. ¿Sabes si hay otras opciones además de cambiar los datos para que IE deje de almacenar en caché? La razón por la que pregunto es porque mis solicitudes en realidad no utilizan 'datos' y todos los datos van junto con la URL.
badri
1
En realidad, esto es seguramente lo que la memoria caché debe hacer detrás de escena según esta información de: api.jquery.com/jquery.ajax caché (predeterminado: verdadero, falso para dataType 'script' y 'jsonp') Tipo: booleano Si está configurado falso, obligará a las páginas solicitadas a no ser almacenadas en caché por el navegador. Nota: Establecer caché en falso solo funcionará correctamente con solicitudes HEAD y GET. Funciona agregando "_ = {marca de tiempo}" a los parámetros GET.
badri
@bladefist Dice claramente que agregará una marca de tiempo a los parámetros GET. así que me pregunto por qué el código provisto por Koss funciona para usted y deshabilitar la caché local o global no.
badri
12
Cache-Control: no-cache, no-store

Estos dos valores de encabezado se pueden combinar para obtener el efecto requerido en IE y Firefox

Zoltan Toth
fuente
12
El problema es que IE no siempre escucha esto, desafortunadamente :)
Nick Craver
1
@ Nick, ¿está seguro? No probé este control de caché. ¿Jquery Ajax chache funciona en todos los navegadores?
77
Se debe trabajar en todos los navegadores, sí ... pero a veces simplemente le gusta IE para almacenar en caché el infierno de cosas
Nick Craver
@Nick: configuré el caché de ajax en falso, pero el mensaje de éxito de ajax no llegó en IE y tampoco en FF. ¿Pueden verificar mi código? ¿Mi código está mal? Gracias 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 (mensaje);}});
SABU
Acabo de confirmar que IE11 ignora este encabezado. Chrome también arrojó un error CORS.
Lenin
1

puedes definirlo así:

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 así :

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

Espero eso ayude

Fajar A. R
fuente
-4

Esta es una publicación antigua, pero si IE te está dando problemas. Cambie sus solicitudes GET a POST e IE ya no las almacenará en caché.

Pasé demasiado tiempo resolviendo esto de la manera difícil. Espero eso ayude.

Algún chico
fuente
No creo que debas usar mal las acciones HTTP. La configuración cache:falsecaso por caso es el camino a seguir.
tommybond