window.OnLoad vs document.onload [fechado]
-
09-09-2019 - |
Pergunta
que é mais amplamente suportado:? window.onload
ou document.onload
Solução
Quando eles fogo?
- Por padrão, ele é disparado quando toda a página é carregada, incluindo o seu conteúdo (imagens, CSS, scripts, etc.).
Em alguns navegadores agora assume o papel de document.onload
e é acionado quando o DOM está pronto também.
document.onload
- É chamado quando o DOM está pronto que pode ser antes para imagens e outro conteúdo externo é carregado.
Como assim 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ído document.onload
com window.onload
.
problemas de suporte do navegador são mais propensos a razão pela qual muitas pessoas estão começando a usar bibliotecas como jQuery para lidar com a verificação para o documento estar pronto, assim:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
Para efeitos de história. window.onload
vs body.onload
:
Uma pergunta semelhante foi perguntado sobre codingforums um tempo apoiar sobre o uso de
window.onload
sobrebody.onload
. o de resultados parecia ser que você deve usarwindow.onload
porque é boa para separar a estrutura da ação.
Outras dicas
A idéia geral é que o window.onload incêndios quando a janela do documento é pronto para a apresentação e document.onload incêndios quando o DOM árvore (construído a partir do código de marcação dentro do documento) é concluída .
Idealmente, assinando DOM-árvore eventos , permite que fora da tela-manipulações através de JavaScript, incorrendo < strong> quase nenhuma carga da CPU . Contrariamente, window.onload
pode demorar um pouco para o fogo , quando vários recursos externos ainda têm de ser solicitado, analisado e carregado.
cenário ?Test:
Para observar a diferença e como o seu navegador de escolha implementos acima mencionados evento manipuladores , basta inserir o seguinte código no seu documento de - <body>
-. tag
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){
console.log("document.onload", e, Date.now() ,window.tdiff,
(window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) );
}
window.onload = function(e){
console.log("window.onload", e, Date.now() ,window.tdiff,
(window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) );
}
</script>
?Result:
Aqui está o comportamento resultante, observáveis ??para v20 Chrome (e provavelmente navegadores mais atuais).
- No evento
document.onload
. - incêndios
onload
duas vezes quando declarados dentro da<body>
, uma vez que quando declarados dentro da<head>
(onde o evento então age comodocument.onload
). - contagem e agindo dependente do estado do contador permite emular ambos os comportamentos de eventos.
- Em alternativa declarar o manipulador de eventos
window.onload
dentro dos limites do elemento HTML-<head>
.
?Example Projeto:
O código acima foi tirado do base de código (index.html
e keyboarder.js
) deste projeto .
Para obter uma lista de manipuladores de eventos da janela objeto , por favor consulte a documentação do MDN.
Adicionar Listener de eventos
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
// - Code to execute when all DOM content is loaded.
// - including fonts, images, etc.
});
</script>
Update March 2017
1 Vanilla JavaScript
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
2 jQuery
$(window).on('load', function() {
console.log('All assets are loaded')
})
Boa sorte.
De acordo com documentos análise de HTML - O fim ,
-
O navegador analisa o HTML e executa scripts diferidos.
-
A
DOMContentLoaded
é despachado nodocument
quando todo o HTML foi analisado e ter executado. O evento bolhas aowindow
. -
Os recursos navegador carrega (como imagens) que atrasam o evento de carregamento.
-
Um evento
load
é despachado nowindow
.
Portanto, a ordem de execução será
- ouvintes de eventos
DOMContentLoaded
dewindow
na fase de captura - ouvintes de eventos
DOMContentLoaded
dedocument
- ouvintes de eventos
DOMContentLoaded
dewindow
na fase de bolha - ouvintes de eventos
load
(incluindo manipulador de eventosonload
) dewindow
Um ouvinte de evento bolha load
(incluindo manipulador de eventos onload
) em document
nunca deve ser invocado. Apenas captura de ouvintes load
pode ser invocado, mas devido à carga de um sub-recurso como uma folha de estilo, não devido à carga do próprio documento.
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - capture'); // 1st
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - capture'); // 2nd
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - bubble'); // 2nd
});
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - bubble'); // 3rd
});
window.addEventListener('load', function() {
console.log('window - load - capture'); // 4th
}, true);
document.addEventListener('load', function(e) {
/* Filter out load events not related to the document */
if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0)
console.log('document - load - capture'); // DOES NOT HAPPEN
}, true);
document.addEventListener('load', function() {
console.log('document - load - bubble'); // DOES NOT HAPPEN
});
window.addEventListener('load', function() {
console.log('window - load - bubble'); // 4th
});
window.onload = function() {
console.log('window - onload'); // 4th
};
document.onload = function() {
console.log('document - onload'); // DOES NOT HAPPEN
};
No Chrome, window.onload é diferente de <body onload="">
, enquanto eles são os mesmos em ambos os Firefox (versão 35.0) e IE (versão 11).
Você poderia explorar isso pelo seguinte trecho:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--import css here-->
<!--import js scripts here-->
<script language="javascript">
function bodyOnloadHandler() {
console.log("body onload");
}
window.onload = function(e) {
console.log("window loaded");
};
</script>
</head>
<body onload="bodyOnloadHandler()">
Page contents go here.
</body>
</html>
E você vai ver tanto "janela carregado" (que vem em primeiro lugar) e "onload corpo" no console do Chrome. No entanto, você verá apenas "onload corpo" no Firefox e IE. Se você executar "window.onload.toString()
" nos consoles de IE e FF, você verá:
"função onload (event) {bodyOnloadHandler ()}"
O que significa que a atribuição "window.onload = function (e) ..." é substituído.
window.onload
e onunload
são atalhos para document.body.onload
e document.body.onunload
document.onload
e manipulador onload
em todas tag html parece ser reservados no entanto, nunca disparado
'onload
' no documento -> true
window.onload no entanto, eles são muitas vezes a mesma coisa. Da mesma forma body.onload se torna window.onload no IE.
window.onload é o padrão, no entanto -. Navegador da web no PS3 (baseado em Netfront) não suporta o objeto de janela, então você não pode usá-lo lá