Cuándo usar " ventana.onload"?


En JavaScript, cuando quiero ejecutar un script una vez que la página se ha cargado, ¿debo usar window.onload o simplemente escribir el script?

Por ejemplo, si quiero tener una ventana emergente, debo escribir (directamente dentro de la etiqueta <script>):

alert("hello!");

O:

window.onload = function() {
    alert("hello!");
}

Ambos parecen ejecutarse justo después de cargar la página. ¿Cuál es la diferencia?

Author: Jonathan Lam, 2013-11-25

6 answers

El primero solo se ejecuta cuando el navegador llega a él.

El segundo espera a que se cargue la ventana antes de ejecutarla.

En general, debe hacer la segunda, pero debe adjuntar un detector de eventos en lugar de definir la función. Por ejemplo:

window.addEventListener('load', 
  function() { 
    alert('hello!');
  }, false);
 29
Author: Crayon Violent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 01:49:07

Las otras respuestas parecen desactualizadas

En primer lugar, poner scripts en la parte superior y usar window.onload es un anti-patrón. Es sobrante de los días de IE en el mejor o mal entendimientos de JavaScript y el navegador en el peor.

Puedes mover tus scripts al final de tu html

<html>
  <head>
   <title>My Page</title>
  </head> 
  <body>
    content
  </body>
  <script src="some-external.js"></script>
  <script>
    some in page code
  </script>
</html>

La única razón por la que la gente usó window.onload es porque erróneamente creyeron que los scripts debían ir en la sección head. Porque las cosas se ejecutan en orden si su script estaba en la sección head, luego el cuerpo y su contenido aún no existían por definición de ejecutar en orden.

La solución de hacky era usar window.onload para esperar a que el resto de la página se cargara. Mover su script a la parte inferior también resolvió ese problema y ahora no hay necesidad de usar window.onload ya que su cuerpo y contenido ya se habrán cargado.

La solución más moderna es usar la etiqueta defer en sus scripts, pero para usar que sus scripts deben ser todos externo.

<head>
  <script src="some-external.js" defer></script>
  <script src="some-other-external.js" defer></script>
</head>

Esto tiene la ventaja de que el navegador comenzará a descargar los scripts inmediatamente y los ejecutará en el orden especificado, pero esperará a ejecutarlos hasta después de que la página se haya cargado, sin necesidad de window.onload o lo mejor, pero aún innecesario window.addEventListener('load', ...

 6
Author: gman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 02:28:56

Aquí está la documentación de sobre MDN.

Según ella:

El evento load se activa al final del proceso de carga del documento. En este punto, todos los objetos del documento están en el DOM, y todas las imágenes y sub-marcos han terminado de cargarse.

Su primer fragmento de código se ejecutará tan pronto como el navegador llegue a este punto en HTML.

El segundo fragmento de código activará una ventana emergente cuando el DOM y todas las imágenes estén completamente cargadas (consulte specs).

Considerando la función alert(), realmente no importa en qué punto se ejecutará (no depende de nada aparte del objeto window). Pero si desea manipular el DOM - definitivamente debe esperar a que se cargue correctamente.

 4
Author: Slava Fomin II,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 13:32:27

Eso depende de si desea que se ejecute cuando se encuentre el elemento script o si desea que se ejecute cuando se inicie el evento load (que es después de que se haya cargado todo el documento (incluidas cosas como imágenes)).

Ninguno es siempre correcto.

En general, sin embargo, evitaría asignar funciones directamente a onload a favor de usar addEventListener (con bibliotecas de compatibilidad si necesitaba admitir navegadores más antiguos).

 1
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-24 20:02:58

La razón para esperar a que se cargue el DOM es para que pueda apuntar a cualquier elemento que se cargue después de su script. Si solo estás creando un alert, no importa. Digamos, sin embargo, que estaba apuntando a un div que estaba en su marcado después de su script, obtendría un error si no espera hasta que se cargue esa pieza del árbol DOM.

document.ready es una gran alternativa a window.onload si estás usando jQuery.

Ver aquí: ventana.onload vs document (documento).listo()

 1
Author: SeeMeCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:26

Tienes tres alternativas:

  1. Directamente dentro de la etiqueta del script se ejecuta tan pronto como se analiza.

  2. Inside document.addEventListener( "DOMContentLoaded", function(){}); lo ejecutará una vez que el DOM esté listo.

  3. Inside window.onload function(){}) se ejecutará tan pronto como se carguen todos los recursos de la página.

 0
Author: Henrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-24 20:06:09