Ce document est la traduction en français de "XML Events for HTML Authors", une introduction aux Événements XML (21 Juillet 2004).

Ce document est une version traduite qui peut comporter des erreurs. La seule version originale est la version anglaise, qui se trouve à : http://www.w3.org/MarkUp/2004/xmlevents-for-html-authors

W3C

Les Événements XML pour les Auteurs HTML

Steven Pemberton, W3C/CWI

Date de cette version : 21 Juillet 2004

Introduction

Ce document est une introduction rapide aux Événements XML (traduction française) pour les auteurs HTML. Les Événements XML constituent une méthode de capture d'événements dans les langages de balisage, qui offre différents avantages par rapport à la gestion d'événements HTML du style de onclick.

Sommaire

  1. L'Idée de Base
  2. D'autres Manières de Spécifier la Relation
    1. Sur le gestionnaire
    2. Avec <listener>
    3. Sur l'Observateur
  3. Détails précis
    1. phase ("capture" | "default"*)
    2. target
    3. propagate ("stop" | "continue"*)
    4. defaultAction ("cancel" | "perform"*)
  4. Conclusions

L'Idée de Base

La chose importante à savoir à propos des Événements XML est qu'ils utilisent exactement le même mécanisme d'événements que HTML, mais qu'il est juste écrit différemment.

Considérons cet exemple en HTML :

<input type="submit" onclick="verifier(); return true;">

Ceci signifie que si l'élément <input> (ou l'un de ses descendants) reçoit l'événement click, alors la partie de code contenue dans l'attribut onclick est effectuée.

Nous écrivons "ou l'un de ses descendants" parce que dans le cas suivant

<a href="..." onclick="...">Un <em>très</em> beau lieu à visiter</a>

ou

<a href="..." onclick="..."><strong>Plus</strong></a>

l'objectif est que onclick soit effectué même si le clic a en réalité lieu sur les éléments <em> ou <strong>. Dans ce cas, l'élément qui a été cliqué est nommé la cible, et l'élément qui répond à l'événement l'observateur (même si souvent la cible est le même élément que l'observateur).

On voit donc qu'il y a trois éléments importants impliqués : un événement, un observateur, et un morceau de script (appelé un gestionnaire). Comme on peut l'observer dans l'exemple ci-dessus, la quatrième chose, la cible, n'est habituellement pas importante.

La manière dont HTML spécifie la relation liant ces trois éléments pose quelques problèmes :

Les Événements XML spécifient la relation entre l'événement, l'observateur et le gestionnaire d'une manière différente. L'équivalent à :

<input type="submit" onclick="valider(); return true;">

serait :

<input type="submit">
   <script ev:event="DOMActivate" type="text/javascript">
      valider();
   </script>
</input>

