Para todos los principales navegadores (excepto IE), el onload
evento JavaScript no se dispara cuando la página se carga como resultado de una operación de botón de retroceso, solo se dispara cuando la página se carga por primera vez.
¿Alguien puede señalarme un código de ejemplo para varios navegadores (Firefox, Opera, Safari, IE, ...) que resuelva este problema? Estoy familiarizado con el pageshow
evento de Firefox, pero desafortunadamente ni Opera ni Safari implementan esto.
javascript
pageload
Cuenta
fuente
fuente
Respuestas:
Chicos, descubrí que JQuery solo tiene un efecto: la página se vuelve a cargar cuando se presiona el botón Atrás. Esto no tiene nada que ver con " listo ".
¿Como funciona esto? Bueno, JQuery agrega un detector de eventos de descarga .
Por defecto, no hace nada. Pero de alguna manera esto parece desencadenar una recarga en Safari, Opera y Mozilla, sin importar lo que contenga el controlador de eventos.
[ editar (Nickolay) : he aquí por qué funciona de esa manera: webkit.org , developer.mozilla.org . Lea esos artículos (o mi resumen en una respuesta separada a continuación) y considere si realmente necesita hacer esto y hacer que su página se cargue más lentamente para sus usuarios.]
No lo puedo creer? Prueba esto:
Verá resultados similares cuando use JQuery.
Es posible que desee comparar a este sin descargar
fuente
onunload
controlador (la página ya ha destruido todo; ¿por qué almacenarla en caché?).Algunos navegadores modernos (Firefox, Safari y Opera, pero no Chrome) admiten el caché especial "atrás / adelante" (lo llamaré bfcache, que es un término inventado por Mozilla), involucrado cuando el usuario navega hacia atrás. A diferencia del caché regular (HTTP), captura el estado completo de la página (incluido el estado de JS, DOM). Esto le permite volver a cargar la página más rápido y exactamente como lo dejó el usuario.
Se
load
supone que el evento no se activa cuando la página se carga desde este bfcache. Por ejemplo, si creó su IU en el controlador "cargar", y el evento "cargar" se activó una vez en la carga inicial, y la segunda vez cuando la página se volvió a cargar desde el bfcache, la página terminaría con elementos de IU duplicados.Esta es también la razón por la cual agregar el controlador "descargar" evita que la página se almacene en el bfcache (lo que hace que sea más lento para volver a navegar): el controlador de descarga podría realizar tareas de limpieza, lo que podría dejar la página en estado inviable.
Para las páginas que necesitan saber cuándo se navega lejos / atrás, Firefox 1.5+ y la versión de Safari con la corrección del error 28758 admiten eventos especiales llamados "pagehow" y "pagehide".
Referencias
fuente
Me encontré con un problema que mi js no se estaba ejecutando cuando el usuario había hecho clic hacia atrás o hacia adelante. Primero me propuse detener el almacenamiento en caché del navegador, pero este no parecía ser el problema. Mi javascript se configuró para ejecutarse después de cargar todas las bibliotecas, etc. Lo comprobé con el evento readyStateChange.
Después de algunas pruebas, descubrí que readyState de un elemento en una página en la que se ha hecho clic en la parte posterior no se 'carga' sino 'se completa'. Agregar
|| element.readyState == 'complete'
a mi declaración condicional resolvió mis problemas.Solo pensé en compartir mis hallazgos, espero que ayuden a alguien más.
Editar para completar
Mi código tenía el siguiente aspecto:
En el ejemplo de código anterior, la variable de secuencia de comandos era un elemento de secuencia de comandos recién creado que se había agregado al DOM.
fuente
OK, aquí hay una solución final basada en la solución inicial de ckramer y el ejemplo de palehorse que funciona en todos los navegadores, incluido Opera. Si configura history.navigationMode como 'compatible', la función ready de jQuery se activará en las operaciones del botón Atrás en Opera, así como en los otros navegadores principales.
Esta página tiene más información .
Ejemplo:
Probé esto en Opera 9.5, IE7, FF3 y Safari y funciona en todos ellos.
fuente
No pude hacer que los ejemplos anteriores funcionen. Simplemente quería activar una actualización de ciertas áreas div modificadas al volver a la página mediante el botón Atrás. El truco que utilicé fue establecer un campo de entrada oculto (llamado "bit sucio") a 1 tan pronto como las áreas div cambiaran del original. El campo de entrada oculto en realidad retiene su valor cuando hago clic de nuevo, así que al cargar puedo verificar este bit. Si está configurado, actualizo la página (o simplemente actualizo los divs). Sin embargo, en la carga original, el bit no está configurado, por lo que no pierdo el tiempo cargando la página dos veces.
Y se activaría correctamente cada vez que haga clic en el botón Atrás.
fuente
Si recuerdo bien, agregar un evento unload () significa que la página no se puede almacenar en caché (en caché hacia adelante / hacia atrás), porque su estado cambia / puede cambiar cuando el usuario se aleja. Por lo tanto, no es seguro restaurar el estado de último segundo de la página al volver a ella navegando a través del objeto de historial.
fuente
Pensé que esto sería para "descargar", no para cargar la página, ya que no estamos hablando de disparar un evento al presionar "Volver". $ document.ready () es para eventos deseados en la carga de la página, sin importar cómo llegue a esa página (es decir, redirigir, abrir el navegador a la URL directamente, etc.), no al hacer clic en "Atrás", a menos que esté hablando sobre qué disparar en la página anterior cuando se vuelve a cargar. Y no estoy seguro de que la página no se almacene en caché, ya que descubrí que los Javascripts todavía lo están, incluso cuando $ document.ready () está incluido en ellos. Hemos tenido que presionar Ctrl + F5 al editar nuestros scripts que tienen este evento cada vez que los revisamos y queremos probar los resultados en nuestras páginas.
es lo que desea para un evento de descarga al presionar "Atrás" y descargar la página actual, y también se activaría cuando un usuario cierre la ventana del navegador. Esto sonaba más como lo que deseaba, incluso si me superan en número con las respuestas $ document.ready (). Básicamente, la diferencia es entre un evento que se activa en la página actual mientras se cierra o en el que se carga al hacer clic en "Atrás" mientras se carga. Probado en IE 7 bien, no puedo hablar por los otros navegadores ya que no están permitidos donde estamos. Pero esta podría ser otra opción.
fuente
Puedo confirmar a ckramer que el evento listo de jQuery funciona en IE y Firefox. Aquí hay una muestra:
fuente
para las personas que no quieren usar toda la biblioteca jquery, extraje la implementación en un código separado. Tiene solo 0,4 KB de tamaño.
Puede encontrar el código, junto con un tutorial en alemán en este wiki: http://www.easy-coding.de/wiki/html-ajax-und-co/onload-event-cross-browser-kompatibler-domcontentloaded.html
fuente
El evento listo de jQuery fue creado solo para este tipo de problema. Es posible que desee profundizar en la implementación para ver qué sucede debajo de las cubiertas.
fuente
ready
no parece activarse en Firefox cuando se usa el botón Atrás. Ver también la respuesta de Nickolay .Bill, me atrevo a responder tu pregunta, sin embargo, no estoy 100% seguro con mis conjeturas. Creo que, aparte de los navegadores IE, cuando se lleva al usuario a una página en el historial, no solo cargará la página y sus recursos de la memoria caché, sino que también restaurará todo el estado DOM (sesión de lectura). IE no realiza la restauración DOM (o al menos no lo hizo) y, por lo tanto, el evento de carga parece ser necesario para la reinicialización adecuada de la página allí.
fuente
Probé la solución de Bill usando $ (document) .ready ... pero al principio no funcionó. Descubrí que si el script se coloca después de la sección html, no funcionará. Si es la sección principal, funcionará pero solo en IE. El script no funciona en Firefox.
fuente
Bien, probé esto y funciona en Firefox 3, Safari 3.1.1 e IE7, pero no en Opera 9.52.
Si utiliza el ejemplo que se muestra a continuación (basado en el ejemplo de palehorse), aparece una ventana emergente de cuadro de alerta cuando se carga la página por primera vez. Pero si luego va a otra URL y luego presiona el botón Atrás para volver a esta página, no aparece un cuadro de alerta emergente en Opera (pero sí en los otros navegadores).
De todos modos, creo que esto está lo suficientemente cerca por ahora. ¡Gracias a todos!
fuente
El evento de descarga no funciona bien en IE 9. Lo probé con el evento de carga (onload ()), funciona bien en IE 9 y FF5 .
Ejemplo:
fuente
He usado una plantilla html. En el archivo custom.js de esta plantilla, había una función como esta:
Pero esta función no estaba funcionando cuando vuelvo atrás después de ir a otra página.
Entonces, probé esto y funcionó:
Ahora, tengo 2 funciones "listas" pero no da ningún error y la página funciona muy bien.
Sin embargo, tengo que declarar que ha probado en Windows 10 - Opera v53 y Edge v42 pero no en otros navegadores. Ten en cuenta esto ...
Nota: la versión de jquery fue 3.3.1 y la versión de migración fue 3.0.0
fuente