Pregunta

Parece que si me carga el contenido dinámico utilizando $.get(), el resultado se almacena en caché en el navegador.

Agregando un poco de cadena aleatoria en la cadena de consulta parece resolver este problema (yo uso new Date().toString()), pero esto se siente como un truco.

¿Hay alguna otra manera de lograr esto? O bien, si de cadena único es la única manera de lograr esto, cualquier sugerencia que no sean new Date()?

¿Fue útil?

Solución

Yo uso new Date().getTime(), lo que evitará colisiones a menos que tenga múltiples peticiones que suceden dentro del mismo milisegundo:

$.get('/getdata?_=' + new Date().getTime(), function(data) {
    console.log(data); 
});

Editar Esta respuesta es varios años. Todavía funciona (por lo tanto no he borrado), pero hay mejores maneras / limpiador de lograr esto ahora . Mi preferencia es para este método , pero esta respuesta también es útil si desea desactivar el almacenamiento en caché para la solicitud de todos durante el tiempo de vida de una página.

Otros consejos

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

$.ajaxSetup({ cache: false });

$ .get de jQuery () en caché los resultados. En lugar de

$.get("myurl", myCallback)

se debe utilizar $ .ajax, lo que permitirá a su vez el almacenamiento en caché apagado:

$.ajax({url: "myurl", success: myCallback, cache: false});

Otra forma es proporcionar no hay cabeceras de caché de servidor en el código que genera la respuesta a la llamada AJAX:

response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "Expires", 0 );

Todas las respuestas aquí dejan una huella en la URL solicitada que se mostrará en los registros de acceso de servidor.

I necesitaba una solución basada cabecera con ningún efecto secundario y he encontrado que puede lograrse mediante la creación de los encabezados mencionados en ¿Cómo controlar el almacenamiento en caché página web, en todos los navegadores? .

El resultado, trabajando para Chrome, al menos, sería la siguiente:

$.ajax({
   url: url, 
   headers: {
     'Cache-Control': 'no-cache, no-store, must-revalidate', 
     'Pragma': 'no-cache', 
     'Expires': '0'
   }
});

En lo personal siento que el método de cadena de consulta es más fiable que tratar de establecer cabeceras en el servidor - no hay garantía de que un proxy o el navegador no sólo va a almacenar en caché de todas formas (algunos navegadores son peores que otros - nombrar a ningún nombre) .

Yo suelo usar Math.random() pero yo no veo nada malo en usar la fecha (que no debería estar haciendo AJAX pide lo suficientemente rápido para obtener el mismo valor dos veces).

Después de la documentación: http://api.jquery.com/jquery.ajax/

puede utilizar la propiedad con cache:

$.ajax({
    method: "GET",
    url: "/Home/AddProduct?",
    data: { param1: value1, param2: value2},
    cache: false,
    success: function (result) {
        // TODO
    }
});

Por supuesto, las técnicas de "caché" para romper conseguirá el trabajo hecho, pero esto no ocurriría en el primer lugar si el servidor indica al cliente que la respuesta no debe ser almacenado en caché. En algunos casos es beneficioso para las respuestas de caché, algunas veces no. Deje que el servidor de decidir el curso de la vida correcta de los datos. Es posible que desee cambiar más adelante. Mucho más fácil hacerlo desde el servidor que de muchos lugares diferentes en el código de interfaz de usuario.

Por supuesto, esto no ayuda si no tiene control sobre el servidor.

¿Qué pasa con el uso de una solicitud POST en lugar de un GET ...? (Que debe de todos modos ...)

La verdadera pregunta es por qué es necesario que esto no se almacenan en caché. Si no se debe almacenar en caché, ya que cambia todo el tiempo, el servidor debe especificar a no almacenar en caché el recurso. Si sólo cambia a veces (ya que uno de los recursos de los que depende puede cambiar), y si el código de cliente tiene una forma de saber de ello, se puede añadir un parámetro ficticio a la dirección URL que se calcula a partir de hachís o la última fecha de modificación de esos recursos (eso es lo que hacemos en recursos de script Microsoft Ajax para que puedan almacenar en caché para siempre, pero nuevas versiones todavía se pueden servir como aparecen). Si el cliente no puede saber de los cambios, la forma correcta debe ser para el servidor para manejar las solicitudes cabeza correctamente y decirle al cliente si desea utilizar la versión en caché o no. Me parece que añadiendo un parámetro aleatorio o contando desde el cliente al no caché está mal porque cacheability es una propiedad de los recursos del servidor, y así debe ser decidido en el servidor. Otra cuestión a preguntarse es si este recurso realmente se servirá a través de GET o debe ir a través de correos? Esa es una cuestión de semántica, pero también tiene implicaciones de seguridad (hay ataques que sólo funcionará si el servidor permite GET). El artículo no obtendrá en caché.

