¿Cómo configurar el caché falso para getJSON en jQuery?

80

Estoy usando getJSONpara obtener los resultados del lado del servidor, pero tengo problemas de caché del navegador. Quiero que el caché sea falso. Intenté usar esto justo antes de mi getJSONllamada.

 $.ajaxSetup({
                cache: false
            })

Pero no obtengo los resultados esperados. Todavía muestra los resultados anteriores.

También identifiqué algunas otras soluciones, como usar, .ajaxpero realmente no quiero usar eso.

Abhinav
fuente

Respuestas:

128

Su código solo necesita un disparador para que esté habilitado.

Esto le permitirá deshabilitar el caché en todos los futuros ajax

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

Espero eso ayude :)

arrancar huesos
fuente
7
Esto lo configura globalmente, lo cual es malo y puede afectar otras llamadas ajax en su programa que necesitan almacenamiento en caché
vsync
@helloChris: aquí hay una buena explicación de jQuery "Una página no se puede manipular de forma segura hasta que el documento esté" listo ". jQuery detecta este estado de preparación para usted. El código incluido dentro de $ (document) .ready () solo se ejecutará una vez la página Document Object Model (DOM) está lista para que se ejecute el código JavaScript ". LEER MÁS SOBRE LA API
Bonesnatch
7
@bonesnatch La mayoría del código de jQuery necesitaría eso, cierto, pero esa configuración no tiene nada que ver con el DOM. El documento podría estar en cualquier estado cuando establezca esa configuración y, por lo que yo sé, no haría ninguna diferencia. No hay manipulación de páginas.
chris
¿Por qué necesita un disparador? Por favor, explique por qué no funciona de la forma en que lo usó el póster original.
Rune Jeppesen
2
Manera más estética en el uso; $ .ajaxSettings.cache = falso;
Mustafa Çakıroğlu
83

Puede usar esto, que deshabilitará el caché globalmente:

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

o que, en lugar de $.getJSON, deshabilitar el caché solo para tal solicitud:

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

las respuestas de semente y bonesnatch son correctas, pero si desea usar $ .getJSON y en otro lugar, aproveche su almacenamiento en caché (no desea configurar el caché en falso para todas las llamadas), pero desea romper el caché solo por un llamada única, puede inyectar una marca de tiempo en la propiedad de datos de $ .getJSON (). Al agregar un valor único a la cadena de consulta de la solicitud, la solicitud siempre será única y el navegador no la almacenará en caché; siempre obtendrá los datos más recientes.

Versión larga:

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

$.getJSON(url, data);

Todo en una versión:

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

Ambos dan como resultado la siguiente solicitud:

/some/path.json?_=1439315011130 

donde el número al final es la marca de tiempo para el momento en que se llama al código y, por lo tanto, siempre será único.

TriumphST
fuente
2
Yo diría de lejos la mejor solución al problema planteado. No necesita cambiar su javascript, no cambiar la configuración global, solo un simple parámetro adicional para pasar a la función.
Chris
No es una solución si usa Azure CDN. Azure devuelve un objeto en caché si envía un parámetro adicional
levye