Estoy tratando de hacer una rueda de carga simple que aparece al navegar. Aparece usando un evento 'beforeunload' cuando se aleja y usa el evento 'load' para ocultarse nuevamente cuando termina.
El problema es que cuando dejo la página en segundo plano en mi teléfono, por ejemplo, durante unas horas, el evento 'beforeunload' se dispara y muestra la rueda giratoria. Probablemente porque Chrome en Android está descargando parcialmente la página para ahorrar memoria. Sin embargo, la ruleta no desaparece por sí sola y parece que no puedo entender cómo hacer que desaparezca nuevamente de una manera elegante.
¿Hay algún otro evento que debería usar en su lugar?
window.addEventListener("load", function() {
topSpinner.classList.add("closed");
});
window.addEventListener("beforeunload", function() {
topSpinner.classList.remove("closed");
});
javascript
android
google-chrome
Doskii
fuente
fuente
Respuestas:
Chrome 68 (julio de 2018) introdujo una nueva API de ciclo de vida de la página : el diagrama de estado suministrado en este enlace no muestra la llamada del sistema (navegador)
beforeunload
antes de poner la página en elfrozen
estado, pero eso es claramente lo que está sucediendo.Con mucha ayuda, la API introdujo dos nuevos eventos que se activan cuando la página entra y sale de este estado:
freeze
yresume
.He resuelto este problema en las pantallas de Chrome Mobile y Webview simplemente agregando esto:
fuente
Cambiar la lista de eventos de carga para enfocar
fuente
He registrado eventos a través de Ajax a la base de datos. Mis pruebas mostraron que no es predecible qué eventos se activaron (es decir, cuando se usa PWA). Hay
focus
,visibilitychange
,resize
ybeforeunload
participan. Me sorprendió cuando encendí la pantalla con PWA activa, a vecesbeforeunload
son los únicos eventos que se han registrado en la base de datos.Estoy usando el siguiente código ahora, que parece funcionar sin efectos secundarios:
fuente
Intente mantener una marca de cargador a través de
localStorage
, así que si la página se vuelve a cargar, verifique la bandera nuevamente:Pseudo código a continuación:
fuente
setTimeout
después de unosx
segundos, por lo que, en el peor de los casos, tendrá que esperarx
segundos para volver a ver la página. Además, usar un temporizador que esté funcionando todo el tiempo para este caso especial no es realmente innovador.