Publié le 2 septembre 2004

Sommaire

  1. Que disent les normes officielles ?
  2. Protocole utilisé pour les tests
  3. Résultats des tests
    1. Évènement load sur l’élément BODY
    2. Évènement load enregistré sur le document
    3. Évènement load enregistré sur la fenêtre (window)
  4. À propos de Opera
  5. Références

Commencez le test en vous rendant sur la page suivante : Attribut HTML onload sur l'élément BODY

Que disent les normes officielles ?

Le module Évènements du DOM niveau 2 du W3C (DOM2 Events) définit ainsi l’évènement load :

L’événement load survient quand l’implémentation DOM achève le chargement de tout le contenu d’un document, tous les cadres dans un élément FRAMESET ou OBJECT.

Dans le même temps, l’évènement unload quant à lui est clairement défini comme étant utilisable sur l’élément BODY. Bref, assez flou tout ça…

Le module Évènements du DOM niveau 3 (DOM3 Events) est beaucoup plus clair :

The DOM Implementation finishes loading the resource (such as the document) and any dependent resources (such as images, style sheets, or scripts). Dependent resources that fail to load will not prevent this event from firing if the resource that loaded them is still accessible via the DOM. If this event type is dispatched, implementations are required to dispatch this event at least on the Document node.

Il fournit même la liste précise des éléments HTML sur lesquels peut être enregistré l’évènement load : HTMLDocument, HTMLBodyElement, HTMLFrameSetElement, HTMLObjectElement, HTMLLinkElement, HTMLMetaElement, HTMLScriptElement, HTMLFrameElement, HTMLIFrameElement, HTMLImageElement.

Protocole utilisé pour les tests

Enregistrement de l’évènement sur l’objet HTMLBodyElement (quelque soit le mécanisme)
Le test est réussi si l’évènement est déclenché et que currentTarget et target (ou leurs équivalents dans l’API microsoftienne pour MSIE) référencent l’objet HTMLBodyElement
Enregistrement de l’évènement sur l’objet HTMLDocument (quelque soit le mécanisme)
Le test est réussi si l’évènement est déclenché et que currentTarget et target (ou leurs équivalents dans l’API microsoftienne pour MSIE) référencent l’objet HTMLDocument
Enregistrement de l’évènement sur l’objet Window via l’attribut HTML ou JS onload
Le test est réussi si l’évènement est déclenché et que currentTarget et target (ou leurs équivalents dans l’API microsoftienne pour MSIE) référencent respectivement l’objet Window et l’objet HTMLDocument (en effet, ce n’est pas la fenêtre qui est chargée mais le document). L’enregistrement sur l’objet Window de l’évènement load est ici toléré pour des raisons de compatibilité.
Enregistrement de l’évènement sur l’objet Window via l’API du W3C
Le test est réussi si l’évènement ne se déclenche pas. En effet, l’objet Window ne fait pas partie de la liste donnée dans le module Évènements du DOM niveau 3 (DOM3 Events)

Le jeu de test ne couvre que le support de l’évènement load sur l’élément BODY et sur les objets HTMLDocument et Window.

Résultats des tests

Navigateurs
et versions
body document window
attr. html attr. js DOM attr. js DOM attr. js DOM
Mozilla 1.7 bugué échec échec échec échec OK échec
1.4
MSIE bugué bugué échec échec échec bugué MS
Opera 7.60 OK OK OK OK OK bugué OK
7.23 OK OK OK OK OK bugué OK
Safari 1.3
1.2
1.1
Konqueror xxx

Évènement load sur l’élément BODY

Mozilla ne gère l’évènement load sur l’élément BODY qu’au travers de l’attribut HTML onload. Et encore donne t-il des informations erronées sur l’évènement déclenché puisqu’il indique le document comme cible de l’évènement et la fenêtre comme étant l’objet sur lequel a été enregistré le guetteur (NdM : On ne partage pas mon avis sur le bugtracker de Mozilla. Bug 257556).

Opera gère parfaitement cet évènement et fournit les bonnes informations sur l’évènement déclenché.

IE gère l’évènement load via les attributs HTML et JS onload, par contre, il fournit une information erronée concernant l’objet cible de l’évènement (Pas d’équivalent à currentTarget, et srcElement vaut null).

Évènement load enregistré sur l’objet HTMLDocument

Quelque soit le fonctionnement adopté, ni IE ni Mozilla ne gèrent l’évènement load sur le document. Opera gère parfaitement cela.

Évènement load enregistré sur l’objet Window

Mozilla déclenche l’évènement qu’il soit enregistré via l’attribut JavaScript onload ou l’API du W3C. Les attributs d’évènement currentTarget et target ont les bonnes valeurs.

Opera ne déclenche l’évènement que s’il est enregistré via l’attribut JavaScript onload ou via l’API propriétaire de Microsoft (??). target a la bonne valeur, en revanche, currentTarget référence l’objet HTMLDocument.

Avec IE, srcElement vaut null. L’évènement est également déclenché en passant par l’API propriétaire de Microsoft.

À propos de Opera

Opera est le navigateur qui s’en sort le mieux. Attention cependant, il semble avoir une gestion très tordue de cet évènement. En effet, il ne déclenche pas l’évènement load si vous affichez la page en ayant utilisé le mécanisme précédent ou suivant dans le navigateur, et affiche la page dans l’état exact dans lequel vous l’avez quittée (Modifications faites sur le document par le DOM comprises) ! Encore plus fort, tous les objets initialisés ou modifiés normalement pendant cet évènement sont néanmoins bien présents et utilisables ! Vous pouvez, si vous avez Opera sous la main, constater la chose sur la page Les mystères de Opera.

Le fait que le document et les scripts qui lui sont liés semblent exactement dans le même état que si l’on avait tout simplement pas quitté la page explique pourquoi je n’en ai pas tenu compte dans le tableau des résultats.

Références