2012-02-25 17 views
6

Estoy utilizando la API de historial de 5 para guardar el estado cuando se producen solicitudes ajax y proporciono contenido html completo si el usuario solicita la misma página con ninguna solicitud ajax."Volver a abrir la última pestaña cerrada" que muestra el último contenido de la solicitud ajax

La característica "Volver a abrir la última pestaña cerrada" del navegador trae el último contenido de la solicitud ajax sin tocar el servidor. Si el navegador solicitara sin traer el último contenido solicitado, todo funcionaría sin problemas. Pero el navegador solo muestra el último contenido de solicitud ajax.

Me han experimentado esto en Chrome 17, Firefox 10. (no he probado en IE9 porque no tiene soporte para la API historia)

Qué es la solución conocida para este problema?

Editar: Estas solicitudes ajax son simplemente "obtener" solicitud al servidor.

Realmente no es posible demostrarlo en jsfiddle.net porque pocos motivos. Puede demostrarlo en su servidor local como se muestra a continuación.

Realice la solicitud "get" al servidor y extraiga los objetos json, luego inserte esa url en la API de historial como se muestra a continuación.

history.pushState(null,null,url); 

A continuación, cierre esa pestaña y haga clic en la función "Volver a abrir la última pestaña cerrada" de su navegador. Que ves ? ¿Cuerpo de respuesta de Json? El navegador lo muestra sin hacer solicitud al servidor, ¿verdad?

+0

Cualquier persona tiene una idea? – Freshblood

+1

¿Puedes publicar algún código, o un enlace a una página que demuestre el problema? – robertc

+0

@robertc Actualicé la pregunta y proporcioné información de demostración. – Freshblood

Respuesta

4

El problema estaba causando por los encabezados de respuesta http. Los encabezados contenían información almacenable en caché para las solicitudes de ajax, de modo que el navegador mostraba ese contenido de url desde la memoria caché sin llegar a la base de datos.

Después de eliminar los parámetros de caché de los encabezados de respuesta, el navegador pudo acceder al servidor sin traer contenido de la memoria caché.

0

Todo depende de qué navegador está utilizando y qué optimizaciones están habilitadas.

Google Chrome, por ejemplo, mantendrá la página en la memoria, de modo que cuando devuelva el mensaje y vaya a un sitio nuevo, o cuando vuelva a abrir la pestaña cerrada, restaurará la página de la memoria.

Los navegadores antiguos/lentos simplemente actualizarán cualquier cosa.

Aunque esto no debería ser realmente un problema, ya que su estado de javascript debería restaurarse también, debería ser exactamente igual en todos los sentidos cuando vuelven a abrir esa página.

+0

Estoy usando la última versión de Chrome y Firefox sin modificar ninguna configuración. ¿No debería haber un problema? El usuario ve por última vez el último contenido de la solicitud ajax que es json. No puedo mostrarle el último estado de la página. Estoy usando sammy js para lograr esto. – Freshblood

1

Cuando vuelve a abrir una pestaña cerrada, el navegador puede reutilizar los datos de la memoria caché para que la URL especificada llene la ventana. Dado que los datos en caché provienen de la respuesta de solicitud ajax, eso es lo que usa, y usted ve el JSON.

Por lo tanto, esto lleva a la pregunta: ¿Por qué el navegador no usó el HTML de la memoria caché al satisfacer la solicitud de AJAX? Los navegadores usan reglas diferentes para determinar si usan el contenido almacenado en caché según lo que estén haciendo. En este caso, parece que Chrome se complace en volver a utilizarlo al restaurar la pestaña recientemente cerrada, y no cuando hace la solicitud de AJAX.

Puede corregirlo diciendo al navegador nunca almacenar en caché la respuesta. Si eso es deseable depende de su caso de uso.

Por ejemplo, la inserción de éstos en la parte superior de su archivo (después de la etiqueta de apertura <?php, por supuesto) lo hace no sucede para mí:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
header("Cache-Control: post-check=0, pre-check=0", false); 
header("Pragma: no-cache"); 
Cuestiones relacionadas