2010-06-02 12 views
8

Me pregunto si es posible borrar la caché de un método AJAX en particular.¿Puedes borrar jquery ajax cache?

Decir que tengo esto:

$.ajax({ 
    url: "test.html", 
    cache: true, 
    success: function(html){ 
    $("#results").append(html); 
    } 
}); 

Ahora el 99% de las veces, el resultado almacenado en caché se puede utilizar ya que siempre debe tener el mismo contenido. Sin embargo, si un usuario actualiza este contenido, (por supuesto) cambia. Si está en caché, aún mostraría el contenido anterior.

Por lo tanto, sería genial si pudiera elegir este caché para este método y limpiarlo y todas las demás cosas almacenadas en caché se mantendrían.

¿Se puede hacer esto?

Editar

no sigo. Veo que si establece cache en falso, crea una URL única para evitar que el navegador lo guarde en caché.

Mi problema es que quiero que se guarde en caché hasta que alguien lo actualice. Entonces no debería almacenarse en caché hasta que vuelvan a hacer clic en él. Entonces debe ser almacenado en caché de nuevo.

Básicamente, tengo un cuadro de diálogo de modelo de actualización (jquery UI) que muestra un formulario de actualización para que los usuarios puedan actualizar una fila de la tabla. Cuando hacen clic en "Actualizar", actualiza esa fila de la tabla. Ahora, una columna puede tener, como un par de párrafos, datos valiosos y hace que la tabla se vea mal.

Para preservar la tabla, tengo en su lugar un enlace llamado "Mostrar datos". Ahora, cuando se hace clic en este, aparece un cuadro de modelo de diálogo y los datos se extraen del servidor.

Si lo presionan 5 veces, se vuelve a cargar 5 veces. Es por eso que quiero guardarlo en caché. Sin embargo, si hacen clic en él y se almacena en caché, por cualquier razón que vayan y actualicen esa fila y hagan clic en "Mostrar datos", obtendrán la versión en caché, no la versión actualizada.

Probablemente podría ocultar todos los párrafos y mostrarlos en voluntad utilizando jquery, pero preferiría tenerlo a pedido. De lo contrario, habrá tanta basura oculta y se ralentizará la página (imagine que un tipo tiene 50 filas y cada una de esas columnas tiene 1000 caracteres).

Respuesta

10

Está mal entendiendo el parámetro predeterminado cache: true de $.ajax. En la documentación, se encuentra lo siguiente:

Si se pone a falso que obligará a los páginas que solicita a no ser en caché por el navegador.

para entender lo que realmente hace este parámetro, usted debe buscar en el código fuente de jQuery:

if (s.cache === false && type === "GET") { 
    var ts = now(); 

    // try replacing _= if it is there 
    var ret = s.url.replace(rts, "$1_=" + ts + "$2"); 

    // if nothing was replaced, add timestamp to the end 
    s.url = ret + ((ret === s.url) ? 
      (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); 
} 

tanto, si utiliza cache: false, jQuery sólo añade un parámetro adicional a la URL con la hora actual. Luego, el navegador ve una URL diferente y decide que no tiene datos en su caché con esa URL, por lo que reenvía la solicitud al servidor. Nada mas.

ACTUALIZADO basado en la parte editada de la pregunta: Si lo entiendo correctamente, desea utilizar el caché local del navegador, pero desea controlarlo. Si es así, debe usar el valor predeterminado de cache: true (no agregue este parámetro en el $.ajax). En lugar de depender de la opción $.ajax(), debe agregar información de almacenamiento en caché adicional a la respuesta del servidor. Los navegadores siempre seguirán explícitamente las instrucciones de almacenamiento en caché, ya que están escritas en el encabezado de página correspondiente.

Así, por ejemplo, puede agregar un tiempo al encabezado de respuesta especificando cuánto tiempo es válida la página. Es muy eficaz si no necesita la última versión absoluta de los datos en el cliente (consulte http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html).

Otra forma, que yo uso en la mayoría de mis aplicaciones, es añadir lo siguiente a las cabeceras de respuesta del servidor

  1. "Cache-Control" en "max-age = 0", que desconecta caché local
  2. "Etag" con algún valor (por ejemplo, un hash MD5 de los datos enviados) para identificar qué datos contienen. El valor es absolutamente gratuito, puedes calcularlo como quieras, pero dos respuestas diferentes deben tener diferentes valores de "Etag".

Este método es muy bueno para contenidos dinámicos (por ejemplo, para una respuesta basada en los datos de la base de datos) si siempre quiere tener la última versión de los datos, pero no desea que el servidor envíe los datos nuevamente si no ha cambiado desde la última respuesta. Si sigue este método, el navegador (todos los navegadores) agregará al encabezado de los datos que se envían al servidor al segundo clic en el botón "Mostrar datos" el valor "Etag" del local cobrado dentro del encabezado de solicitud HTTP "If-None-Match". Entonces el servidor puede definir si los datos se cambian. De lo contrario, el servidor puede responder con una respuesta vacía y "304 Not Modified" en lugar de "200 OK". El navegador lo sabe y obtiene los datos directamente del efectivo local. Por lo tanto, su solicitud $.ajax finalizará exitosamente y tendrá los datos del efectivo local.

Puede combinar causas de dos maneras. Solo configure en lugar de "max-age = 0" algún valor distinto de cero que es el tiempo en segundos de la validez del efectivo local (consulte http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3)

+0

Consulte Editar ....... – chobo2

+0

Lo siento, no lo hago Entiendo qué quiere decir con "Ver Editar .......". – Oleg

+0

Acabo de editar mi publicación. Lo siento tomó un par de minutos más de lo esperado. – chobo2