Tal vez usted debe buscar en .ajax $ () en su lugar (si está utilizando jQuery, que parece). Echar un vistazo a: http://docs.jquery.com/Ajax/jQuery.ajax #opciones y la opción de "caché".

Otro enfoque sería mirar cómo se hace una caché cosas en el lado del servidor.

Una pequeña adición a las excelentes respuestas dadas: Si usted está funcionando con una solución de copia de seguridad no ajax para los usuarios sin javascript, usted tendrá que obtener los encabezados del lado del servidor correcto de todos modos. Esto no es imposible, aunque entiendo los que renunciar a ella;)

Estoy seguro de que hay otra pregunta sobre el SO que le dará todo el conjunto de cabeceras que sean apropiados. No estoy del todo la respuesta miceus conviced cubre todas las bases 100%.

Para aquellos de ustedes usando la opción de cache $.ajaxSetup() en Safari móvil, parece que usted puede tener que utilizar una marca de tiempo para los puestos, ya que Safari móvil almacena en caché que también. De acuerdo con la documentación sobre $.ajax() (que será dirigido a partir de <=>):

  

Configuración de caché en false sólo funcionará correctamente con HEAD y peticiones GET. Funciona añadiendo "_ = {} marca de tiempo" para los parámetros GET. El parámetro no es necesario para otros tipos de solicitudes, excepto en IE8 cuando se hace un POST a una URL que ya ha sido solicitada por un GET.

De manera que cambiar esa opción solo no le ayudará en el caso que he mencionado anteriormente.

Básicamente, sólo añadir cache:false; en el Ajax, donde cree que el contenido va a cambiar a medida que el progreso continúe. Y el lugar donde el contenido no será el cambio no puede u omitir esta. De esta manera u conseguirá la nueva respuesta cada vez

almacenamiento en caché de Internet Explorer Ajax: ¿Qué vas a hacer al respecto? ? sugiere tres enfoques:

  
      
  1. Añadir un almacenamiento en memoria caché de contadores a la cadena de consulta, como? Date = [fecha y hora]. En YUI jQuery y se les puede decir que hacer esto de forma automática.
  2.   
  3. Uso de POST en lugar de un GET
  4.   
  5. Enviar un encabezado de respuesta HTTP que prohíbe específicamente para almacenar en caché de los navegadores que
  6.   

Ahora, es fácil de hacerlo mediante la activación / desactivación de la opción de caché en su petición Ajax, al igual que este

$(function () {
    var url = 'your url goes here';
    $('#ajaxButton').click(function (e) {
        $.ajax({
            url: url,
            data: {
                test: 'value'
            },
                cache: true, //cache enabled, false to reverse
                complete: doSomething
            });
        });
    });
    //ToDo after ajax call finishes
    function doSomething(data) {
        console.log(data);
    }
});

Si está utilizando Internet Explorer 9, entonces es necesario utilizar el siguiente frente a su definición de clase controlador:

[OutputCache (NoStore = true, Duración = 0, VaryByParam = "*")]

TestController clase pública: Controlador

Esto evitará que el navegador desde el almacenamiento en caché.

Los detalles sobre este enlace: http: //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

En realidad esto solucionó mi problema.

Como dijo @Athasach, de acuerdo con la documentación de jQuery, $.ajaxSetup({cache:false}) no funcionará para otra cosa que las peticiones GET y HEAD.

Lo mejor es enviar de regreso una cabecera Cache-Control: no-cache desde el servidor de todos modos. Se proporciona una separación más limpia de preocupaciones.

Por supuesto, esto no funcionaría para las direcciones URL de servicio que usted no pertenece a su proyecto. En ese caso, podría considerar hacer proxy del servicio de terceros de código de servidor en lugar de llamar desde el código cliente.

Si está utilizando .NET ASP MVC, deshabilite el almacenamiento en caché en la acción del controlador añadiendo el atributo siguiente en la función de punto final: [OutputCacheAttribute (VaryByParam = "*", Duración = 0, NoStore = true)]

añadir Math.random () para la solicitud de URL

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top