246 votes

window.onload vs <body onload=""/>

Quelle est la différence exacte entre le window.onload et l'événement onload de l'événement body tag ? quand dois-je utiliser lequel et comment le faire correctement ?

2 votes

Vous devez utiliser " pour entourer la valeur de l'attribut

235voto

Richard Turner Points 3035

window.onload = myOnloadFunc y <body onload="myOnloadFunc();"> sont différentes façons d'utiliser le même événement . Utilisation de window.onload est cependant moins gênant - il retire votre JavaScript du HTML.

Toutes les bibliothèques JavaScript courantes (Prototype, ExtJS, Dojo, JQuery, YUI, etc.) fournissent de jolis wrappers autour des événements qui se produisent lors du chargement du document. Vous pouvez écouter l'événement onLoad de la fenêtre et y réagir, mais onLoad n'est pas déclenché tant que toutes les ressources n'ont pas été téléchargées, de sorte que votre gestionnaire d'événements ne sera pas exécuté avant que la dernière grande image n'ait été récupérée. Dans certains cas, c'est exactement ce que vous voulez, dans d'autres, vous trouverez peut-être qu'il est plus approprié d'écouter lorsque le DOM est prêt - cet événement est similaire à onLoad mais se déclenche sans attendre le téléchargement des images, etc.

63 votes

Il convient toutefois de noter qu'il existe une différence. L'événement onload en ligne va appeler myOnloadFunc() dans le contexte global ( this se référera à window ). Si vous le définissez via javascript, il sera exécuté dans le contexte de l'élément ( this fait référence à l'élément sur lequel l'événement a été déclenché). Dans ce cas particulier, cela ne fera pas de différence, mais cela en fera une avec d'autres éléments.

1 votes

@Walkerneo : Oui, ça vaut vraiment la peine de le noter. Bien sûr, en utilisant une bibliothèque JS on peut remplacer l'objet que this fait référence si vous le souhaitez.

0 votes

@RichardTurner Vous n'avez pas besoin d'utiliser une bibliothèque pour modifier la liaison du contexte. Un simple appel à .bind() le fait.

37voto

jcampbell1 Points 1888

Il n'y a pas de différence, mais vous ne devriez utiliser ni l'un ni l'autre.

Dans de nombreux navigateurs, l'élément window.onload n'est pas déclenché tant que toutes les images ne sont pas chargées, ce qui n'est pas ce que vous souhaitez. Les navigateurs basés sur les normes ont un événement appelé DOMContentLoaded qui se déclenche plus tôt, mais il n'est pas pris en charge par IE (au moment de la rédaction de cette réponse). Je vous recommande d'utiliser une bibliothèque javascript qui prend en charge la fonction DOMContentLoaded pour tous les navigateurs ou de trouver une fonction bien écrite que vous pouvez utiliser. $(document).ready() est un bon exemple.

59 votes

Question du futur... Que faire s'il n'y a pas de jquery ?

57 votes

Question du présent.. Que faire si jQuery est excessif pour le projet en cours ? (Je ne critique pas jQuery, je l'utilise moi-même. C'est juste que parfois on ne veut qu'une seule fonctionnalité d'une bibliothèque )

14 votes

Lorsque vous dites "non pris en charge par IE", est-ce une vérité universelle, ou seulement pour des versions spécifiques d'IE ? Comme beaucoup de choses ont changé dans le monde des navigateurs depuis que vous avez écrit cette réponse, il est peut-être temps de la mettre à jour ?

23voto

john Joseph Points 121

window.onload peut fonctionner sans corps. Créez une page avec seulement les balises script et ouvrez-la dans un navigateur. La page ne contient pas de corps, mais elle fonctionne quand même..

<script>
  function testSp()
  {
    alert("hit");
  }
  window.onload=testSp;
</script>

6 votes

Le HTML sans la balise body n'est pas valide si vous ajoutez réellement du contenu (qui devrait être dans une balise body). De même, il manque un type à votre balise script. Ne comptez jamais sur les navigateurs pour corriger votre code non conforme aux normes ! (Car les navigateurs peuvent le faire différemment ou pas du tout dans le passé ou dans le futur).

4 votes

@Kissaki : Le HTML standard n'a pas besoin de balise body du tout !

5 votes

Xhtml1 précise <!ELEMENT html (head, body)> [1] - et html401 précise <!ELEMENT HTML O O (%html.content;) con <!ENTITY % html.content "HEAD, BODY"> également [2]. html51 déclare A head element followed by a body element. pour le contenu html également. [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 -- Donc je suppose que toutes ces normes HTML communes ou utilisées faire nécessite une balise body :)

10voto

Autant de réponses subjectives à une question objective. Le JavaScript "discret" est une superstition comme la vieille règle de ne jamais utiliser de gotos. Écrivez du code d'une manière qui vous aide à atteindre votre objectif de façon fiable, pas selon les croyances religieuses à la mode de quelqu'un.

Toute personne qui trouve :

 <body onload="body_onload();">

pour être excessivement distrayant est excessivement prétentieux et n'a pas ses priorités.

Normalement, je place mon code JavaScript dans un fichier .js distinct, mais je ne trouve rien d'encombrant à accrocher des gestionnaires d'événements dans le HTML, qui est d'ailleurs un HTML valide.

10voto

Mark Biek Points 41769

Je préfère généralement no utiliser le <body onload="" > événement. Je pense qu'il est plus propre de séparer autant que possible le comportement du contenu.

Cela dit, il y a des occasions (généralement assez rares pour moi) où l'utilisation du corps en charge peut donner un léger gain de vitesse.

J'aime utiliser Prototype, donc je mets généralement quelque chose comme ceci dans le fichier <head > de ma page :

document.observe("dom:loaded", function(){
  alert('The DOM is loaded!');
});

ou

Event.observe(window, 'load', function(){
  alert('Window onload');
});

Ce sont des astuces que j'ai apprises aquí . J'aime beaucoup le concept d'attacher des gestionnaires d'événements en dehors du HTML.

(Modifier pour corriger une faute d'orthographe dans le code).

0 votes

Dans quelles occasions serait-il plus rapide, et pourquoi ?

0 votes

Cette réponse semble très subjective avec tous les "je" ("je préfère", "je pense"). Le fait qu'elle manque en outre de faits objectifs et vérifiables confirme cette impression.

1 votes

Je prendrais cette réponse avec un grain de sel étant donné qu'elle a été postée il y a plus de 6 ans. Vous êtes plus que bienvenu pour la mettre à jour ou poster votre propre réponse améliorée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X