¿Cuál es más ampliamente compatible: window.onload
o document.onload
?
javascript
event-handling
dom-events
Chris Ballance
fuente
fuente
window
eventos:onload
yDOMContentLoaded
. Ejemplo de uso :,window.addEventListener('DOMContentLoaded', callback)
. A mediados de 2019, compatible con todos los principales navegadores. ----- developer.mozilla.org/en-US/docs/Web/API/Window/… ------ developer.mozilla.org/en-US/docs/Web/API/Window/load_eventwindow.onload
ydocument.onload
son diferentes entre sí!window.onload
parece tener lugar después y tiene un poco más cargado quedocument.onload
! (¡Algunas cosas están funcionando con la ventana que no funciona con el documento! ¡Eso va para document.onreadstatechange 'complete' también!)Respuestas:
¿Cuándo disparan?
window.onload
En algunos navegadores, ahora asume el papel
document.onload
y se activa cuando el DOM también está listo.document.onload
¿Qué tan bien son compatibles?
window.onload
parece ser el más ampliamente apoyado. De hecho, algunos de los navegadores más modernos tienen en un sentido reemplazadodocument.onload
conwindow.onload
.Los problemas de soporte del navegador son probablemente la razón por la cual muchas personas están comenzando a usar bibliotecas como jQuery para manejar la verificación del documento que está listo, así:
A los efectos de la historia.
window.onload
vsbody.onload
:fuente
window.onload
y<body onload="">
que es completamente diferente (y la "estructura separada de la acción" tiene mucho más sentido en este contexto). No es que la respuesta sea incorrecta, pero la base es.document.onload
es JS equivalente a jQuerydocument.ready
?La idea general es que los fuegos window.onload cuando la ventana del documento está listo para su presentación y document.onload incendios cuando el árbol DOM es (construido a partir del código de marcado dentro del documento) completó .
Idealmente, suscribirse a los eventos del árbol DOM permite manipulaciones fuera de la pantalla a través de Javascript, casi sin carga de CPU . Por el contrario,
window.onload
puede tardar un tiempo en activarse , cuando aún no se han solicitado, analizado y cargado múltiples recursos externos.► Escenario de prueba:
Para observar la diferencia y cómo su navegador de elección implementa los controladores de eventos mencionados anteriormente , simplemente inserte el siguiente código dentro de la
<body>
etiqueta - - de su documento .►Resultado:
Aquí está el comportamiento resultante, observable para Chrome v20 (y probablemente la mayoría de los navegadores actuales).
document.onload
eventoonload
se dispara dos veces cuando se declara dentro de<body>
, una vez cuando se declara dentro de<head>
(donde el evento actúa comodocument.onload
).window.onload
controlador de eventos dentro de los límites del<head>
elemento HTML .► Proyecto de ejemplo:
El código anterior se toma de la base de código de este proyecto (
index.html
ykeyboarder.js
).Para obtener una lista de controladores de eventos del objeto de ventana , consulte la documentación de MDN.
fuente
Agregar escucha de eventos
Update March 2017
1 JavaScript de vainilla
2 jQuery
Buena suerte.
fuente
window.addEventListener('load', function() {...})
? También he actualizado mi respuesta.De acuerdo con el análisis de documentos HTML - El final ,
El navegador analiza la fuente HTML y ejecuta scripts diferidos.
A
DOMContentLoaded
se envía en eldocument
momento en que todo el HTML se ha analizado y se ha ejecutado. El evento burbujea a lawindow
.El navegador carga recursos (como imágenes) que retrasan el evento de carga.
Se
load
envía un evento a laswindow
.Por lo tanto, el orden de ejecución será
DOMContentLoaded
oyentes de eventoswindow
en la fase de capturaDOMContentLoaded
oyentes de eventos dedocument
DOMContentLoaded
oyentes de eventoswindow
en la fase de burbujaload
oyentes de eventos (incluido elonload
controlador de eventos) dewindow
Nunca se debe invocar un
load
detector de eventos de burbuja (incluido elonload
controlador de eventos)document
. Solo seload
pueden invocar oyentes de captura , pero debido a la carga de un recurso secundario como una hoja de estilo, no debido a la carga del documento en sí.fuente
document - load - capture
, de hecho, sucede, lo cual es contrario a lo que esperaba en mi búsqueda de por qué la carga de documentos no me está sucediendo. Curiosamente, es inconsistente. A veces aparece, a veces no, a veces aparece dos veces, pero nuncadocument - load - bubble
sucede. Sugeriría no usardocument load
.load
se envíe un evento con recursos externos. Ese evento no burbujea, por lo que generalmente no se detecta en el documento, pero debería aparecer en la fase de captura. Estas entradas se refieren a la carga de los elementos<style>
y<script>
. Creo que Edge tiene razón para mostrarlos, y Firefox y Chrome están equivocados.useCapture
opción me enseñó algo nuevo.En Chrome, window.onload es diferente de
<body onload="">
, mientras que son iguales tanto en Firefox (versión 35.0) como en IE (versión 11).Puede explorar eso con el siguiente fragmento:
Y verá tanto "ventana cargada" (que viene primero) como "carga del cuerpo" en la consola de Chrome. Sin embargo, verá solo "carga del cuerpo" en Firefox e IE. Si ejecuta "
window.onload.toString()
" en las consolas de IE y FF, verá:lo que significa que la asignación "window.onload = function (e) ..." se sobrescribe.
fuente
window.onload
yonunload
son atajos haciadocument.body.onload
ydocument.body.onunload
document.onload
y elonload
controlador en todas las etiquetas html parece estar reservado, pero nunca se activó'
onload
' en el documento -> verdaderofuente
window.onload, sin embargo, a menudo son lo mismo. Del mismo modo, body.onload se convierte en window.onload en IE.
fuente
Sin embargo, Window.onload es el estándar: el navegador web en la PS3 (basado en Netfront) no admite el objeto de la ventana, por lo que no puede usarlo allí.
fuente
En breve
windows.onload
no es compatible con IE 6-8document.onload
no es compatible con ningún navegador moderno (el evento nunca se activa)Mostrar fragmento de código
fuente