¿Cuál es exactamente la diferencia entre el window.onload
evento y el onload
evento de la body
etiqueta? ¿Cuándo uso cuál y cómo se debe hacer correctamente?
javascript
Manu
fuente
fuente
Respuestas:
window.onload = myOnloadFunc
y<body onload="myOnloadFunc();">
son diferentes formas de usar el mismo evento . Utilizandowindow.onload
embargo, el es menos molesto: elimina su JavaScript del HTML.Todas las bibliotecas comunes de JavaScript, Prototype, ExtJS, Dojo, JQuery, YUI, etc. proporcionan buenos envoltorios alrededor de los eventos que ocurren cuando se carga el documento. Puede escuchar la ventana del evento onLoad y reaccionar a eso, pero onLoad no se activa hasta que se hayan descargado todos los recursos, por lo que su controlador de eventos no se ejecutará hasta que se haya recuperado la última gran imagen. En algunos casos, eso es exactamente lo que desea, en otros puede encontrar que escuchar cuando el DOM está listo es más apropiado: este evento es similar a onLoad pero se dispara sin esperar a que se descarguen las imágenes, etc.
fuente
myOnloadFunc()
en el contexto global (this
se referirá awindow
). Al configurarlo a través de JavaScript, se ejecutará en el contexto del elemento (sethis
refiere al elemento en el que se activó el evento). En este caso particular, no hará la diferencia, pero sí con otros elementos.this
refiere si lo desea.No hay diferencia, pero tampoco debes usarlo.
En muchos navegadores, el
window.onload
evento no se activa hasta que se hayan cargado todas las imágenes, que no es lo que desea. Los navegadores basados en estándares tienen un evento llamadoDOMContentLoaded
que se activa antes, pero IE no lo admite (al momento de escribir esta respuesta). Recomiendo usar una biblioteca de JavaScript que admita una función DOMContentLoaded de navegador cruzado, o encontrar una función bien escrita que pueda usar. jQuery's$(document).ready()
, es un buen ejemplo.fuente
window.onload
Puede trabajar sin cuerpo. Cree una página con solo las etiquetas de script y ábrala en un navegador. La página no contiene ningún cuerpo, pero aún funciona.fuente
<!ELEMENT html (head, body)>
[1] - y html401 también especifica<!ELEMENT HTML O O (%html.content;)
con<!ENTITY % html.content "HEAD, BODY">
[2]. html51 indica también elA head element followed by a body element.
contenido 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-elemento - Así que supongo que todas esas normas comunes de HTML / en uso hacerlo requeriría un cuerpo de la etiqueta. :)Start tag: optional, End tag: optional
Prefiero, en general, no usar el
<body onload=""
evento>. Creo que es más limpio mantener el comportamiento separado del contenido tanto como sea posible.Dicho esto, hay ocasiones (generalmente bastante raras para mí) en las que usar la carga corporal puede aumentar ligeramente la velocidad.
Me gusta usar Prototype, así que generalmente pongo algo como esto en el
<head
> de mi página:o
Los anteriores son trucos que aprendí aquí . Soy muy aficionado al concepto de controladores de eventos adjuntos fuera del HTML.
(Editar para corregir el error de ortografía en el código).
fuente
'tantas respuestas subjetivas a una pregunta objetiva. JavaScript "discreto" es una superstición como la antigua regla de nunca usar gotos. Escriba el código de una manera que lo ayude a lograr su objetivo de manera confiable, no de acuerdo con las creencias religiosas modernas de alguien.
Cualquiera que encuentre:
ser demasiado molesto es demasiado pretencioso y no tiene sus prioridades claras.
Normalmente pongo mi código JavaScript en un archivo .js separado, pero no encuentro nada engorroso enganchar controladores de eventos en HTML, que por cierto es HTML válido.
fuente
window.onload
- Llamado después de todos los archivos DOM, JS, imágenes, marcos flotantes, extensiones y otros completamente cargados. Esto es igual a $ (ventana) .load (function () {});body onload=""
- Llamado una vez que DOM cargado. Esto es igual a $ (documento) .ready (function () {});fuente
ready
vs. se activa después de cargar todo el documento, incluidos todos los scripts, imágenes y hojas de estilo. se dispara después de que se haya construido el árbol DOM pero antes de las imágenes, etc. Esto tiene equivalencia con , no .onload
load
DOMContentLoaded
DOMContentLoaded
document.ready
load
No hay diferencia ...
Así que, en principio, podrías usar ambos (¡uno a la vez! -)
Pero en aras de la legibilidad y la limpieza del código html, siempre prefiero la ventana.onload! O]
fuente
Si está intentando escribir código JS discreto (y debería serlo), entonces no debería usarlo
<body onload="">
.Tengo entendido que diferentes navegadores manejan estos dos de manera ligeramente diferente, pero funcionan de manera similar. En la mayoría de los navegadores, si define ambos, se ignorará uno.
fuente
Piense en la carga como cualquier otro atributo. En un cuadro de entrada, por ejemplo, podría poner:
O puedes llamar:
El atributo onload funciona de la misma manera, excepto que toma una función como su valor en lugar de una cadena como lo hace el atributo de valor. Eso también explica por qué puede "usar solo uno de ellos": al llamar a window.onload reasigna el valor del atributo onload para la etiqueta body.
Además, como dicen otros aquí, generalmente es más limpio mantener el estilo y javascript separados del contenido de la página, razón por la cual la mayoría de las personas recomiendan usar window.onload o como la función lista de jQuery.
fuente
<body onload = ""> debería anular window.onload.
Con <body onload = "">, document.body.onload puede ser nulo, indefinido o una función que depende del navegador (aunque getAttribute ("onload") debería ser algo consistente para obtener el cuerpo de la función anónima como una cadena) . Con window.onload, cuando le asigna una función, window.onload será una función consistente en todos los navegadores. Si eso te importa, usa window.onload.
window.onload es mejor para separar el JS de su contenido de todos modos. No hay muchas razones para usar <body onload = ""> de todos modos cuando puedes usar window.onload.
En Opera, el destino del evento para window.onload y <body onload = ""> (e incluso window.addEventListener ("load", func, false)) será la ventana en lugar del documento como en Safari y Firefox. Pero, 'esto' será la ventana a través de los navegadores.
Lo que esto significa es que, cuando es importante, debe envolver la basura y hacer que las cosas sean consistentes o usar una biblioteca que lo haga por usted.
fuente
Ambos trabajan igual. Sin embargo, tenga en cuenta que si ambos están definidos, solo se invocará uno de ellos. Generalmente evito usar cualquiera de ellos directamente. En su lugar, puede adjuntar un controlador de eventos al evento de carga. De esta manera, puede incorporar más fácilmente otros paquetes JS que también podrían necesitar adjuntar una devolución de llamada al evento de carga.
Cualquier marco JS tendrá métodos de navegador cruzado para controladores de eventos.
fuente
Es un estándar aceptado tener contenido, diseño y comportamiento separados. Entonces window.onload () será más adecuado para usar que
<body onload="">
aunque ambos hagan el mismo trabajo.fuente
Perdón por la reencarnación de este hilo nuevamente después de otros 3 años de sueño, pero quizás finalmente encontré el beneficio indiscutible de
window.onload=fn1;
terminar<body onload="fn1()">
. Se trata de los módulos JS o módulos ES : cuando suonload
controlador reside en el archivo JS "clásico" (es decir, se refiere sin<script type="module" … >
, de cualquier manera es posible; cuando suonload
controlador reside en el archivo JS "módulo" (es decir, se refiere<script type="module" … >
,<body onload="fn1()">
fallará con "fn1) () no está definido "error. La razón quizás es que los módulos ES no se cargan antes de analizar HTML ... pero es solo mi suposición. De todos modos,window.onload=fn1;
funciona perfectamente con módulos ...fuente