2012-07-13 34 views
22

He configurado una aplicación y funciona de maravilla en Opera y Firefox, pero en Google Chrome almacena en caché la solicitud de AJAX y brinda datos obsoletos.Evite que Chrome guarde en caché las solicitudes de AJAX

http://gapps.qk.com.au es la aplicación. Cuando se ejecuta en Chrome, ni siquiera envía las solicitudes AJAX, pero cuando se prueba en otro navegador siempre realiza la solicitud AJAX y devuelve datos.

¿Hay algún método (Apache/PHP/HTML/JS) para evitar que Chrome realice este comportamiento?

La llamada AJAX:

function sendAjax(action,domain,idelement) { 

        //Create the variables 
       var xmlhttp, 
        tmp, 
        params = "action=" + action 
          + "&domain=" + encodeURIComponent(domain) 

        xmlhttp = new XMLHttpRequest(); 
       //Check to see if AJAX request has been sent 
       xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
         $('#'+idelement).html(xmlhttp.responseText); 
        } 
       }; 
       xmlhttp.open("GET", "ajax.php?"+params, true); 
       xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
       //console.log(params); 
       xmlhttp.send(params); 

      } 
sendAjax('gapps','example.com','gapps'); 
+0

¿Cuáles son los encabezados devueltos por su script PHP? Asegúrese de que no permitan el almacenamiento en caché y devuelva un tipo de contenido apropiado. – mariusnn

Respuesta

26

El caché del navegador se comporta de manera diferente en diferentes configuraciones. No debe depender de la configuración del usuario ni del navegador del usuario. Es posible hacer que el navegador también ignore los encabezados.

Existen dos formas de evitar el almacenamiento en caché.

-> Cambiar solicitud AJAX a POST. Los navegadores no almacenan en caché las solicitudes POST.

-> Better Way & buena manera: agregue un parámetro adicional a su solicitud con la marca de tiempo actual o cualquier otro número único.

params = "action=" + action 
     + "&domain=" + encodeURIComponent(domain) 
     + "&preventCache="+new Date(); 
+0

Estaba pensando en esto como una solución, pero pensé que era poco elegante, ¡bien, gracias! :) – Mattisdada

+1

Solo por información y tranquilidad. esta solución es utilizada por los principales frameworks cuando dices prevenirCache a llamar ajax, un ejemplo es DOJO. agregar un número en lugar de la fecha – gaurang171

+0

¿De verdad? Esto me parece un método "hacky", funciona (genial), pero hubiera pensado que habría un método mejor que ellos como la forma "oficial" de hacerlo. ¡Gracias de nuevo! :) – Mattisdada

11

Otra alternativa para la solución de Javascript es el uso de cabeceras personalizadas: En PHP que se vería así:

<?php 
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache 
    header("Pragma: no-cache");//Dont cache 
    header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill) 
?> 
+0

¿Funciona con todos los navegadores? Si es así, esto es ** mucho ** más elegante que el truco param de consulta ... – tjameson

+1

Sí, funciona con todos los navegadores :) – Mattisdada

0

A continuación línea de código trabajó para mí.

$.ajaxSetup({ cache: false }); 
Cuestiones relacionadas