tl; dr - Safari en iOS 5 está almacenado en caché tan duro que está destruyendo mi sitio.Problemas con la memoria caché de la página en iOS 5 Safari al navegar atrás/descargue el evento no disparado
Estoy luchando con la forma en que el navegador Safari en iOS 5 trata con la memoria caché de respaldo, a la que llaman "Page Cache". La forma en que se describe here explica muy bien el comportamiento.
En pocas palabras, la caché de página lo hace tan cuando salga de una página que “pausa” y cuando vuelva nos presiona “juego”.
Esto está causando problemas en todo mi sitio. Al usar el botón Atrás, la mayoría de los otros navegadores le mostrarán la página en el estado en que se cargó. No Safari en iOS 5, muestra la página tal como la dejó por última vez. Un ejemplo simple sería la desactivación de un botón de envío. Si utilizo Javascript para deshabilitar un botón de enviar, luego presento un formulario, cuando hace clic atrás, el botón de enviar seguirá estando deshabilitado. Esto ha sido un problema en otros navegadores, incluida la versión de escritorio de Safari, pero se soluciona al configurar el controlador de eventos onload en una función en blanco. Creo que esto le dice al navegador que invalide la memoria caché porque algo importante podría haber sucedido en esa función. Este truco no parece funcionar para Safari en iOS 5.
A continuación se muestra el problema reducido a lo esencial. Cuando cargues test.html, verás el texto "Texto original". Cuando haga clic en el enlace, ese texto cambiará a "Texto modificado: reenvío a la página siguiente", luego, en 3 segundos, se lo enviará a test2.html. Todo está bien hasta este punto en todos los navegadores. En todos los demás navegadores, al hacer clic en el botón Atrás, el texto que verá será "Texto original", pero en Safari para iOS 5 verá "Texto modificado: reenvío a la página siguiente".
¿Alguna sugerencia sobre cómo lidiar con esto?
Este es un ejemplo sencillo
test.html
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
Test2.html
<div>Click back button</div>
Este es un segundo ejemplo usando un poste de forma. Este es un simple ejemplo de cómo está funcionando mi aplicación. Cuando navegue de regreso a formtest2.asp, debería ver el valor del formulario publicado y el texto del div debería ser original.
FormTest.asp
<form method="post" action="formtest2.asp">
Test: <input type="text" name="test"/>
<input type="submit" value="Submit"/>
</form>
formtest2.asp
<script>
function changeText() {
el = document.getElementById("text");
el.innerHTML = "Changed text - forwarding to next page";
setTimeout("forward()",3000);
}
function forward() {
document.location.href = "test2.html";
}
</script>
<%
Dim test
test = Request("test")
Response.Write("Test value: " & test & "<br />")
%>
<div id="text">Original Text</div>
<a href="Javascript:changeText()">Click Here</a>
<script>
window.onunload = function(){};
</script>
Test2.html
<div>Click back button</div>
Solo un poco más de información sobre esto. Parece que todos los navegadores que he probado (Firefox, IE, Safari Desktop) están disparando pagehide, y descargan, en ese orden. Safari en iOS 5 solo dispara la página. – Clarke
Al abrir una pestaña nueva, el evento de descarga no se activa, solo pagehide. Al abrir una pestaña nueva, es de esperar que pueda navegar de nuevo a una pestaña anterior y ver la página tal como la dejó. El problema es que cuando navegamos de una página a la siguiente en la misma pestaña/ventana, el evento de descarga debe activarse por w3c, pero no es así. http://www.w3.org/TR/DOM-Level-2-Events/events.html. "El evento de descarga ocurre cuando la implementación DOM elimina un documento de una ventana o marco. Este evento es válido para elementos BODY y FRAMESET". – Clarke
Cualquier solución que use location.reload() falla porque para esta función, Safari en ios 5 solo hará un GET, no un POST como todos los demás navegadores. – Clarke