Si javascript modifica DOM en la página A, el usuario navega a la página B y luego presiona el botón Atrás para volver a la página A. Todas las modificaciones al DOM de la página A se pierden y se le presenta al usuario la versión que se recuperó originalmente del servidor.
Funciona de esa manera en stackoverflow, reddit y muchos otros sitios web populares. (intente agregar un comentario de prueba a esta pregunta, luego navegue a una página diferente y presione el botón Atrás para regresar; su comentario desaparecerá)
Esto tiene sentido, sin embargo, algunos sitios web (apple.com, basecamphq.com, etc.) de alguna manera están obligando al navegador a ofrecer al usuario el estado más reciente de la página. (vaya a http://www.apple.com/ca/search/?q=ipod , haga clic en el enlace de descargas en la parte superior y luego haga clic en el botón Atrás; se conservarán todas las actualizaciones de DOM)
¿De dónde viene la inconsistencia?
fuente
Respuestas:
Una respuesta: entre otras cosas, los eventos de descarga hacen que se invalide la caché de retroceso / avance .
Algunos navegadores almacenan el estado actual de toda la página web en el llamado "bfcache" o "caché de página". Esto les permite volver a renderizar la página muy rápidamente cuando navegan a través de los botones de retroceso y avance, y preserva el estado del DOM y todas las variables de JavaScript. Sin embargo, cuando una página contiene eventos de descarga, esos eventos podrían poner la página en un estado no funcional y, por lo tanto, la página no se almacena en bfcache y debe recargarse (pero puede cargarse desde la caché estándar) y volver a cargarla. renderizado desde cero, incluida la ejecución de todos los controladores de carga. Al volver a una página a través de bfcache, el DOM se mantiene en su estado anterior, sin necesidad de activar controladores de carga (porque la página ya está cargada).
Tenga en cuenta que el comportamiento de bfcache es diferente del caché del navegador estándar con respecto a Cache-Control y otros encabezados HTTP. En muchos casos, los navegadores almacenarán en caché una página en bfcache incluso si de otra manera no la almacenarían en el caché estándar.
jQuery adjunta automáticamente un evento de descarga a la ventana, por lo que, desafortunadamente, el uso de jQuery descalificará su página para que no se almacene en bfcache para la preservación del DOM y retroceso / avance rápido. [Actualización: esto se ha corregido en jQuery 1.4 para que solo se aplique a IE]fuente
He intentado que Chrome se comporte como lo hace Safari, y la única forma que he encontrado que funciona es configurar
Cache-control: no-store
los encabezados. Esto obliga al navegador a recuperar la página del servidor cuando el usuario presiona el botón Atrás. No es lo ideal, pero es mejor que se le muestre una página desactualizada.fuente
Facebook recuerda el estado de la página modificando el identificador de hash en la URL para las solicitudes ajax. Estos cambios se registran en el historial del navegador, por lo que cuando el usuario hace clic en el botón Atrás, el hash cambia a lo que era antes. Entonces, está implícito que necesitará algo de Javascript para monitorear el identificador de has y reaccionar cuando el navegador lo cambie. Andreas Blixt tiene disponible un script de monitoreo de hash .
fuente
Esto no tiene nada que ver con el símbolo de almohadilla (#).
Si revisa los encabezados HTTP de Apple, simplemente está almacenando la página en caché.
fuente
El uso del identificador de hash / fragmento de URL es una forma bastante común de enganchar / recordar el estado en una aplicación web que depende de las actualizaciones de Ajax y DOM.
Consulte el proyecto Really Simple History para obtener algunas ideas. Es posible monitorear la URL en busca de cambios en el hash, y rsh lo hace, teniendo en cuenta las diferencias del navegador.
fuente
Para cualquiera que
Rails
tenga problemas con y esto, su problema no es bfcache (pensé que lo era), es laturbolinks
joya. A continuación se explica cómo eliminarlo.Con suerte, esto le ahorrará algo de tiempo y le permitirá golpearse la cabeza contra la pared.
fuente
Lo que busca es algún tipo de gestión de hash de URL. El # en la URL es solo para el cliente.
Cuando cambia el estado de la espalda con JS, actualiza los datos en el # de la URL.
También agrega algún tipo de sondeo que monitorea si el hash ha cambiado y carga el estado de la página en función de los nuevos datos en el hash.
Mira esto:
http://ajaxpatterns.org/Unique_URLs
fuente