Diferença entre eventos DOMContentLoaded e load

Respostas:

191

No Mozilla Developer Center :

O evento DOMContentLoaded é acionado quando o documento é completamente carregado e analisado, sem aguardar que folhas de estilo, imagens e sub-quadros terminem de carregar (o evento load pode ser usado para detectar uma página totalmente carregada).

Simon Lieschke
fonte
27
Fyi, o mesmo link MDN [agora] também diz: "Nota: a folha de estilo carrega a execução do script de bloco; portanto, se você tiver um <script> após um <link rel =" stylesheet "...>, a página não concluirá a análise - e DOMContentLoaded não serão acionados - até que a folha de estilo seja carregada. "
Nick
10
@ Nick Esta página explica o motivo. html5rocks.com/en/tutorials/internals/howbrowserswork Eu recomendaria assistir o vídeo na página.
Abhisekp
1
@abhisekp bom tutorial, embora o link do vídeo agora esteja obsoleto
supi
Portanto, a árvore de renderização é criada após o acionamento do DOMContentLoaded. Mas o DOMContentLoaded não aguarda o carregamento de imagens / sub-recursos / sub-quadros de acordo com developer.mozilla.org/en-US/docs/Web/API/Window/… . Você sabe se essas imagens / sub-quadros / sub-recursos são chamados pela Árvore de Renderização após sua criação, ou já foram chamados pela árvore do DOM enquanto a árvore de renderização ainda estava sendo criada? Em outras palavras, a árvore de renderização aciona várias conexões para baixar essas imagens / sub-quadros / sub-recursos ou seus downloads já estavam em andamento antes?
weefwefwqg3
83

O DOMContentLoadedevento será acionado assim que a hierarquia do DOM for totalmente construída, o loadevento será executado quando todas as imagens e subquadros tiverem terminado o carregamento.

DOMContentLoadedfuncionará nos navegadores mais modernos, mas não no IE, incluindo o IE9 e superior. Existem algumas soluções alternativas para imitar esse evento em versões mais antigas do IE, como as usadas na biblioteca jQuery, elas anexam o evento específico do IEonreadystatechange .

CMS
fonte
7
A que evento você se refere quando diz "Este evento"?
precisa
2
"Este evento" = DOMContentLoaded. Não funciona no IE8. Se você precisa para apoiá-lo usar a solução que ligações CMS para
Jan Derk
53

Veja a diferença você mesmo:

DEMO

Do Microsoft IE

O evento DOMContentLoaded é acionado quando a análise da página atual é concluída; o evento load é acionado quando todos os arquivos terminam de carregar de todos os recursos, incluindo anúncios e imagens. DOMContentLoaded é um ótimo evento para conectar a funcionalidade da interface do usuário a páginas da web complexas.

Da Rede de Desenvolvedores Mozilla

O evento DOMContentLoaded é acionado quando o documento é completamente carregado e analisado, sem aguardar que folhas de estilo, imagens e sub-quadros terminem de carregar (o evento load pode ser usado para detectar uma página totalmente carregada).

Mehrad Sadegh
fonte
Será DOMContentLoadedgarantia de que todos os scripts (incluindo Adiar / assíncrona) foram carregados? Nada é dito aqui sobre scripts: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Sergey
@Sergey Nope. assíncrona recursos - ou seja <src assíncrona script = app.js /> - são carregados independentemente do resto da página, portanto, DOMContentLoaded que pode se desencadeou antes que o recurso é obtido a partir do servidor
Mehrad Sadegh
1
@MehradSadegh Acho que você está errado! Na documentação do MDN : os scripts com o atributo defer impedirão que o evento DOMContentLoaded seja acionado até que o script seja carregado e conclua a avaliação. Você pode dar uma olhada para esta questão SO, que confirma: stackoverflow.com/questions/42950574/...
Radzak
1
@ Katimir Eu acho que os atributos adiar e assíncrono têm um comportamento diferente.
Mehrad Sadegh 16/04/19
1
@Jatimir Fico feliz que você postou de qualquer maneira, porque sua contribuição foi exatamente o que eu estava procurando! Obrigado!
Robert Wildling 24/12/19
29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Uma página não pode ser manipulada com segurança até que o documento esteja "pronto". O jQuery detecta esse estado de prontidão para você. O código incluído em $ (document) .ready () será executado apenas quando a página DOM (Document Object Model) estiver pronta para a execução do código JavaScript. O código incluído em $ (window) .load (function () {...}) será executado assim que a página inteira (imagens ou iframes), não apenas o DOM, estiver pronta.

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

Anderson
fonte
1
A questão não é sobre jQuery.
user34660
4
@ user34660 Não é, mas é útil entender.
Anderson
16
  • domContentLoaded : marca o ponto em que o DOM está pronto e não há folhas de estilo que estejam bloqueando a execução do JavaScript - o que significa que agora podemos (potencialmente) construir a árvore de renderização. Muitas estruturas JavaScript aguardam esse evento antes de começarem a executar sua própria lógica. Por esse motivo, o navegador captura os registros de data e hora EventStart e EventEnd para permitir rastrear quanto tempo essa execução levou.

  • loadEvent : como uma etapa final em cada carregamento de página, o navegador dispara um evento "onload" que pode disparar lógica de aplicativo adicional.

fonte

skube
fonte
Se eu tiver alguma tag de script com URL para JS, elas serão carregadas antes de domContentLoaded ou depois?
Pavan
0

Aqui está um código que funciona para nós. Descobrimos que o MSIE é um problema DomContentLoaded, parece que há algum atraso quando nenhum recurso adicional é armazenado em cache (até 300ms com base no log do console) e é acionado muito rápido quando eles são armazenados em cache. Por isso, recorremos a um substituto para o MISE. Você também deseja acionar a doStuff()função, seja acionada DomContentLoadedantes ou depois dos arquivos 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
fonte