Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Événements DOM

Les événements DOM sont déclenchés pour notifier au code des « changements intéressants » qui peuvent affecter l'exécution du code. Ces changements peuvent résulter d'interactions avec l'utilisateur, comme l'utilisation de la souris ou le redimensionnement d'une fenêtre, de changements dans l'état de l'environnement sous-jacent (par exemple, une batterie faible ou des événements médiatiques provenant du système d'exploitation), et d'autres causes.

Chaque événement est représenté par un objet implémentant l'interface Event, et peut avoir d'autres propriétés et/ou champs, permettant d'obtenir des informations supplémentaires au sujet de ce qui s'est produit. La documentation de chaque événement comporte un tableau (en haut de la page) qui comprend un lien vers l'interface de l'événement associé et d'autres informations pertinentes. Une liste complète des différents types d'événements est donnée dans Event >Événement Interfaces basées sur.

Cette rubrique fournit un index des principales sortes d'événements qui peuvent vous intéresser (animation, presse-papiers, workers, etc.) ainsi que les principales classes qui implémentent ces sortes d'événements. À la fin se trouve une liste exhaustive de tous les événements documentés.

Index des événements

Type d'événement Description Documentation
Animation

Les événements liés à l'API Web Animation API.

Utilisé pour répondre aux changements d'état de l'animation (par exemple, lorsqu'une animation commence ou se termine).

Événements d'animation déclenchés sur Document, Window, HTMLElement.
Récupération asynchrone des données

Événements liés à l'extraction des données.

Événements déclenchés sur AbortSignal, XMLHttpRequest, FileReader.
Presse-papiers

Les événements liés à l'API Clipboard API.

Utilisé pour notifier lorsque le contenu est coupé, copié ou collé.

Événements déclenchés sur Document, Element, Window.
Composition

Événements liés à la composition ; saisie "indirecte" du texte (au lieu d'utiliser les touches normales du clavier).

Par exemple, un texte saisi via un moteur de conversion de la parole en texte, ou l'utilisation de combinaisons de touches spéciales qui modifient les pressions sur le clavier pour représenter de nouveaux caractères dans une autre langue.

Événements déclenchés sur Element.
Transition CSS

Événements liés aux Transitions CSS.

Fournit des événements de notification lorsque les transitions CSS commencent, s'arrêtent, sont annulées, etc.

Événements déclenchés sur Document, HTMLElement, Window.
Base de données

Événements liés aux opérations de la base de données : ouverture, fermeture, transactions, erreurs, etc.

Événements déclenchés sur IDBDatabase, IDBOpenDBRequest, IDBRequest, IDBTransaction.
Mutation du DOM

Événements liés aux modifications de la hiérarchie et des nœuds du Document Object Model (DOM).

Avertissement : Mutation Events sont dépréciés. L'API Mutation Observers doit être utilisé à la place.

Glisser/Déposer, Roue

Les événements liés à l'utilisation de l'API Glisser/Déposer et WheelEvent.

Les événements Glisser/Déposer et Roue sont dérivés des événements de la souris. Bien qu'ils soient déclenchés lors de l'utilisation de la molette de la souris ou du glisser/déposer, ils peuvent également être utilisés avec d'autres matériels appropriés.

Les événements de Glisser/Déposer déclenchés sur Document

Les événements de la Roue déclenchés sur Document et Element

Ciblage

Les événements liés aux éléments qui gagnent et perdent la sélection.

Événements déclenchés sur Element, Window.
Formulaire

Événements liés à la construction, la réinitialisation et la soumission de formulaires.

Événements déclenchés sur HTMLFormElement.
Plein écran

Evénements relatifs à l'API Fullscreen API.

Utilisé pour notifier la transition entre le mode plein écran et le mode fenêtré, ainsi que les erreurs survenant pendant cette transition.

Événements déclenchés sur Document, Element.
Manette de jeu

Evénements relatifs à l'API Gamepad API.

Événements déclenchés sur Window.
Gestes

Les événements tactiles sont recommandés pour la mise en œuvre des gestes.

Événements déclenchés sur Document, Element.

En outre, il existe un certain nombre d'événements de geste non standard :

Historique

Les événements liés à l'API de Manipulation de l'historique du navigateur.

Événements déclenchés sur Window.
Gestion de l'affichage du contenu des éléments HTML

Événements liés à la modification de l'état d'un élément d'affichage ou textuel.

Événements déclenchés sur HTMLDetailsElement, HTMLDialogElement, HTMLSlotElement.
Entrées

Événements liés aux éléments d'entrée HTML, par ex. <input>, <select>, ou <textarea>.

Événements déclenchés sur HTMLElement, HTMLInputElement.
Clavier

Événements liés à l'utilisation d'un clavier.

Utilisé pour notifier lorsque les touches sont déplacées vers le haut, vers le bas, ou simplement pressées.

Événements déclenchés sur Document, Element.
Manifeste

Événements liés à l'installation de Manifeste des applications web.

Événements déclenchés sur Window.
Médias

Événements liés à l'utilisation des médias (y compris l'API de capture et de diffusion de médias, Web Audio API, Picture-in-Picture API, etc.).

Événements déclenchés sur ScriptProcessorNode, HTMLMediaElement, AudioTrackList, AudioScheduledSourceNode, MediaRecorder, MediaStream, MediaStreamTrack, VideoTrackList, HTMLTrackElement, OfflineAudioContext, TextTrack, TextTrackList, Element/audio, Element/video.
Messagerie

Événements liés à la réception par une fenêtre d'un message provenant d'un autre contexte de navigation.

Événements déclenchés sur Window.
Souris

Événements liés à l'utilisation d'une souris d'ordinateur.

Utilisé pour notifier le clic de la souris, le double-clic, les événements haut et bas, le clic droit, le déplacement dans et hors d'un élément, la sélection de texte, etc.

Les événements de type pointeur constituent une alternative aux événements de type souris, indépendamment du matériel utilisé. Les événements de type "glisser" et "roue" sont dérivés des événements de type "souris".

Les événements de souris déclenchés sur Element
Réseau/Connexion

Événements liés à l'obtention et à la perte d'une connexion réseau.

Événements déclenchés sur Window.

Événements déclenchés sur NetworkInformation (Network Information API).

Paiements

Les événements liés à l'API Payment Request API.

Événements déclenchés sur PaymentRequest, PaymentResponse.

Performance

Événements liés aux APIs Performance API.

Événements déclenchés sur Performance.

Pointeur

Les événements liés à l'API Pointer Events API.

Fournit une notification agnostique du matériel à partir des dispositifs de pointage, y compris la souris, la souris tactile, le stylo/stylet.

Événements déclenchés sur Document, HTMLElement.
Impression

Événements liés à l'impression.

Événements déclenchés sur Window.
Rejet de promesse

Événements envoyés au contexte global du script lorsqu'une promesse JavaScript est rejetée.

Événements déclenchés sur Window.
Sockets

Les événements liés à l'API WebSockets API.

Événements déclenchés sur Websocket.
SVG

Événements liés aux images SVG.

Événements déclenchés sur SVGElement, SVGAnimationElement, SVGGraphicsElement.

Sélection de texte

Événements liés à la sélection du texte.

Événements déclenchés sur Document.

Tactile

Les événements liés à l'API Événements tactiles.

Fournit des événements de notification provenant de l'interaction avec un écran tactile (c'est-à-dire l'utilisation d'un doigt ou d'un stylet). Non lié à l'API Force Touch API.

Événements déclenchés sur Document, Element.
Réalité virtuelle

Les événements liés à l'API WebXR Device API.

Note : L'API WebVR API (et les événements associés à Window) sont dépréciés.

Événements déclenchés sur XRSystem, XRSession, XRReferenceSpace.
RTC (communication en temps réel)

Les événements liés à l'API WebRTC API.

Événements déclenchés sur RTCDataChannel, RTCDTMFSender, RTCIceTransport, RTCPeerConnection.
Événements envoyés par le serveur

Les événements liés à l'API des événements envoyés par le serveur.

Événements déclenchés sur EventSource.
Synthèse vocale

Les événements liés à l'API Web Speech API.

Événements déclenchés sur SpeechSynthesisUtterance.
Workers

Les événements liés aux APIs Web Workers API, Service Worker API, Broadcast Channel API, et Channel Messaging API.

Utilisé pour répondre aux nouveaux messages et aux erreurs d'envoi de messages. Les travailleurs de service peuvent également être notifiés d'autres événements, notamment les notifications push, les utilisateurs qui cliquent sur les notifications affichées, le fait que l'abonnement push a été invalidé, la suppression d'éléments de l'index de contenu, etc.

Événements déclenchés sur ServiceWorkerGlobalScope, DedicatedWorkerGlobalScope, SharedWorkerGlobalScope, WorkerGlobalScope, Worker, WorkerGlobalScope, BroadcastChannel, MessagePort.

Créer et déclencher des événements

En plus des événements déclenchés par les interfaces intégrées, vous pouvez créer et déclencher vous-même des événements DOM. Ces événements sont couramment appelés événements synthétiques, par opposition aux événements déclenchés par le navigateur.

Créer des événements personnalisés

Les événements peuvent être créés avec le constructeur Event comme suit :

js
const event = new Event("build");

// Écouter l'événement.
elem.addEventListener("build", (e) => {
  /* … */
});

// Déclencher l'événement.
elem.dispatchEvent(event);

Cet exemple utilise la méthode EventTarget.dispatchEvent().

Ajouter des données personnalisées - CustomEvent()

Pour ajouter des données à l'objet événement, l'interface CustomEvent existe et la propriété detail permet de transmettre des données personnalisées. Par exemple, l'événement peut être créé ainsi :

js
const event = new CustomEvent("build", { detail: elem.dataset.time });

Vous pourrez alors accéder à ces données supplémentaires dans l'écouteur d'événement :

js
function eventHandler(e) {
  console.log(`L'heure est&nbsp;: ${e.detail}`);
}

Ajouter des données personnalisées - sous-classer Event

L'interface Event peut aussi être sous-classée. Cela est utile pour la réutilisation, pour des données personnalisées plus complexes, ou même pour ajouter des méthodes à l'événement.

js
class BuildEvent extends Event {
  #buildTime;

  constructor(buildTime) {
    super("build");
    this.#buildTime = buildTime;
  }

  get buildTime() {
    return this.#buildTime;
  }
}

Ce code définit une classe BuildEvent avec une propriété en lecture seule et un type d'événement fixe.

L'événement peut alors être créé ainsi :

js
const event = new BuildEvent(elem.dataset.time);

Les données supplémentaires sont accessibles dans les écouteurs via les propriétés personnalisées :

js
function eventHandler(e) {
  console.log(`L'heure est&nbsp;: ${e.buildTime}`);
}

Propagation des événements (bubbling)

Il est souvent utile de déclencher un événement depuis un élément enfant et de le capter sur un ancêtre ; vous pouvez aussi transmettre des données avec l'événement :

html
<form>
  <textarea></textarea>
</form>
js
const form = document.querySelector("form");
const textarea = document.querySelector("textarea");

// Créer un nouvel événement, autoriser la propagation, et transmettre des données via la propriété "detail"
const eventAwesome = new CustomEvent("awesome", {
  bubbles: true,
  detail: { text: () => textarea.value },
});

// Le formulaire écoute l'événement personnalisé "awesome" et affiche la valeur transmise
form.addEventListener("awesome", (e) => console.log(e.detail.text()));

// À chaque saisie, la textarea déclenche l'événement à partir d'elle-même
textarea.addEventListener("input", (e) => e.target.dispatchEvent(eventAwesome));

Créer et déclencher dynamiquement des événements

Les éléments peuvent écouter des événements qui n'ont pas encore été créés :

html
<form>
  <textarea></textarea>
</form>
js
const form = document.querySelector("form");
const textarea = document.querySelector("textarea");

form.addEventListener("awesome", (e) => console.log(e.detail.text()));

textarea.addEventListener("input", function () {
  // Créer et déclencher un événement à la volée
  // Remarque&nbsp;: on utilise ici une fonction classique pour que "this" représente l'élément
  this.dispatchEvent(
    new CustomEvent("awesome", {
      bubbles: true,
      detail: { text: () => textarea.value },
    }),
  );
});

Déclencher des événements natifs

Cet exemple montre comment simuler un clic (c'est-à-dire générer un événement click par programmation) sur une case à cocher à l'aide des méthodes DOM. Voir l'exemple en action (angl.).

js
function simulateClick() {
  const event = new MouseEvent("click", {
    view: window,
    bubbles: true,
    cancelable: true,
  });
  const cb = document.getElementById("checkbox");
  const cancelled = !cb.dispatchEvent(event);

  if (cancelled) {
    // Un gestionnaire a appelé preventDefault.
    alert("annulé");
  } else {
    // Aucun gestionnaire n'a appelé preventDefault.
    alert("non annulé");
  }
}

Enregistrer des gestionnaires d'événements

Il existe deux méthodes recommandées pour enregistrer des gestionnaires. Le code du gestionnaire peut être exécuté lorsqu'un événement est déclenché soit en l'assignant à la propriété onevent correspondante de l'élément cible, soit en enregistrant le gestionnaire comme écouteur à l'aide de la méthode addEventListener(). Dans les deux cas, le gestionnaire reçoit un objet conforme à l'interface Event (ou à une interface dérivée). La principale différence est que plusieurs gestionnaires peuvent être ajoutés (ou supprimés) avec les méthodes d'écouteur d'événements.

Attention : Une troisième méthode, qui consiste à utiliser les attributs HTML onevent, n'est pas recommandée ! Ils alourdissent le balisage, le rendent moins lisible et plus difficile à déboguer. Pour plus d'informations, voir Gestionnaires d'événements en ligne.

Utiliser les propriétés onevent

Par convention, les objets JavaScript qui déclenchent des événements possèdent des propriétés "onevent" (nommées en préfixant "on" au nom de l'événement). Ces propriétés sont appelées pour exécuter le code du gestionnaire associé lorsque l'événement est déclenché, et peuvent aussi être appelées directement par votre code.

Pour définir le code du gestionnaire, il suffit de l'assigner à la propriété onevent appropriée. Un seul gestionnaire peut être assigné pour chaque événement sur un élément. Si besoin, le gestionnaire peut être remplacé en assignant une autre fonction à la même propriété.

L'exemple suivant montre comment définir une fonction greet() pour l'événement click en utilisant la propriété onclick.

js
const btn = document.querySelector("button");

function greet(event) {
  console.log("greet:", event);
}

btn.onclick = greet;

Notez qu'un objet représentant l'événement est passé comme premier argument au gestionnaire. Cet objet implémente ou dérive de l'interface Event.

EventTarget.addEventListener

La façon la plus flexible de définir un gestionnaire d'événement sur un élément est d'utiliser la méthode EventTarget.addEventListener. Cette approche permet d'assigner plusieurs écouteurs à un élément et de les supprimer si besoin, à l'aide de EventTarget.removeEventListener.

Note : La possibilité d'ajouter et de supprimer des gestionnaires permet, par exemple, d'utiliser le même bouton pour différentes actions selon le contexte. De plus, dans des programmes plus complexes, nettoyer les anciens gestionnaires inutilisés peut améliorer l'efficacité.

L'exemple suivant montre comment une fonction greet() peut être définie comme écouteur/gestionnaire pour l'événement click (vous pouvez utiliser une fonction anonyme si vous le souhaitez). Notez à nouveau que l'événement est passé comme premier argument au gestionnaire.

js
const btn = document.querySelector("button");

function greet(event) {
  console.log("greet:", event);
}

btn.addEventListener("click", greet);

La méthode peut aussi prendre des arguments/options supplémentaires pour contrôler la capture ou la suppression des événements. Plus d'informations sont disponibles sur la page de référence de EventTarget.addEventListener.

Utiliser AbortSignal

Une fonctionnalité notable des écouteurs d'événements est la possibilité d'utiliser un signal d'abandon pour supprimer plusieurs gestionnaires en même temps.

Cela se fait en passant le même objet AbortSignal à l'appel de addEventListener() pour tous les gestionnaires que vous souhaitez pouvoir supprimer ensemble. Vous pouvez ensuite appeler abort() sur le contrôleur propriétaire du signal, ce qui supprimera tous les gestionnaires ajoutés avec ce signal. Par exemple, pour ajouter un gestionnaire que l'on pourra supprimer avec un AbortSignal :

js
const controller = new AbortController();

btn.addEventListener(
  "click",
  (event) => {
    console.log("greet:", event);
  },
  { signal: controller.signal },
); // on passe un AbortSignal à ce gestionnaire

Ce gestionnaire peut ensuite être supprimé ainsi :

js
controller.abort(); // supprime tous les gestionnaires associés à ce contrôleur

Interaction de plusieurs gestionnaires d'événements

La propriété IDL onevent (par exemple, element.onclick = ...) et l'attribut HTML onevent (par exemple, <button onclick="...">) ciblent tous deux le même emplacement de gestionnaire unique. Le HTML est chargé avant que JavaScript puisse accéder au même élément, donc en général JavaScript remplace ce qui est spécifié dans le HTML. Les gestionnaires ajoutés avec addEventListener() sont indépendants. Utiliser onevent ne supprime ni ne remplace les écouteurs ajoutés avec addEventListener(), et inversement.

Lorsqu'un événement est déclenché, les écouteurs sont appelés en plusieurs phases. Il y a deux phases : capture et bulle (bubbling). En phase de capture, l'événement part de l'ancêtre le plus haut et descend l'arbre DOM jusqu'à la cible. En phase de bulle, l'événement remonte en sens inverse. Par défaut, les écouteurs écoutent en phase de bulle, mais ils peuvent écouter en phase de capture en passant capture: true à addEventListener(). Dans une même phase, les écouteurs sont appelés dans l'ordre où ils ont été enregistrés. Le gestionnaire onevent est enregistré la première fois qu'il devient non nul ; les réaffectations ultérieures ne changent que sa fonction de rappel, pas sa position dans l'ordre.

Appeler Event.stopPropagation() empêche l'appel des écouteurs sur d'autres éléments plus loin dans la chaîne de propagation. Event.stopImmediatePropagation() empêche aussi l'appel des autres écouteurs sur le même élément.

Spécifications

Specification
DOM
# events
HTML
# events-2

Voir aussi