Differenza tra DOMContentLoaded e eventi di caricamento


Risposte:


191

Dal Centro per sviluppatori Mozilla :

L'evento DOMContentLoaded viene generato quando il documento è stato completamente caricato e analizzato, senza attendere il completamento del caricamento di fogli di stile, immagini e sottoframe (l'evento di caricamento può essere utilizzato per rilevare una pagina completamente caricata).


27
Cordiali saluti, lo stesso link MDN [ora] dice anche: "Nota: il foglio di stile carica l'esecuzione dello script a blocchi, quindi se hai un <script> dopo un <link rel =" stylesheet "...>, la pagina non finirà di analizzare - e DOMContentLoaded non si attiveranno fino a quando non verrà caricato il foglio di stile. "
Nick,

10
@Nick Questa pagina fornisce il motivo. html5rocks.com/en/tutorials/internals/howbrowserswork Consiglierei comunque di guardare il video nella pagina.
abhisekp,

1
@abhisekp bel tutorial anche se quel collegamento video è ormai obsoleto
supi

Quindi l'albero di rendering viene creato dopo l'attivazione di DOMContentLoaded. Ma DOMContentLoaded non attende il completamento del caricamento di immagini / risorse secondarie / sottotelai in base a developer.mozilla.org/en-US/docs/Web/API/Window/… . Sai se queste immagini / sottoframe / risorse secondarie vengono chiamate dall'albero di rendering dopo che è stato creato o se sono già state chiamate dall'albero DOM mentre l'albero di rendering era ancora in costruzione? In altre parole, l'albero di rendering innesca un sacco di connessioni per scaricare queste immagini / sottotelai / sottobresource o i loro download erano già in corso prima?
weefwefwqg3,

83

L' DOMContentLoadedevento si attiverà non appena la gerarchia DOM sarà stata completamente costruita, l' loadevento lo farà quando tutte le immagini e i sub-frame avranno terminato il caricamento.

DOMContentLoadedfunzionerà sulla maggior parte dei browser moderni, ma non su IE incluso IE9 e versioni successive. Esistono alcune soluzioni alternative per imitare questo evento nelle versioni precedenti di IE, come quelle utilizzate nella libreria jQuery, che collegano l' evento specifico di IE onreadystatechange .


7
A quale evento ti riferisci quando dici "Questo evento"?
Tom Hubbard,

2
"Questo evento" = DOMContentLoaded. Non funziona in IE8. Se è necessario supportarlo, utilizzare la soluzione alternativa a cui CMS collega
Jan Derk,

53

Vedi tu stesso la differenza:

DEMO

Da Microsoft IE

L'evento DOMContentLoaded viene generato al termine dell'analisi della pagina corrente; l'evento load viene generato quando tutti i file hanno terminato il caricamento da tutte le risorse, inclusi annunci e immagini. DOMContentLoaded è un grande evento da utilizzare per collegare la funzionalità dell'interfaccia utente a pagine Web complesse.

Dalla rete di sviluppatori Mozilla

L'evento DOMContentLoaded viene generato quando il documento è stato completamente caricato e analizzato, senza attendere il completamento del caricamento di fogli di stile, immagini e sottoframe (l'evento di caricamento può essere utilizzato per rilevare una pagina completamente caricata).


Ha DOMContentLoadedgaranzia che tutti gli script (inclusi rinviare / asincrona) sono stati caricati? Nulla è detto qui sugli script: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey,

@Sergey Nope. le risorse asincrone - ovvero <script async src = app.js /> - vengono caricate indipendentemente dal resto della pagina, pertanto DOMContentLoaded potrebbe essere attivato prima che la risorsa venga recuperata dal server
Mehrad Sadegh,

1
@MehradSadegh Penso che ti sbagli! Dalla documentazione MDN : gli script con l'attributo defer impediranno l'attivazione dell'evento DOMContentLoaded fino a quando lo script non viene caricato e completato la valutazione. Si può dare un'occhiata a questa domanda SO, che lo conferma: stackoverflow.com/questions/42950574/...
radzak

1
@Jatimir Penso che gli attributi di differimento e asincrono abbiano un comportamento diverso.
Mehrad Sadegh,

1
@Jatimir Lieto che tu abbia pubblicato comunque, perché il tuo contributo è stato esattamente quello che stavo cercando! Grazie!
Robert Wildling,

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Una pagina non può essere manipolata in modo sicuro fino a quando il documento non è "pronto". jQuery rileva questo stato di prontezza per te. Il codice incluso in $ (document) .ready () verrà eseguito solo quando la pagina Document Object Model (DOM) è pronta per l'esecuzione del codice JavaScript. Il codice incluso in $ (window) .load (function () {...}) verrà eseguito una volta che l'intera pagina (immagini o iframe), non solo il DOM, è pronta.

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


1
La domanda non riguarda jQuery.
user34660

4
@ user34660 Non lo è, ma è utile da capire.
Anderson,

16
  • domContentLoaded : segna il punto in cui entrambi i DOM sono pronti e non ci sono fogli di stile che bloccano l'esecuzione di JavaScript, il che significa che ora possiamo (potenzialmente) costruire l'albero di rendering. Molti framework JavaScript attendono questo evento prima di iniziare a eseguire la propria logica. Per questo motivo il browser acquisisce i timestamp EventStart ed EventEnd per consentirci di tenere traccia del tempo impiegato per l'esecuzione.

  • loadEvent : come passaggio finale in ogni caricamento della pagina, il browser genera un evento "onload" che può attivare la logica dell'applicazione aggiuntiva.

fonte


Se ho tag di script con url su JS, verranno caricati prima di domContentLoaded o dopo?
Pavan,

0

Ecco del codice che funziona per noi. Abbiamo riscontrato che MSIE è da non perdere DomContentLoaded, sembra che ci sia un certo ritardo quando non vengono memorizzate nella cache risorse aggiuntive (fino a 300 ms in base alla registrazione della nostra console) e si innesca troppo velocemente quando vengono memorizzate nella cache. Quindi abbiamo fatto ricorso a un fallback per MISE. Si desidera inoltre attivare la doStuff()funzione se si DomContentLoadedattiva prima o dopo i file JS esterni.

// 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();
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.