Qual é o suporte mais amplo: window.onload
ou document.onload
?
javascript
event-handling
dom-events
Chris Ballance
fonte
fonte
window
eventos:onload
eDOMContentLoaded
. Exemplo de uso :,window.addEventListener('DOMContentLoaded', callback)
. A partir de meados de 2019, compatível com todos os principais navegadores. ----- developer.mozilla.org/en-US/docs/Web/API/Window/… ------ developer.mozilla.org/en-US/docs/Web/API/Window/load_eventwindow.onload
edocument.onload
são diferentes um do outro!window.onload
parece ocorrer depois e tem um pouco mais de carga do quedocument.onload
! (Algumas coisas estão funcionando com a janela que não está funcionando com o documento! Isso vale para document.onreadstatechange 'complete' também!)Respostas:
Quando eles disparam?
window.onload
Em alguns navegadores, agora assume o papel
document.onload
e é acionado quando o DOM também está pronto.document.onload
Quão bem eles são suportados?
window.onload
parece ser o mais amplamente suportado. Na verdade, alguns dos navegadores mais modernos têm em um sentido substituídodocument.onload
comwindow.onload
.Os problemas de suporte ao navegador são provavelmente o motivo pelo qual muitas pessoas estão começando a usar bibliotecas como o jQuery para lidar com a verificação do documento estar pronto, da seguinte forma:
Para os propósitos da história.
window.onload
vsbody.onload
:fonte
window.onload
e<body onload="">
que é completamente diferente (e a "estrutura separada da ação" faz muito mais sentido nesse contexto). Não que a resposta esteja errada, mas a base dela é.document.onload
é equivalente a jQuery em JSdocument.ready
?A idéia geral é que window.onload seja acionado quando a janela do documento estiver pronta para apresentação e document.onload for acionado quando a árvore DOM (criada a partir do código de marcação no documento) for concluída .
Idealmente, a inscrição em eventos na árvore DOM permite manipulações fora da tela por meio de Javascript, incorrendo em quase nenhuma carga da CPU . Por outro lado,
window.onload
pode demorar um pouco para disparar , quando vários recursos externos ainda precisam ser solicitados, analisados e carregados.► Cenário de teste:
Para observar a diferença e como o navegador escolhido implementa os manipuladores de eventos mencionados acima , basta inserir o seguinte código na
<body>
tag - - do documento .►Resultado:
Aqui está o comportamento resultante, observável no Chrome v20 (e provavelmente nos navegadores mais atuais).
document.onload
evento.onload
dispara duas vezes quando declarado dentro de<body>
, uma vez quando declarado dentro de<head>
(onde o evento atua comodocument.onload
).window.onload
manipulador de eventos dentro dos limites do<head>
elemento HTML .►Exemplo do projeto:
O código acima é retirado da base de código deste projeto (
index.html
ekeyboarder.js
).Para obter uma lista dos manipuladores de eventos do objeto window , consulte a documentação do MDN.
fonte
Adicionar ouvinte de evento
Update March 2017
1 JavaScript baunilha
2 jQuery
Boa sorte.
fonte
window.addEventListener('load', function() {...})
. Também atualizei minha resposta.De acordo com a análise de documentos HTML - O final ,
O navegador analisa a fonte HTML e executa scripts adiados.
A
DOMContentLoaded
é despachado nodocument
momento em que todo o HTML foi analisado e executado. O evento borbulha para owindow
.O navegador carrega recursos (como imagens) que atrasam o evento de carregamento.
Um
load
evento é despachado nowindow
.Portanto, a ordem de execução será
DOMContentLoaded
ouvintes de eventoswindow
na fase de capturaDOMContentLoaded
ouvintes de eventos dedocument
DOMContentLoaded
ouvintes de eventoswindow
na fase da bolhaload
ouvintes de eventos (incluindoonload
manipulador de eventos) dewindow
Um
load
ouvinte de evento de bolha (incluindoonload
manipulador de eventos)document
nunca deve ser chamado. Somenteload
ouvintes de captura podem ser chamados, mas devido ao carregamento de um sub-recurso como uma folha de estilo, não devido ao carregamento do próprio documento.fonte
document - load - capture
, de fato, acontece, o que é contrário ao que eu esperava na minha pesquisa, sobre o motivo pelo qual o carregamento de documentos não está acontecendo para mim. Estranhamente, é inconsistente. Às vezes aparece, às vezes não, às vezes aparece duas vezes - mas nuncadocument - load - bubble
acontece. Eu sugeriria não usardocument load
.load
evento seja despachado com recursos externos. Esse evento não borbulha e, portanto, geralmente não é detectado no documento, mas deve ocorrer na fase de captura. Essas entradas se referem à carga dos elementos<style>
e<script>
. Acho que o Edge está certo em mostrá-los e o Firefox e o Chrome estão errados.useCapture
opção me ensinou algo novo.No Chrome, window.onload é diferente de
<body onload="">
, enquanto são iguais no Firefox (versão 35.0) e no IE (versão 11).Você pode explorar isso usando o seguinte trecho:
E você verá "janela carregada" (que vem em primeiro lugar) e "carga corporal" no console do Chrome. No entanto, você verá apenas "carga corporal" no Firefox e no IE. Se você executar "
window.onload.toString()
" nos consoles do IE & FF, verá:o que significa que a atribuição "window.onload = function (e) ..." é substituída.
fonte
window.onload
eonunload
são atalhos paradocument.body.onload
edocument.body.onunload
document.onload
eonload
manipulador em todas as tags html parecem reservados, porém nunca acionados'
onload
' no documento -> truefonte
window.onload, no entanto, geralmente são a mesma coisa. Da mesma forma, body.onload se torna window.onload no IE.
fonte
Window.onload é o padrão, no entanto - o navegador da Web no PS3 (baseado no Netfront) não suporta o objeto window, portanto você não pode usá-lo lá.
fonte
Em resumo
windows.onload
não é suportado pelo IE 6-8document.onload
não é suportado por nenhum navegador moderno (o evento nunca é acionado)Mostrar snippet de código
fonte