Qual é exatamente a diferença entre o window.onload
evento e o onload
evento da body
tag? quando uso qual e como deve ser feito corretamente?
javascript
Manu
fonte
fonte
Respostas:
window.onload = myOnloadFunc
e<body onload="myOnloadFunc();">
são diferentes maneiras de usar o mesmo evento . O usowindow.onload
é menos invasivo - remove o JavaScript do HTML.Todas as bibliotecas JavaScript comuns, Prototype, ExtJS, Dojo, JQuery, YUI, etc. fornecem wrappers agradáveis em torno de eventos que ocorrem quando o documento é carregado. Você pode ouvir o evento onLoad da janela e reagir a isso, mas o onLoad não é acionado até que todos os recursos tenham sido baixados; portanto, seu manipulador de eventos não será executado até que a última imagem enorme seja obtida. Em alguns casos, é exatamente isso que você deseja; em outros, você pode achar que ouvir quando o DOM está pronto é mais apropriado - esse evento é semelhante ao onLoad, mas é acionado sem aguardar o download das imagens, etc.
fonte
myOnloadFunc()
no contexto global (this
se referirá awindow
). A configuração via javascript fará com que seja executado no contexto do elemento (this
refere-se ao elemento no qual o evento foi disparado). Nesse caso em particular, não fará diferença, mas fará com outros elementos.this
se refere, se desejado.Não há diferença, mas você também não deve usar.
Em muitos navegadores, o
window.onload
evento não é acionado até que todas as imagens sejam carregadas, o que não é o que você deseja. Navegadores baseados em padrões têm um evento chamadoDOMContentLoaded
que é disparado anteriormente, mas não é suportado pelo IE (no momento em que escrevemos esta resposta). Eu recomendo usar uma biblioteca javascript que ofereça suporte a um recurso DOMContentLoaded entre navegadores ou encontrar uma função bem escrita que você possa usar. jQuery$(document).ready()
, é um bom exemplo.fonte
window.onload
pode trabalhar sem corpo. Crie uma página apenas com as tags de script e abra-a em um navegador. A página não contém nenhum corpo, mas ainda funciona ..fonte
<!ELEMENT html (head, body)>
[1] - e html401 especifica também<!ELEMENT HTML O O (%html.content;)
com<!ENTITY % html.content "HEAD, BODY">
[2]. O html51 também indica oA head element followed by a body element.
conteúdo html. [3] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/html51/semantics.html#the -html-element - Então eu acho que todos esses padrões HTML comum / em uso fazer exigem uma tag corpo. :)Start tag: optional, End tag: optional
Eu prefiro, geralmente, não usar o
<body onload=""
evento>. Eu acho que é mais limpo manter o comportamento separado do conteúdo, tanto quanto possível.Dito isto, há ocasiões (geralmente bastante raras para mim) em que o uso da carga corporal pode dar um pequeno aumento de velocidade.
Eu gosto de usar o Prototype, então geralmente coloco algo assim
<head
> na minha página:ou
O acima são truques que aprendi aqui . Gosto muito do conceito de anexar manipuladores de eventos fora do HTML.
(Edite para corrigir o erro de ortografia no código.)
fonte
'tantas respostas subjetivas para uma pergunta objetiva. JavaScript "discreto" é uma superstição como a regra antiga de nunca usar gotos. Escreva o código de uma maneira que o ajude a atingir seu objetivo de maneira confiável, não de acordo com as crenças religiosas da moda de alguém.
Quem encontrar:
distrair demais é excessivamente pretensioso e não tem suas prioridades em ordem.
Normalmente, coloco meu código JavaScript em um arquivo .js separado, mas não encontro nada complicado em conectar manipuladores de eventos em HTML, que é um HTML válido por sinal.
fonte
window.onload
- Chamado após todos os arquivos DOM, JS, imagens, iframes, extensões e outros completamente carregados. Isso é igual a $ (window) .load (function () {});body onload=""
- Chamado uma vez que o DOM foi carregado. Isso é igual a $ (document) .ready (function () {});fonte
ready
vs. é acionado após o carregamento do documento inteiro, incluindo todos os scripts, imagens e folhas de estilo. dispara depois que a árvore do DOM foi criada, mas antes das imagens etc. É a que tem equivalência , não .onload
load
DOMContentLoaded
DOMContentLoaded
document.ready
load
Não há diferença ...
Então, principalmente, você pode usar os dois (um de cada vez! -)
Mas, para facilitar a leitura e a limpeza do código html, eu sempre prefiro o window.onload! O]
fonte
Se você está tentando escrever um código JS discreto (e deveria), não deve usar
<body onload="">
.Entendo que navegadores diferentes lidam com esses dois de maneira um pouco diferente, mas eles operam da mesma forma. Na maioria dos navegadores, se você definir os dois, um será ignorado.
fonte
Pense em onload como qualquer outro atributo. Em uma caixa de entrada, por exemplo, você pode colocar:
Ou você pode ligar para:
O atributo onload funciona da mesma maneira, exceto pelo fato de ter uma função como seu valor, em vez de uma string como o atributo value. Isso também explica por que você pode "usar apenas um deles" - chamar window.onload reatribui o valor do atributo onload para a tag body.
Além disso, como outros aqui estão dizendo, geralmente é mais fácil manter o estilo e o javascript separados do conteúdo da página, e é por isso que a maioria das pessoas aconselha o uso do window.onload ou da função pronta do jQuery.
fonte
<body onload = ""> deve substituir window.onload.
Com <body onload = "">, document.body.onload pode ser nulo, indefinido ou uma função dependendo do navegador (embora getAttribute ("onload") deva ser um pouco consistente para obter o corpo da função anônima como uma string) . Com window.onload, quando você atribui uma função a ela, window.onload será uma função consistente nos navegadores. Se isso lhe interessa, use window.onload.
window.onload é melhor para separar o JS do seu conteúdo de qualquer maneira. Não há muitas razões para usar <body onload = ""> de qualquer maneira quando você pode usar window.onload.
No Opera, o destino do evento para window.onload e <body onload = ""> (e até window.addEventListener ("load", func, false)) será a janela em vez do documento, como no Safari e Firefox. Mas, 'this' será a janela entre os navegadores.
O que isso significa é que, quando for importante, você deve agrupar as coisas e tornar as coisas consistentes ou usar uma biblioteca que faça isso por você.
fonte
Ambos trabalham da mesma maneira. No entanto, observe que, se os dois estiverem definidos, apenas um deles será chamado. Eu geralmente evito usar qualquer um deles diretamente. Em vez disso, você pode anexar um manipulador de eventos ao evento load. Dessa forma, você pode incorporar mais facilmente outros pacotes JS que também podem precisar anexar um retorno de chamada ao evento onload.
Qualquer estrutura JS terá métodos entre navegadores para manipuladores de eventos.
fonte
É um padrão aceito separar conteúdo, layout e comportamento. Portanto, window.onload () será mais adequado para uso do que
<body onload="">
se ambos fizerem o mesmo trabalho.fonte
Desculpe pela reencarnação desse tópico novamente depois de mais 3 anos de sono, mas talvez eu finalmente tenha encontrado o benefício indiscutível de
window.onload=fn1;
mais<body onload="fn1()">
. Trata-se dos módulos JS ou ES : quando oonload
manipulador reside no arquivo JS "clássico" (ou seja, referido sem<script type="module" … >
, de qualquer forma é possível; quando oonload
manipulador reside no arquivo JS "módulo" (ou seja, referido<script type="module" … >
, o<body onload="fn1()">
erro ocorre com "fn1 () não está definido "error. O motivo talvez seja que os módulos ES não são carregados antes que o HTML seja analisado ... mas é apenas o meu palpite. De qualquer forma,window.onload=fn1;
funciona perfeitamente com os módulos ...fonte