2012-08-16 33 views
34

El problema que he encontrado es muy similar al this question, excepto que Safari en los equipos de sobremesa parece haber resuelto el problema. Básicamente, el problema es este: cuando un cliente está navegando en un safari móvil y la página ejecuta una función de JavaScript en pagea.html, navegue a pageb.html, luego presione el botón Atrás para volver a pagea.html, la función javascript no se ejecutará cuando el cliente presione el botón Atrás para regresar a pagea.html. Se saltará la llamada javascript.Mobile Safari botón Atrás

He intentado las soluciones mencionadas en el enlace de arriba, pero nada parece funcionar para Safari móvil. ¿Alguien más ha encontrado este error? ¿Cómo lo manejaste?

+2

Es posible que desee intentar agregar todas las URL de los enlaces con '?' Si aún no está presente. Por ejemplo: 'href =" next.html "' become 'href =" next.html? "'. Esto daría una pista al navegador web de que el contenido de la página es dinámico e ir nuevamente a esa página debería volver a cargar la página desde el servidor. Esto debería aplicarse también a los scripts externos. Por ejemplo: 'src =" mylib.js "' become 'src =" mylib.js? "'. – Jay

Respuesta

86

Esto es causado por back-forward cache. Se supone que guarda el estado completo de la página cuando el usuario navega fuera. Cuando el usuario navega hacia atrás, la página del botón Atrás se puede cargar desde la memoria caché muy rápidamente. Esto es diferente del caché normal que solo almacena en caché el código HTML.

Cuando se carga la página para bfcache onload el evento no se desencadenará. En su lugar, puede consultar la propiedad persisted del evento onpageshow. Se establece en falso en la carga de la página inicial. Cuando la página se carga desde bfcache, se establece en verdadero.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     alert("From back/forward cache."); 
    } 
}; 

Por alguna razón, jQuery no tiene esta propiedad en el evento. Aunque puedes encontrarlo desde el evento original.

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     alert("From back/forward cache."); 
    } 
}); 

La solución rápida a estos problemas es volver a cargar la página cuando se presiona el botón Atrás. Sin embargo, esto anula cualquier efecto positivo que la caché de atrás/adelante daría.

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() 
    } 
}; 

Como anotación al margen, se puede ver gran cantidad de páginas que ofrecen el uso de vacío onunload controlador como solución. Esto no ha funcionado desde iOS5.

$(window).bind("unload", function() { }); 
+3

Cabe señalar que esta solución ya no funciona en las versiones actuales de iOS (creo que leí en algún lugar que era algo más que 5ish). El evento de pageshow se activará para el primer avance/retroceso, y nunca más para ese estado de historial de página. La única solución viable que he encontrado más allá de eso es utilizar el evento popstate para identificar atrás/adelante. – Shiboe

+1

Es el controlador de onunload vacío que no ha funcionado desde iOS5. La respuesta anterior funciona para iOS6. No estoy seguro acerca de iOS7 sin embargo. Se pondrá a prueba un poco más tarde. –

+0

Esto funciona en iOS7, pero también tiene el efecto secundario de actualizar la página si la pantalla se apaga y se vuelve a encender. ¿Alguna forma de evitar eso? – Dave4988