2012-01-12 7 views
63

jQuery.get() es una abreviatura de jQuery.ajax() con una llamada a recibir. Pero cuando establezco cache:false en los datos de la llamada .get(), lo que se envía al servidor es un parámetro denominado caché con un valor de falso. Si bien mi intención es enviar una marca de tiempo con los datos al servidor para evitar el almacenamiento en caché, que es lo que sucede si uso cache: false en datos jQuery.ajax. ¿Cómo puedo lograr esto sin tener que reescribir mi jQuery.get llama a jQuery.ajax llamadas o utilizando actualizaciónCómo configurar la memoria caché: falso en la llamada jQuery.get

$.ajaxSetup({ 
    // Disable caching of AJAX responses 
    cache: false 
}); 

: Gracias a todos por las respuestas. Estás todo correcto. Sin embargo, esperaba que hubiera una forma de que la llamada de get supiera que no desea caché, o envíe ese valor al .ajax subyacente() para que sepa qué hacer con él.

I a. en busca de una cuarta forma distinta de las tres formas que se han identificado hasta el momento:

  1. Hacerlo a nivel mundial a través de ajaxSetup

  2. Usando una llamada .ajax en lugar de una llamada .get

  3. Hágalo manualmente agregando un nuevo parámetro que contenga una marca de tiempo a su llamada .get.

Solo pensé que esta capacidad debería integrarse en la llamada .get.

+1

tenemos los 'get)' ejemplo completo (? – Jivings

+0

Me gusta pasar la fecha/hora de un archivo con la página (suponiendo que estoy usando un lenguaje de scripting del lado del servidor), y luego pasar eso con la solicitud de la página como un parámetro querystring. La razón por la que hago esto es porque permite el almacenamiento en caché, a menos que la página realmente haya cambiado. – Archer

+1

Uso de caché: falso agrega una marca de tiempo a la solicitud de ajax/json, p. {"get": "modified"} & _ = 1394836303603 que rompió mis solicitudes de API. Tomó demasiadas horas averiguar qué estaba agregando la marca de tiempo, ya que está enterrada en los documentos jQuery. En lugar de usar el caché: falso, solo agrega tu propia marca de tiempo, suponiendo que a tu API no le importará si agregas un parámetro desconocido. De esta manera: {"get": "modified", "timestamp": "1394836303603"} Esto también le permite tener un control más preciso sobre qué elementos se almacenan en la memoria caché y cuáles no. –

Respuesta

34

Para mí, la forma correcta de hacerlo sería las que figuran. O bien ajax o ajaxSetup. Si realmente desea utilizar get y no usar ajaxSetup, entonces puede crear su propio parámetro y darle el valor de la fecha/hora actual.

Sin embargo, cuestionaría sus motivos para no utilizar uno de los otros métodos.

+1

Merece la pena señalar que en mi aplicación particular, uso caché: falso en ajaxSetup (la mayoría de mis llamadas son para json puntos finales para cargas útiles) y luego uso $ .ajax (..., caché: verdadero) para cualquier plantilla específica o cosas que quiero almacenar en caché. Prefiero esto de todos modos, ya que hace que las cosas sean bastante explícitas, y llamo a más llamadas de carga que a datos estáticos. – David

80

Agregue el parámetro usted mismo.

$.get(url,{ "_": $.now() }, function(rdata){ 
    console.log(rdata); 
}); 

A partir de jQuery 3.0, ahora se puede hacer esto:

$.get({ 
    url: url, 
    cache: false 
}).then(function(rdata){ 
    console.log(rdata); 
}); 
+5

gracias $ .now() es la abreviatura de la nueva Fecha(). GetTime(). http://api.jquery.com/jQuery.now/ – Barka

+0

¡Agradable, funciona! :) – wooncherk

+0

Ahora también puede hacer 'Date.now()'. – Jivings

62

Yo creo que hay que utilizar el método AJAX lugar, que le permite activar el almacenamiento en caché fuera:

$.ajax({ 
    url: "test.html", 
    data: 'foo', 
    success: function(){ 
    alert('bar'); 
    }, 
    cache: false 
}); 
+2

IE9 se almacena en la caché y parece que realmente no le gusta .get – Ross

+4

@Ross No debería hacer si configura 'cache' como' false' según mi respuesta. – Jivings

+2

3 años más tarde y acabo de perder medio día exactamente el mismo problema – Joel

7

Según la documentación de JQuery, .get() solo toma el url, data (contenido), dataType y success devolución de llamada como sus parámetros. Lo que realmente estás buscando hacer aquí es modificar el objeto jqXHR antes de que se envíe. Con .ajax(), esto se hace con el método beforeSend(). Pero dado que .get() es un acceso directo, no lo permite.

Debería ser relativamente fácil cambiar sus llamadas .ajax() a .get() llamadas sin embargo. Después de todo, .get() es solo un subconjunto de .ajax(), por lo que probablemente pueda usar todos los valores predeterminados para .ajax() (excepto, por supuesto, para beforeSend()).

Editar:

:: Mira en respuesta Jivings' ::

Oh sí, se olvidó del parámetro cache! Mientras que beforeSend() es útil para agregar otros encabezados, el parámetro integrado cache es mucho más simple aquí.

+0

¡Voto a favor del esfuerzo y para encontrar una forma diferente! :) – Jivings

1

Llego muy tarde al juego, pero esto podría ayudar a otros. Llegué al mismo problema con $ .get y no quería apagar el almacenamiento en caché a ciegas y no me gustó el parche de marca de tiempo. Entonces, después de investigar un poco, descubrí que simplemente puede usar $ .post en lugar de $ .get que NO usa el almacenamiento en caché. Simple como eso. :)

+0

Llego tarde también :) gracias por tu contribución, está funcionando bien –

+0

Este es un mal consejo ya que GET y POST son verbos diferentes y deberían usarse para diferentes cosas. La misma url de servidor puede estar filtrando por verbo, por lo que un POST no funcionará si el servidor solo espera un GET. O lo que es peor, el servidor puede tener diferentes comportamientos para GET y POST (que en realidad es muy común). – Andrew

2

Conjunto caché: falsa en la llamada jQuery.get mediante el siguiente método

usar nueva Date().getTime(), que evitará colisiones a menos que tenga múltiples peticiones que suceden dentro del mismo milisegundo.

O

A continuación se evitará todas las futuras peticiones AJAX de ser cacheada, independientemente del método que utiliza jQuery ($ .get, $ .ajax, etc.)

$.ajaxSetup({ cache: false }); 
1

Nota que la sintaxis de devolución de llamada es deprecated:

Deprecation Aviso

Los métodos jqXHR.success(), jqXHR.error() y jqXHR.complete() de devolución de llamada introducidos en jQuery 1.5 están en desuso a partir de jQuery 1.8. Para prepare su código para su eventual eliminación, use jqXHR.done(), jqXHR.fail(), y jqXHR.always() en su lugar.

Aquí una solución modernizada mediante la interfaz promise

$.ajax({url: "...", cache: false}).done(function(data) { 
    // data contains result 
}).fail(function(err){ 
    // error 
}); 
Cuestiones relacionadas