webkit - tactiles - no funciona el boton de retroceso de mi celular
PJAX: Problemas con el botón de retroceso. (2)
Algunos de nuestros enlaces están envueltos por PJAX. Cuando un usuario hace clic en un enlace PJAX, el servidor devuelve solo la parte requerida del HTML.
Si hago lo siguiente:
- Haga clic en el enlace PJAX
- Haga clic en el enlace simple
- Presione el botón de retroceso
El navegador mostrará el contenido que fue devuelto por la solicitud PJAX. El HTML se romperá porque es solo una parte del HTML que se mostrará (verifique esta pregunta ).
Hemos intentado solucionar este problema al no almacenar las respuestas PJAX (encabezado Cache-Control
). Esto solucionó nuestro problema pero generó otro problema: cuando el usuario presiona el botón Atrás, WebKit (Chrome 20.0) carga el contenido completo desde el servidor y, a continuación, popstate
evento popstate
que provoca una solicitud PJAX innecesaria.
¿Es posible recrear el comportamiento correcto del botón de retroceso?
Para que el navegador tenga conocimiento de las diferentes versiones de los recursos HTTP en función de los encabezados de solicitud, agregué un encabezado http Vary .
Con Vary, ya no es necesario enviar encabezados sin caché y, por lo tanto, volver a la página rápidamente.
En PHP esto se vería como:
header("Vary: X-PJAX");
Ya que a veces usamos 3 representaciones por URL (http, pjax y ajax) - porque migramos a un enfoque PJAX en una aplicación que ya está ajaxified - en realidad usamos:
header("Vary: X-PJAX,X-Requested-With");
En caso de que necesite compatibilidad con versiones anteriores de IE (más antiguas que IE9), debe asegurarse de que el encabezado de Vary sea eliminado por su servidor web, ya que otro IE antiguo deshabilitará el almacenamiento en caché de todos sus recursos, que proporcionan un encabezado de Vary.
Esto podría lograrse mediante la siguiente configuración en su configuración .htaccess / vhost:
BrowserMatch "MSIE" force-no-vary
Edición: error de Chrome subyacente, https://code.google.com/p/chromium/issues/detail?id=94369
Todo esto depende de la configuración de almacenamiento en caché del servidor. Su navegador almacena en caché la respuesta AJAX del servidor y, al hacer clic en el botón Atrás, utiliza la versión en caché.
Para evitar el almacenamiento en caché, establezca los siguientes encabezados en el servidor:
''Cache-Control'' => ''no-cache, no-store, max-age=0, must-revalidate''
''Pragma'' => ''no-cache''
Si está usando Rails, entonces definitivamente pruebe Wiselinks https://github.com/igor-alexandrov/wiselinks . Es una navaja suiza para la gestión del estado del navegador. Aquí hay algunos detalles: http://igor-alexandrov.github.io/blog/2013/07/11/the-way-to-wiselinks-1-dot-0/ .