(Notez qu'il n'existe pour l'instant aucun langage de balisage qui vous permette d'écrire exactement cela : ces exemples montrent juste quel serait le balisage équivalent, afin d'expliquer les concepts. Il y a quelques liens à la fin de ce document vers des langages qui emploient déjà les Événements XML.)

Ceci signifie que l'élément <script> est un gestionnaire pour l'événement DOMActivate (que l'on utilise de préférence à click, parce que des boutons peuvent être activés de différentes manières, et pas uniquement par des clics) et, en l'absence d'autre information, l'élément parent est l'observateur (<input> dans ce cas).

(Notez que les gestionnaires doivent seulement être évalués lorsque l'événement se produit, et pas lors du chargement du document comme avec <script> en HTML4.)

Cette approche vous permet maintenant de spécifier des gestionnaires pour différents langages de scripting :

<input type="submit">
   <script ev:event="DOMActivate" type="text/javascript">
      ...
   </script>
   <script ev:event="DOMActivate" type="text/vbs">
      ...
   </script>
</input>

et/ou différents événements :

<input type="submit">
   <script ev:event="DOMActivate" type="text/javascript">
      ...
   </script>
   <script ev:event="DOMFocusIn" type="text/javascript">
      ...
   </script>
</input>

Vous en savez maintenant suffisament pour faire de la gestion d'événements en utilisant les Événements XML. Cependant, il existe quelques autres caractéristiques utiles.

D'autres Manières de Spécifier la Relation

Exactement comme avec HTML, il y a d'autres manières de spécifier la relation événement-observateur-gestionnaire. Vous pouvez placer l'information sur le gestionnaire, sur l'observateur, ou dans un élément <écouteur>. Notez que, quelle que soit la méthode que vous employez, vous devez toujours spécifier les trois parties. Ainsi, si vous utilisez le gestionnaire, vous devez définir l'événement et l'observateur, si vous utilisez l'observateur vous devez préciser quels sont l'événement et le gestionnaire, et avec l'<écouteur> vous devez spécifier les trois.

Le principal motif de cette action est de gérer plus aisément vos documents. Vous pouvez séparer tout le scripting du corps principal de votre document. Cela vous permet également d'éviter la multiplication nombre de gestionnaires, en ayant juste un exemplaire de chaque gestionnaire, que vous pouvez appliquer à différents endroits.

Spécifier la Relation sur le Gestionnaire

Dans ce cas, vous placez le gestionnaire à un certain endroit de votre document, et vous spécifiez la relation à cet endroit (de la même manière que certaines versions de HTML utilisent l'attribut for sur l'élément <script>) :

 <script ev:observer="bouton" ev:event="DOMActivate" type="text/javascript">
      valider();
 </script>
...
<input type="submit" id="bouton"/>

Spécifier la Relation avec <listener>

Dans ce cas, vous placez également le gestionnaire quelque part, et spécifiez la relation à un autre endroit à l'aide de l'élément <listener> (ce qui permet d'utiliser le même gestionnaire pour plus d'un observateur) :

<ev:listener observer="bouton" handler="#validateur" event="DOMActivate"/>
...
<script id="validateur" type="text/javascript">
      valider();
</script>
...
<input type="submit" id="bouton"/>

(Notez que dans ce cas c'est l'élément <listener> qui porte le préfixe ev:, et non les attributs.)

Spécifier la Relation sur l'Observateur

Et, enfin, vous pouvez préciser la relation au niveau de l'observateur :

<script id="validateur" type="text/javascript">
      valider();
</script>
...
<input type="submit" ev:handler="#validateur" ev:event="DOMActivate"/>

Détails précis

C'est réellement tout ce que vous devez savoir pour une utilisation quotidienne des événements. Il y a toutefois quelques détails qui peuvent occasionnellement être utiles.

phase ("capture" | "default"*)

Étant donné que les gestionnaires d'événement sont appelés pour un élément ou l'un de ses descendants, il est par exemple possible d'écouter tous les clics sur le contenu d'un paragraphe :

<p>
    <script ev:event="DOMActivate" type="...">
        ...
    </script>
    ...
    <a href="...">...</a>
    ...
    <a href="...">...</a>
    ...
</p>

ce qui permettra de réagir aux clics sur chaque <a> contenu dans le paragraphe (ainsi que sur tout le reste du contenu du paragraphe).

Cependant, étant donné que les éléments <a> peuvent également porter des gestionnaires, l'attribut phase est utilisé afin de préciser si un gestionnaire donné doit être activé avant ou après les gestionnaires situés plus bas dans l'arbre. Normalement, les gestionnaires situés plus bas dans l'arbre pour un événement sont activés en premier, mais l'attribut ev:phase="capture" permet de faire exécuter un gestionnaire situé plus haut dans l'arbre avant ceux situés plus bas pour un même événement :

<p>
    <script ev:event="DOMActivate" ev:phase="capture" type="...">
        <!-- Ce gestionnaire sera exécuté avant tout autre gestionnaire plus bas dans l'arbre -->
        ...
    </script>
    ...
    <a href="...">...</a>
    ...
    <a href="...">...</a>
    ...
</p>

target

Si c'est vraiment un élément particulier qui doit être la cible, vous pouvez préciser que vous écoutez uniquement les événements pour cet élément :

<p>
    <script ev:event="DOMActivate" ev:target="img1" type="...">
        ...
    </script>
    ...
    <a href="..."><img id="img1" ... /><img id="img2" ... /></a>
</p>

(Gardez à l'esprit que la cible est l'objet cliqué, qui n'a haituellement pas une grande importance.)

propagate ("stop" | "continue"*)

Les gestionnaires d'événements pour un événement sont parcourus dans l'ordre suivant : en premier tous les gestionnaires ayant ev:phase="capture", en commençant en haut de l'arbre, puis en descendant jusqu'à l'élément père de la cible, et ensuite tous les autres gestionnaires, en partant de l'élément cible, et en remontant vers le haut de l'arbre.

Si un gestionnaire a l'attribut ev:propagate="stop", aucun gestionnaire situé après ceux de l'élément courant ne sera appelé pour l'événement courant.

<body>
    <script ev:event="DOMActivate" ev:propagate="stop" ev:phase="capture" type="...">
        <!-- Ce script est le seul qui réagira à DOMActivate -->
        ...
    </script>
    ...
</body>

Soit dit en passant, s'il y a plus d'un gestionnaire sur un élément pour un même événement, l'ordre dans lequel ils sont effectués est indéterminé.

defaultAction ("cancel" | "perform"*)

De nombreux événements ont une action par défaut (default action) qui est exécutée après que tous les gestionnaires de l'événement dans l'arbre ont été effectués. Par exemple, un clic sur un bouton provoquera l'activation du bouton, tandis qu'un clic sur un <a> ou l'un de ses enfants provoquera l'activation du lien. Il est possible d'arrêter cette action par défaut avec l'attribut ev:defaultAction="cancel".

<input type="submit" ...>
    <script ev:event="DOMActivate" ev:defaultAction="cancel" type="...">
        <!-- Ce script sera actif, mais l'action par défaut ne sera pas effectuée -->
        ...
    </script>
</input>

(C'est ce que onclick="...; return=false;" fait en HTML4. Si vous voulez le faire de façon conditionnelle dans les Événements XML, vous devez convenablement appeler la méthode DOM preventDefault.)

Conclusions

Cette introduction vous a montré comment faire de la gestion d'événements en XML. Comme précisé ci-dessus, il n'existe pour l'instant aucune version de XHTML qui supporte les Événements XML avec le scripting ; XHTML2 est en préparation. XForms utilise les Événements XML (même si c'est avec son propre élément <action> au lieu de <script>) ; d'autres langages utilisant les Événements XML sont XHTML+Voice (également connu sous le nom X+V), et SVG 1.2 (également en préparation).