Diferencia entre DOMContentLoaded y eventos de carga

Respuestas:

191

Desde el Centro de desarrolladores de Mozilla :

El evento DOMContentLoaded se activa cuando el documento se ha cargado y analizado por completo, sin esperar a que las hojas de estilo, las imágenes y los subtramas finalicen la carga (el evento de carga se puede utilizar para detectar una página completamente cargada).

Simon Lieschke
fuente
27
Para su información, el mismo enlace de MDN [ahora] también dice: "Nota: la hoja de estilo carga la ejecución del script de bloque, por lo que si tiene un <script> después de una <link rel =" stylesheet "...>, la página no finalizará el análisis: y DOMContentLoaded no se activará hasta que se cargue la hoja de estilo ".
Nick
10
@ Nick Esta página da la razón. html5rocks.com/en/tutorials/internals/howbrowserswork Sin embargo, recomendaría ver el video en la página.
abhisekp
1
@abhisekp buen tutorial, aunque ese enlace de video ahora está obsoleto
supi
Por lo tanto, el árbol de renderizado se crea después de que se active DOMContentLoaded. Pero DOMContentLoaded no espera a que las imágenes / sub-recursos / subtramas terminen de cargarse de acuerdo con developer.mozilla.org/en-US/docs/Web/API/Window/… . ¿Sabes si estas imágenes / subtramas / recursos secundarios son llamados por el árbol de renderizado después de que fue construido, o ya fueron llamados por el árbol DOM mientras el árbol de renderizado aún se estaba construyendo? En otras palabras, ¿el árbol de procesamiento desencadena un montón de conexiones para descargar estas imágenes / subtramas / recursos secundarios o sus descargas ya estaban en progreso antes?
weefwefwqg3
83

El DOMContentLoadedevento se disparará tan pronto como la jerarquía DOM se haya construido completamente, el loadevento lo hará cuando todas las imágenes y subtramas hayan terminado de cargarse.

DOMContentLoadedfuncionará en la mayoría de los navegadores modernos, pero no en IE, incluido IE9 y superior. Hay algunas soluciones alternativas para imitar este evento en versiones anteriores de IE, como el utilizado en la biblioteca jQuery, adjuntan el evento específico de IE onreadystatechange .

CMS
fuente
77
¿A qué evento te refieres cuando dices "Este evento"?
Tom Hubbard
2
"Este evento" = DOMContentLoaded. No funciona en IE8. Si necesita soporte, use la solución alternativa a la que se vincula CMS
Jan Derk,
53

Vea la diferencia usted mismo:

MANIFESTACIÓN

De Microsoft IE

El evento DOMContentLoaded se desencadena cuando se completa el análisis de la página actual; el evento de carga se activa cuando todos los archivos han terminado de cargarse desde todos los recursos, incluidos los anuncios y las imágenes. DOMContentLoaded es un gran evento para conectar la funcionalidad de la interfaz de usuario a páginas web complejas.

De la red de desarrolladores de Mozilla

El evento DOMContentLoaded se activa cuando el documento se ha cargado y analizado por completo, sin esperar a que las hojas de estilo, las imágenes y los subtramas finalicen la carga (el evento de carga se puede utilizar para detectar una página completamente cargada).

Mehrad Sadegh
fuente
¿ DOMContentLoadedGarantiza que se hayan cargado todos los scripts (incluido aplazamiento / asíncrono)? Aquí no se dice nada sobre los scripts: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey
@Sergey Nope. los recursos asíncronos, es decir, <script async src = app.js />, se cargan independientemente del resto de la página, por lo que DOMContentLoaded podría activarse antes de que el recurso se
recupere
1
@MehradSadegh ¡Creo que te equivocas! De la documentación de MDN : las secuencias de comandos con el atributo diferido evitarán que el evento DOMContentLoaded se active hasta que la secuencia de comandos se haya cargado y finalizado la evaluación. Puede echar un vistazo a esta pregunta SO, que lo confirma: stackoverflow.com/questions/42950574/…
radzak
1
@Jatimir Creo que diferir y los atributos asíncronos tienen un comportamiento diferente.
Mehrad Sadegh
1
@Jatimir Me alegro de que hayas publicado de todos modos, porque tu contribución fue exactamente lo que estaba buscando. ¡Gracias!
Robert Wildling
29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Una página no se puede manipular de manera segura hasta que el documento esté "listo". jQuery detecta este estado de preparación para usted. El código incluido dentro de $ (document) .ready () solo se ejecutará una vez que la página Document Object Model (DOM) esté lista para que se ejecute el código JavaScript. El código incluido dentro de $ (window) .load (function () {...}) se ejecutará una vez que toda la página (imágenes o iframes), no solo el DOM, esté lista.

Ver: http://learn.jquery.com/using-jquery-core/document-ready/

Anderson
fuente
1
La pregunta no es sobre jQuery.
user34660
44
@ user34660 No lo es, pero es útil de entender.
Anderson
16
  • domContentLoaded : marca el punto cuando el DOM está listo y no hay hojas de estilo que bloqueen la ejecución de JavaScript, lo que significa que ahora podemos (potencialmente) construir el árbol de renderizado. Muchos marcos de JavaScript esperan este evento antes de comenzar a ejecutar su propia lógica. Por esta razón, el navegador captura las marcas de tiempo EventStart y EventEnd para permitirnos rastrear cuánto tiempo llevó esta ejecución.

  • loadEvent : como paso final en cada página de carga, el navegador dispara un evento de "carga" que puede desencadenar una lógica de aplicación adicional.

fuente

skube
fuente
Si tengo etiquetas de script con url para JS, ¿se cargarán antes de domContentLoaded o después?
Pavan
0

Aquí hay un código que funciona para nosotros. Descubrimos que MSIE es impredecible DomContentLoaded, parece haber algún retraso cuando no se almacenan recursos adicionales en caché (hasta 300 ms según el registro de nuestra consola), y se dispara demasiado rápido cuando se almacenan en caché. Así que recurrimos a una alternativa para MISE. También desea activar la doStuff()función si se DomContentLoadedactiva antes o después de sus archivos JS externos.

// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);

function doStuff(){
    //
}
if(isIE){
    // play it safe, very few users, exec ur JS when all resources are loaded
    window.onload=function(){doStuff();}
} else {
    // add event listener to trigger your function when DOMContentLoaded
    if(document.readyState==='loading'){
        document.addEventListener('DOMContentLoaded',doStuff);
    } else {
        // DOMContentLoaded already loaded, so better trigger your function
        doStuff();
    }
}
YK
fuente