Événements JavaScript et pages interactives

Fais réagir les pages web aux actions des utilisateurs. Apprends à ajouter des écouteurs d’événements, à lire l’objet événement et à suivre le bouillonnement des événements dans la page pour qu’un seul écouteur puisse gérer plusieurs éléments. Gère les appuis sur les touches, les clics, les contacts tactiles et le stylet, crée une interaction de glissement, lis et envoie des formulaires en JavaScript, puis valide les entrées avec les règles intégrées du navigateur et tes propres messages. Termine en créant des composants personnalisés utilisables au clavier et avec un lecteur d’écran comme à la souris.

DébutantUnité 6 sur 9 de la formation Formation : JavaScript : DOM, événements et code asynchrone

Ce que tu vas apprendre

  1. Fais réagir une page lorsqu’un événement se produit : ajoute des écouteurs aux éléments, lis les informations fournies par l’objet événement et décide combien de temps chaque écouteur reste actif.
    • Ajoute un écouteur d’événements à un élément
      Utilise addEventListener pour exécuter une fonction chaque fois qu’un clic, un appui sur une touche, une action sur un formulaire ou un événement de page se produit sur un élément.
    • Lis les informations de l’objet événement
      Utilise l’objet événement reçu par un écouteur pour savoir ce qui s’est passé et où : son type, sa cible, sa cible courante et les détails propres à l’événement.
    • Supprime des écouteurs et contrôle leur exécution
      Arrête l’écoute lorsqu’un écouteur n’est plus nécessaire, utilise les options once, signal et passive, et déclenche tes propres événements personnalisés.
  2. Explique comment un événement descend vers sa cible puis remonte dans la page, annule un comportement intégré du navigateur lorsque tu le remplaces et utilise le bouillonnement pour gérer plusieurs éléments avec un seul écouteur.
    • Explique le bouillonnement et la capture
      Décris les trois phases de propagation d’un événement et prévois l’ordre d’exécution des écouteurs sur des éléments imbriqués.
    • Empêche les actions par défaut et arrête la propagation
      Annule la réponse intégrée du navigateur à un événement lorsque ton code la remplace, et n’arrête la propagation d’un événement que lorsque c’est vraiment nécessaire.
    • Gère plusieurs éléments avec la délégation d’événements
      Utilise un seul écouteur sur un ancêtre commun et event.target.closest() pour gérer les événements provenant de plusieurs éléments enfants, y compris ceux ajoutés ultérieurement.
  3. Réagis aux appuis sur les touches, aux changements de focus, aux clics, aux contacts tactiles et au stylet, puis crée une interaction de glissement qui fonctionne avec tous les types de pointeurs.
    • Réagis aux appuis sur les touches et aux changements de focus
      Utilise keydown, keyup et les événements de focus, choisis entre event.key et event.code, et crée des raccourcis clavier qui ne gênent pas l’utilisateur.
    • Gère les clics, les contacts tactiles et le stylet avec les événements de pointeur
      Utilise click pour l’activation et les événements de pointeur pour gérer l’appui, le déplacement et le relâchement avec une souris, un doigt ou un stylet ; lis les coordonnées et les boutons, et choisis les événements de survol adaptés.
    • Crée une interaction de glissement avec des événements de pointeur
      Combine pointerdown, pointermove et pointerup avec la capture du pointeur pour déplacer un élément, assurer son fonctionnement sur écran tactile et proposer un moyen de faire la même chose sans glissement.
  4. Lis les données saisies par les utilisateurs pendant leur saisie, gère l’envoi des formulaires en JavaScript et vérifie les entrées avec les fonctions de validation du navigateur et tes propres règles, accompagnées de messages d’erreur clairs.
    • Lis les champs de formulaire et réagis pendant la saisie
      Lis les champs de texte et de nombres, les cases à cocher, les boutons radio et les listes déroulantes, utilise les événements input et change au bon moment et recueille les données d’un formulaire entier avec FormData.
    • Gère l’envoi des formulaires en JavaScript
      Écoute l’événement submit du formulaire, empêche le rechargement de la page, lis les données envoyées et identifie ce qui déclenche une soumission.
    • Utilise la validation intégrée du navigateur
      Décris des règles avec des attributs HTML, lis le résultat dans l’objet validity, vérifie les champs depuis le code et mets en forme les champs invalides au bon moment.
    • Écris une validation personnalisée avec des messages d’erreur clairs
      Ajoute des règles que les attributs HTML ne peuvent pas exprimer, rédige des messages utiles, affiche-les au bon moment et associe-les à leurs champs.
  5. Crée des éléments interactifs utilisables à la souris, au clavier et avec un lecteur d’écran : privilégie le HTML natif, ajoute des rôles, la prise en charge du clavier et des états lorsque tu crées tes propres composants, et place le focus là où les utilisateurs l’attendent.
    • Privilégie les éléments natifs et rends les composants personnalisés accessibles au focus
      Identifie ce que les éléments interactifs natifs fournissent d’emblée et ce qu’un composant personnalisé construit à partir d’un <div> ou d’un <span> doit ajouter : un rôle, la capacité à recevoir le focus, un nom accessible et un indicateur de focus visible.
    • Ajoute la prise en charge du clavier et la gestion de l’état aux composants personnalisés
      Rends les boutons, boutons à bascule, composants de divulgation, cases à cocher et groupes d’éléments personnalisés utilisables au clavier, et maintiens leur état ARIA en accord avec ce que voient les utilisateurs.
    • Place le focus là où les utilisateurs l’attendent lorsque la page change
      Déplace le focus volontairement lorsqu’un contenu s’ouvre, se ferme, est supprimé ou affiche des erreurs, et ne le déplace jamais de façon inattendue pendant que les utilisateurs saisissent du texte ou font un choix.

Événements JavaScript : cours

5 chapitres

1

Réagis aux événements avec des écouteurs d’événements

Les pages web réagissent grâce à des fonctions enregistrées pour des événements. La mise en place détermine l’élément et le type d’événement ; chaque occurrence ultérieure fournit un objet événement qui décrit ce qui s’est passé. La lecture de cet objet permet à un écouteur d’agir sur le bon composant, même lorsqu’un clic atteint une icône à l’intérieur de celui-ci. Les références et les options des écouteurs permettent ensuite à une fonctionnalité de garder ses réponses actives exactement le temps nécessaire, et les événements personnalisés permettent à une partie de la page d’en informer une autre.

1.1 Les écouteurs déclenchent du code en réponse aux actions

Une page peut attendre qu’une personne agisse. Un événement signale ce qui s’est passé et un écouteur d’événements est la fonction appelée en réponse. Enregistrer un écouteur prépare cette réponse ; cela n’effectue pas l’action immédiatement.

Ajouter la fonction à l’élément

Sélectionne un élément qui existe déjà, choisis le nom exact de l’événement et passe une fonction :

const button = document.querySelector("#like");
let likes = 0;
button.addEventListener("click", function () {
  likes = likes + 1;
  button.textContent = "Likes: " + likes;
});

La sélection, la définition de la variable et l’enregistrement s’exécutent lorsque le script s’exécute. Chaque clic ultérieur exécute le corps de la fonction. Après trois clics, le bouton affiche « Likes: 3 ». Garder likes hors de la fonction conserve le total entre les clics ; placer let likes = 0 à l’intérieur le remettrait à zéro à chaque fois.

Passe une référence de fonction, comme showMenu, sans parenthèses. Dans button.addEventListener("click", showMenu()), JavaScript appelle immédiatement showMenu et passe sa valeur de retour comme écouteur. Pour fournir un argument plus tard, place l’appel dans une fonction enveloppante : button.addEventListener("click", () => showMenu("main"));.

Choisir un événement qui se produit réellement

Les noms sont des chaînes sensibles à la casse sans préfixe « on ». Utilise "click", et non "Click" ou "onclick". Un nom inventé est accepté sans erreur, mais le navigateur ne l’émettra pas pour un clic. Parmi les familles courantes figurent les événements de pointeur comme pointerdown et pointerup, les événements clavier comme keydown, les événements de formulaire comme input et submit, et les événements de focus comme focusin. DOMContentLoaded possède sa propre casse exacte.

Configurer le bon élément au bon moment

Un script dans l’en-tête peut s’exécuter avant qu’un bouton existe. La sélection renvoie alors null, et appeler addEventListener sur cette valeur provoque une erreur. Charge un script externe avec defer, place-le après le balisage ou enregistre la mise en place sur l’événement DOMContentLoaded du document. Un élément créé plus tard nécessite une mise en place après sa création ou un écouteur sur un ancêtre.

querySelectorAll renvoie une NodeList, et non une seule cible d’événement. Enregistre les écouteurs sur ses éléments :

document.querySelectorAll(".tab").forEach((tab) => {
  tab.addEventListener("click", selectTab);
});
Faire coexister les écouteurs
MéthodeEffet de l’enregistrement
addEventListener("click", fn)Ajoute un écouteur à côté des autres et accepte des options.
button.onclick = fnRemplace l’unique gestionnaire de la propriété ; affecte null pour le supprimer.
Un attribut HTML onclickPlace du JavaScript dans le balisage.

Les écouteurs ayant le même réglage de capture s’exécutent dans leur ordre d’enregistrement. Sur la cible de l’événement, les écouteurs en phase de capture s’exécutent avant les autres. Ajouter de nouveau le même objet fonction avec le même type et le même réglage de capture n’en ajoute pas un second exemplaire.

Points clés

  • Passe la fonction elle-même ; utilise une fonction enveloppante lorsque l’appel ultérieur a besoin d’arguments.
  • Les noms d’événements exigent une orthographe et une casse exactes.
  • Un élément doit exister lorsque son écouteur est enregistré.
  • Parcours une NodeList avec une boucle pour ajouter des écouteurs à ses éléments.
  • addEventListener permet d’ajouter plusieurs écouteurs ; une propriété de gestionnaire n’en contient qu’un.

1.2 Identifie où un événement a commencé

Le navigateur passe un objet événement à ton écouteur. Ses propriétés expliquent l’événement qui a déclenché cet appel précis. Nomme le paramètre event ou e ; le choix de son nom t’appartient.

button.addEventListener("click", (event) => {
  console.log(event.type);
  console.log(event.currentTarget);
});

Ce code affiche "click" et le bouton dans la console pendant l’appel de l’écouteur. Afficher l’objet entier peut t’aider à découvrir ses autres propriétés.

Distinguer l’origine de l’écouteur

Imagine un bouton contenant une image :

<button id="save" data-id="7">
  <img src="disk.svg" alt=""> Save
</button>
PropriétéSignificationLors d’un clic sur l’image
event.targetL’endroit où l’événement a commencéL’image
event.currentTargetL’élément auquel l’écouteur en cours a été ajoutéLe bouton, pour un écouteur sur le bouton

Un clic sur le texte « Save » fait aussi du bouton la cible. Le texte fait partie du bouton ; il ne devient pas un élément cible distinct.

Cette différence compte pour lire les données. L’image n’a pas le data-id du bouton : event.target.dataset.id vaut donc undefined lors d’un clic sur l’image. Un écouteur ajouté directement au bouton peut lire event.currentTarget.dataset.id. Un écouteur sur un conteneur plus grand peut trouver le bouton recherché avec event.target.closest("button") et vérifier qu’un élément correspondant existe.

Lire les détails de cet événement

Chaque événement possède un type, un target et un currentTarget. Le booléen bubbles indique s’il remonte à travers les ancêtres. cancelable indique si le code peut annuler son action par défaut, et defaultPrevented indique si cette annulation a eu lieu. timeStamp indique l’instant de création de l’événement en millisecondes par rapport à l’origine temporelle de la page.

Les différentes familles d’événements ajoutent des détails utiles. Un click moderne fournit un PointerEvent, qui hérite des propriétés d’événement de souris comme clientX, clientY et button. Un KeyboardEvent ajoute key, code et des indicateurs de touches de modification. Un écouteur input peut utiliser event.target.value pour lire le nouveau texte du champ.

Pour un écouteur sur une galerie, event.target.tagName peut valoir "IMG" lors d’un clic sur une photo ou "DIV" lors d’un clic dans l’espace entre les photos. Gère le cas effectivement indiqué. Ne suppose pas que tous les événements dans un conteneur proviennent du même type d’enfant.

Utiliser la valeur pendant l’exécution de l’écouteur

Dans un écouteur écrit avec une fonction classique, this est égal à event.currentTarget. Une fonction fléchée prend this dans le code qui l’entoure ; elle ne prend pas l’élément comme this. L’utilisation de event.currentTarget fonctionne avec les deux formes de fonction.

Après le déclenchement, currentTarget est remis à null. Une console peut afficher cette valeur ultérieure lorsque tu développes un événement affiché auparavant. Affiche event.currentTarget directement dans l’écouteur pour examiner l’élément pendant l’appel.

Points clés

  • target indique l’origine de l’événement ; currentTarget indique l’élément de l’écouteur en cours.
  • Lis les données sur l’élément qui les possède réellement.
  • Les familles d’événements ajoutent des propriétés comme les coordonnées, les valeurs des touches et les touches de modification.
  • currentTarget est disponible pendant l’exécution de l’écouteur et devient null ensuite.

1.3 Contrôle la durée de vie d’un écouteur

Un écouteur doit rester actif tant que sa fonctionnalité en a besoin. Pour une interaction temporaire au clavier, garde la référence de la fonction afin de pouvoir la supprimer lorsque l’interaction se termine.

Supprimer la même fonction
function onKey(event) {
  console.log(event.key);
}
document.addEventListener("keydown", onKey);
// When the feature closes:
document.removeEventListener("keydown", onKey);

La suppression recherche le même type d’événement, le même objet fonction et le même réglage de capture. Une fonction anonyme peut aussi être supprimée lorsque sa référence est enregistrée, comme dans const handler = () => save();. Écrire un nouveau () => save() dans l’appel de suppression crée une fonction différente, même si le code semble identique.

Choisir les options d’enregistrement
OptionEffet
once: trueSupprime cet écouteur après son premier appel.
signal: controller.signalSupprime l’écouteur lorsque ce contrôleur est annulé.
capture: trueÉcoute pendant la phase de capture.
passive: trueIndique que l’écouteur n’annulera pas l’action par défaut.

Une bannière de bienvenue à affichage unique peut utiliser { once: true }. Une fonctionnalité avec plusieurs écouteurs peut leur donner un même signal :

const controller = new AbortController();
window.addEventListener("pointermove", moveCursor, {
  signal: controller.signal
});
window.addEventListener("keydown", onKey, {
  signal: controller.signal
});
// Close the feature:
controller.abort();

L’annulation supprime les deux enregistrements. Un contrôleur annulé ne peut pas être réinitialisé ; crée un nouveau contrôleur pour une nouvelle période d’utilisation. Pour une suppression avec removeEventListener, répète capture: true si ce réglage a été utilisé lors de l’enregistrement. once, signal et passive ne font pas partie des critères de correspondance pour la suppression.

L’appel de preventDefault() par un écouteur passif est ignoré. Les navigateurs rendent couramment passifs par défaut certains écouteurs liés au défilement sur les cibles au niveau du document, notamment pour wheel, touchstart et touchmove ; utilise explicitement { passive: false } dans ces cas lorsqu’une annulation est nécessaire.

Éviter l’accumulation de fonctions de rappel

Si chaque clic sur « Start » ajoute un nouvel écouteur anonyme au plateau, deux démarrages font qu’un clic sur le plateau exécute deux fonctions de rappel. Installe l’écouteur du plateau une seule fois, réutilise le même objet fonction ou annule le groupe précédent avant de le remplacer. Des fonctions de rappel once distinctes peuvent quand même s’accumuler avant leur exécution.

Détacher un élément conserve ses écouteurs. Ils fonctionnent s’il est réinséré, et dispatchEvent() peut les atteindre lorsqu’il est détaché. Le ramasse-miettes peut récupérer l’élément lorsque celui-ci et ses écouteurs ne sont plus accessibles. Un écouteur sur window ou document reste en place jusqu’à sa suppression explicite.

Envoyer un événement personnalisé
const event = new CustomEvent("cart:add", {
  detail: { id: 42 },
  bubbles: true
});
item.dispatchEvent(event);

Les écouteurs lisent event.detail.id. Le déclenchement appelle immédiatement les écouteurs, avant de rendre la main. bubbles: true permet aussi aux ancêtres de recevoir l’événement. Un événement envoyé avec dispatchEvent() a isTrusted égal à false ; les événements déclenchés par le navigateur peuvent être considérés comme fiables même lorsqu’une API comme focus() les a provoqués.

Points clés

  • La suppression recherche le même type, la même identité de fonction et le même réglage de capture.
  • once met fin à un enregistrement après un appel ; l’annulation d’un signal met fin aux enregistrements qui lui sont associés.
  • Un écouteur passif ne peut pas annuler une action par défaut.
  • De nouvelles fonctions de rappel ajoutées à chaque mise en place peuvent s’accumuler.
  • Détacher un élément conserve ses écouteurs.
  • Les événements personnalisés transportent des données dans detail et sont déclenchés de façon synchrone.
2

Suis la propagation des événements dans la page

Des éléments imbriqués partagent le trajet d’un événement. Un clic peut passer par un conteneur avant d’atteindre sa cible, puis y repasser pendant le bouillonnement, ce qui permet à un seul écouteur de gérer une liste qui change. Suivre ce trajet aide à comprendre pourquoi l’action d’un enfant déclenche aussi celle d’un parent. Distingue l’annulation du comportement du navigateur du contrôle de la propagation, puis utilise l’origine de l’événement pour choisir les actions qu’un écouteur partagé doit gérer.

2.1 Le trajet d’un événement dans des éléments imbriqués

Un clic dans un bouton peut aussi être reçu par les ancêtres du bouton. La propagation est le trajet de l’événement dans l’arbre du document. Suivre ce trajet permet de comprendre aussi bien les écouteurs partagés utiles que les actions supplémentaires surprenantes.

Suivre trois phases
  1. Capture : l’événement descend depuis window à travers les ancêtres vers la cible.
  2. Cible : les écouteurs s’exécutent sur l’élément où l’événement a commencé.
  3. Bouillonnement : un événement qui remonte par bouillonnement traverse les ancêtres jusqu’à window.

La propriété eventPhase indique 1 pour la capture, 2 sur la cible et 3 pour le bouillonnement. Un écouteur enregistré sans options s’exécute sur la cible ou pendant la remontée. Un écouteur avec { capture: true } s’exécute pendant la descente, y compris sur la cible s’il y est enregistré.

Suivre un clic concret
<div id="outer">
  <div id="inner">
    <button>Go</button>
  </div>
</div>

Supposons que le bouton et chaque div aient des écouteurs de clic ordinaires qui affichent leur nom. Un clic sur « Go » affiche « button », « inner », puis « outer ». Un clic sur une zone vide de inner affiche « inner », puis « outer » ; le bouton ne se trouve pas sur le trajet de cet événement.

Ajoute maintenant un écouteur en phase de capture à outer. Un clic sur le bouton affiche d’abord « outer (capture) », puis « button », « inner » et « outer » depuis les écouteurs ordinaires. L’écouteur en phase de capture reçoit le clic avant les descendants. Après outer, l’événement peut continuer à travers body, html, document et window si des écouteurs y sont enregistrés.

Il s’agit d’un seul événement, pas d’un nouveau clic créé sur chaque ancêtre. target reste le bouton tout au long du trajet. currentTarget change à mesure que chaque écouteur s’exécute. Dans l’écouteur de l’élément extérieur, lire target indique toujours le bouton d’origine.

Vérifier quels événements remontent par bouillonnement
Remontent par bouillonnementNe remontent pas par bouillonnement
click, input, change, submitinvalid
keydown, pointerdownfocus, blur
focusin, focusoutpointerenter, pointerleave
pointerover, pointeroutmouseenter, mouseleave

La propriété bubbles de l’événement indique s’il possède une phase de bouillonnement. Les événements sans bouillonnement peuvent quand même être observés par un écouteur en phase de capture sur un ancêtre. Pour gérer les changements de focus au moyen d’un écouteur ordinaire sur un conteneur, choisis focusin ou focusout.

Expliquer un bogue lié à des actions imbriquées

Une fiche produit ouvre une vue détaillée lorsqu’on clique dessus. Son bouton « Supprimer » supprime le produit. Un clic sur ce bouton supprime d’abord le produit, puis atteint l’écouteur de la fiche et ouvre la vue détaillée. Le trajet de l’événement explique pourquoi les deux fonctions de rappel s’exécutent.

La fiche peut ignorer les clics de suppression avec if (event.target.closest(".remove")) return;. Le bouton peut aussi arrêter la propagation. Filtrer au niveau de la fiche conserve l’événement pour les autres ancêtres qui peuvent en avoir besoin.

Points clés

  • La propagation suit les phases de capture, cible puis de bouillonnement pour les événements qui remontent.
  • Les écouteurs ordinaires sur les ancêtres reçoivent les clics des descendants pendant la remontée.
  • target reste inchangé tandis que currentTarget change.
  • Utilise un événement de focus qui remonte par bouillonnement ou la capture pour observer le focus depuis un ancêtre.

2.2 Annuler une action ou arrêter la propagation

Un écouteur peut modifier ce qui se passe après un événement ou le trajet que suit l’événement. Ce sont deux décisions distinctes. Un événement sur un lien peut continuer à remonter par bouillonnement même après l’annulation de la navigation.

Remplacer une action du navigateur

Une action par défaut est un comportement fourni par le navigateur : suivre un lien, envoyer un formulaire, changer l’état d’une case à cocher, insérer du texte, faire défiler avec Espace ou déplacer le focus avec Tabulation. Utilise preventDefault() lorsque ton code remplace cette action :

help.addEventListener("click", (event) => {
  event.preventDefault();
  openHelpPanel();
});

Pour un lien vers /help, ce code ouvre le panneau sans naviguer vers une autre page. Le lien donne toujours accès à sa destination lorsque JavaScript ne s’exécute pas.

Seuls les événements annulables peuvent être annulés. Examine event.cancelable ; defaultPrevented indique si l’annulation a réussi. input se produit après le changement de valeur et n’est pas annulable. Y appeler preventDefault() ne supprime pas le texte inséré. Un événement beforeinput annulable est le bon endroit pour intercepter une modification ; annuler un événement keydown approprié peut empêcher l’effet par défaut de cette touche.

Contrôler la propagation séparément
MéthodeArrête l’action par défaut du navigateur ?Arrête les écouteurs suivants ?
preventDefault()Oui, si l’événement est annulable et l’écouteur non passifNon
stopPropagation()NonArrête la propagation vers les autres éléments ; les écouteurs de cet élément s’exécutent quand même
stopImmediatePropagation()NonArrête aussi les écouteurs restants sur cet élément

Un lien dont l’écouteur ne fait qu’arrêter la propagation est quand même suivi. Annuler uniquement la navigation permet toujours à un écouteur de clic sur le document de recevoir l’événement. Renvoyer false depuis une fonction de rappel ajoutée avec addEventListener ne fait ni l’un ni l’autre. Une propriété ou un attribut en ligne de gestionnaire peut annuler l’action par défaut en renvoyant false, mais cela n’arrête toujours pas la propagation.

Préserver les comportements partagés

Un ancêtre peut fermer un menu ou compter les interactions. Arrêter la propagation cache l’événement à ce code. L’ancêtre peut souvent examiner target ou defaultPrevented à la place.

Par exemple, un menu ne se ferme que lorsqu’un clic a lieu en dehors du menu et de son élément déclencheur :

document.addEventListener("click", (event) => {
  if (!menu.contains(event.target) &&
      !menuButton.contains(event.target)) {
    menu.hidden = true;
  }
});

contains() inclut l’élément lui-même et ses descendants. Il est important de vérifier l’élément déclencheur, car le clic qui ouvre le menu remonte aussi par bouillonnement jusqu’au document. Sans ce second test, le menu qui vient de s’ouvrir se fermerait immédiatement.

N’annuler qu’une action prise en charge

Dans un écouteur de touche, vérifie la touche avant d’annuler son action. Annuler chaque touche bloque la saisie ordinaire et peut empêcher Tabulation de déplacer le focus. Dans un écouteur passif, l’annulation est entièrement ignorée.

Points clés

  • preventDefault() annule une action par défaut qui peut l’être tout en préservant la propagation.
  • stopPropagation() arrête la propagation, pas l’action par défaut.
  • stopImmediatePropagation() ignore aussi les écouteurs restants sur l’élément courant.
  • input intervient trop tard pour annuler une modification.
  • Les tests de clic à l’extérieur doivent inclure l’élément contextuel et son élément déclencheur.
  • N’annule que les actions précises du clavier que ton code prend en charge.

2.3 Un seul écouteur pour une liste qui change

La délégation d’événements place un écouteur sur un ancêtre stable et utilise l’origine de l’événement pour choisir une action. Elle est utile lorsqu’une liste comporte de nombreux éléments ou lorsque le code en crée de nouveaux après la mise en place.

Trouver le composant recherché

Un clic qui remonte par bouillonnement atteint la liste quel que soit le descendant sur lequel l’utilisateur a cliqué. Pars de event.target, trouve le composant correspondant le plus proche et ignore les clics sans rapport :

const list = document.querySelector("#todos");
list.addEventListener("click", (event) => {
  const button = event.target.closest(".remove");
  if (!button || !list.contains(button)) return;
  const item = button.closest("li");
  console.log("Removing item " + item.dataset.id);
  item.remove();
});

La liste contient des éléments comme <li data-id="7">Buy milk <button class="remove">Remove</button></li>. L’écouteur appartient à la liste : un nouvel élément avec le même balisage fonctionne donc dès son insertion.

Suis un clic sur une icône dans le code. La cible est l’icône, closest(".remove") trouve son bouton et button.closest("li") trouve l’élément de liste. Son data-id identifie l’élément dans le message. Enfin, remove() modifie la page.

Conserver les deux vérifications
TestPourquoi il est utile
!buttonUn clic dans un espace vide de la liste ou sur le texte ordinaire d’un élément peut ne trouver aucun bouton de suppression.
!list.contains(button)closest() peut remonter au-delà de la liste et trouver un ancêtre extérieur correspondant.

Tester seulement event.target.matches(".remove") ne prend pas en compte les clics sur l’icône, car l’icône elle-même ne correspond pas au sélecteur. closest() vérifie la cible et remonte ses ancêtres. Dans un écouteur délégué, currentTarget est la liste ; il ne devient pas le bouton trouvé.

Diriger plusieurs actions

Les attributs de données permettent à un écouteur de barre d’outils de choisir parmi des actions connues :

const actions = { bold: makeBold, italic: makeItalic,
  clear: clearText };
toolbar.addEventListener("click", (event) => {
  const button = event.target.closest("button[data-action]");
  if (!button || !toolbar.contains(button)) return;
  const action = actions[button.dataset.action];
  if (typeof action === "function") action();
});

Un bouton avec data-action="clear" sélectionne clearText. La vérification de la fonction gère une action inconnue sans tenter d’appeler undefined.

Choisir un événement adapté

La délégation fonctionne avec d’autres événements qui remontent par bouillonnement, pas seulement les clics. Un seul écouteur input sur un formulaire peut passer event.target à une fonction de vérification des champs. Pour déléguer les changements de focus, utilise focusin ou focusout ; les événements ordinaires focus et blur ne remontent pas. Pour les changements de survol, utilise les événements over/out qui remontent lorsque la délégation est nécessaire.

Un appel à stopPropagation() sur un descendant peut empêcher un événement d’atteindre le conteneur. Si un écouteur délégué semble inactif, vérifie le type d’événement, la cible, la correspondance avec le sélecteur et si un élément situé sous le conteneur a arrêté la propagation.

Points clés

  • Ajoute l’écouteur à un ancêtre qui reste en place lorsque ses enfants changent.
  • closest() trouve un composant même lorsqu’on clique sur une icône imbriquée.
  • Ignore les absences de correspondance et les éléments correspondants situés hors du conteneur.
  • La délégation inclut automatiquement les enfants correspondants ajoutés ultérieurement.
  • Les attributs de données peuvent diriger un écouteur partagé vers des actions connues.
  • La délégation nécessite un événement qui atteint l’ancêtre.
3

Gère les entrées au clavier et au pointeur

Une interaction peut provenir du clavier, d’une souris, d’un doigt ou d’un stylet. L’événement choisi détermine si tu reçois une activation, une valeur de texte modifiée ou le mouvement d’un pointeur particulier. Les repères de coordonnées et les positions de départ mémorisées rendent le glissement prévisible. Le focus et les autres commandes possibles permettent d’utiliser la même page au clavier ou sans pouvoir effectuer un geste de glissement.

3.1 Touches, texte et focus

Les entrées au clavier vont à l’élément qui a le focus, accessible sous document.activeElement, puis remontent par bouillonnement. Un écouteur sur le document peut donc recevoir les touches depuis les champs comme depuis les autres composants. Cette portée rend les raccourcis clavier utiles, mais signifie aussi qu’ils peuvent interrompre la saisie.

Choisir la propriété selon son sens
PropriétéIndiqueExemple
keyLa valeur produite, compte tenu de la disposition et des touches de modification"a", "A", "Enter", " "
codeLa position physique de la touche"KeyA", "Enter", "Space"

Sur un clavier AZERTY, la touche à l’emplacement marqué Q sur un clavier américain produit key "a" et code "KeyQ". Utilise key pour le sens, comme Échap pour fermer ou une lettre pour un raccourci. Utilise code pour les positions fixes, comme les touches de déplacement dans un jeu. Le key de la barre d’espace est un seul espace, pas "Space".

keydown se déclenche à l’appui initial et peut se répéter tant que la touche reste enfoncée. Lors des appels répétés, event.repeat === true. keyup se déclenche au relâchement. Utilise keydown à la place de l’événement obsolète keypress.

Gérer un raccourci précisément
document.addEventListener("keydown", (event) => {
  if ((event.ctrlKey || event.metaKey) &&
      event.key.toLowerCase() === "s") {
    event.preventDefault();
    saveDraft();
  }
});

Ce code gère Ctrl+S et Commande+S. La conversion en minuscules permet aussi d’accepter "S". L’annulation ne remplace l’action d’enregistrement de la page du navigateur que pour le raccourci correspondant. Parmi les autres indicateurs de touches de modification figurent shiftKey et altKey.

Pour un raccourci à une seule lettre actif sur toute la page, ignore les contextes de saisie avant d’agir :

if (event.target.matches("input, textarea, select") ||
    event.target.isContentEditable) return;
if (event.repeat) return;

La première vérification protège la saisie de texte. La seconde fait exécuter une action une seule fois par appui physique. N’annule pas Tabulation dans toute la page : c’est ainsi que les utilisateurs du clavier passent à la suite.

Écouter le texte après sa modification

Pour une touche ordinaire produisant un caractère affichable, la séquence est keydown, beforeinput, input, puis keyup. Lire value dans keydown donne la valeur avant l’insertion de ce caractère. Utilise input pour un aperçu du texte ou un compteur de caractères. Cet événement prend aussi en compte les modifications comme le collage et la dictée, qui ne nécessitent pas d’appui correspondant sur une touche.

Observer les changements de focus

focus et blur signalent la prise et la perte du focus sans remonter par bouillonnement. focusin et focusout remontent : un formulaire peut donc observer ses champs avec un seul écouteur. relatedTarget indique l’autre élément concerné par le changement, ou null s’il n’y en a pas.

password.addEventListener("focus", () => {
  hint.hidden = false;
});
password.addEventListener("blur", () => {
  hint.hidden = true;
});

L’indication est disponible lorsque le champ reçoit le focus, notamment avec Tabulation. Appeler element.focus() déplace le focus depuis le code ; la prochaine entrée au clavier va alors à cet élément.

Points clés

  • Utilise key pour le sens de la valeur produite et code pour la position physique.
  • Protège les raccourcis à une lettre actifs sur toute la page contre les contextes de saisie et les répétitions indésirables.
  • Utilise input pour réagir aux modifications de texte, y compris au collage.
  • focusin et focusout remontent par bouillonnement ; focus et blur ne remontent pas.
  • relatedTarget indique l’autre destination ou origine du focus.

3.2 Activation et mouvement du pointeur

Une personne peut utiliser une souris, un doigt, un stylet ou un clavier. Choisis un événement selon l’interaction souhaitée. click exprime une activation ; les événements de pointeur décrivent l’appui, le mouvement et le relâchement.

Garder les actions accessibles au clavier

Un bouton natif émet click lorsqu’il est activé avec Entrée ou Espace. Un lien qui a le focus fait de même avec Entrée. Relier une action uniquement à pointerdown ou mousedown ne prend pas en compte ces activations au clavier. Utilise click pour les actions comme l’ouverture d’un panneau ; utilise pointerdown lorsque le travail doit commencer dès l’appui, comme pour un glissement.

Un clic au pointeur suit un appui et un relâchement. Lorsqu’ils ont lieu sur des éléments différents, le clic peut avoir pour cible leur ancêtre commun le plus proche. dblclick suit deux clics rapides ; event.detail compte les clics rapides successifs. auxclick gère les clics non principaux. contextmenu peut provenir d’un clic secondaire, d’un appui tactile long ou d’une commande de menu au clavier.

Utiliser une seule famille d’événements de pointeur

pointerdown, pointermove, pointerup et pointercancel couvrent la souris, le tactile et le stylet. pointerType indique l’appareil par "mouse", "touch" ou "pen" ; pointerId distingue les pointeurs actifs, y compris deux doigts.

Les anciennes familles d’événements de souris et tactiles existent toujours. Les navigateurs peuvent émettre des événements de souris de compatibilité après les événements de pointeur. Enregistrer à la fois pointerdown et mousedown pour la même action peut donc l’exécuter deux fois.

Adapter les coordonnées au besoin
CoordonnéesOrigine
clientX, clientYCoin supérieur gauche de la zone d’affichage visible
pageX, pageYCoin supérieur gauche du document, défilement compris
offsetX, offsetYBord de la zone de remplissage de l’élément cible

Lorsque le document a défilé de 300 px vers le bas et qu’un clic a lieu à 100 px sous le haut de la zone d’affichage, clientY vaut 100 et pageY vaut 400. Garde les deux positions dans le même repère de coordonnées pour calculer le mouvement. Si la cible imbriquée change, l’origine des coordonnées de décalage peut aussi changer.

button indique quel bouton a changé d’état lors d’un événement d’appui ou de relâchement : 0 pour le principal, 1 pour celui du milieu, 2 pour le secondaire. buttons indique la combinaison actuellement enfoncée : le bouton principal contribue pour 1, le secondaire pour 2 et celui du milieu pour 4. Ainsi, buttons === 3 signifie que les boutons principal et secondaire sont enfoncés ; cela ne signifie pas que le bouton du milieu a changé d’état.

Choisir le comportement de survol pour un composant entier

Les événements over/out remontent par bouillonnement et peuvent se déclencher lorsque le pointeur franchit les frontières des éléments enfants. Les événements enter/leave ne remontent pas et décrivent l’entrée dans l’élément entier ou sa sortie, enfants compris. Une infobulle peut éviter de clignoter au passage des frontières des enfants avec pointerenter et pointerleave.

Les utilisateurs d’écrans tactiles et de claviers ne survolent pas les éléments. Propose aussi les informations essentielles au clic ou à la prise de focus. Pour un effet de survol visuel sans comportement supplémentaire, le sélecteur CSS :hover est plus simple qu’un écouteur.

Points clés

  • Utilise click pour l’activation, y compris l’activation native au clavier.
  • Les événements de pointeur couvrent la souris, le tactile et le stylet dans une seule famille.
  • Choisis des coordonnées dans le même repère pour les calculs.
  • button indique un changement ; buttons indique la combinaison enfoncée.
  • Les événements enter/leave considèrent un élément et ses enfants comme un tout.
  • Les informations essentielles doivent être accessibles autrement que par le survol.

3.3 Un glissement qui continue à suivre le pointeur

Un glissement nécessite de conserver des informations entre plusieurs événements. Stocke les coordonnées de départ du pointeur et la position de départ de l’élément. Chaque mouvement applique ensuite la différence depuis ce point de départ, afin que l’élément ne saute pas pour placer son coin sous le pointeur.

Calculer le déplacement

Une boîte commence à left: 100px; top: 50px. Le pointeur part des coordonnées 220, 140 dans la zone d’affichage et se déplace jusqu’à 260, 125. Le déplacement horizontal est de 40 px ; le déplacement vertical est de −15 px. En ajoutant ces déplacements à la position de départ de la boîte, on obtient left: 140px; top: 35px.

Utilise des coordonnées dans la zone d’affichage cohérentes pour les deux relevés du pointeur. Le calcul général est la position de départ de l’élément plus le déplacement du pointeur. N’ajoute pas chaque déplacement complet à la position déjà mise à jour de la boîte, car cela compterait à nouveau les mouvements précédents.

Mémoriser et capturer un pointeur

Pour une boîte sans marge, positionnée de façon absolue dans un conteneur positionné de façon relative :

let start = null;
box.addEventListener("pointerdown", (event) => {
  if (start || event.button !== 0) return;
  start = { id: event.pointerId, x: event.clientX,
    y: event.clientY, left: box.offsetLeft,
    top: box.offsetTop };
  box.setPointerCapture(event.pointerId);
});
box.addEventListener("pointermove", (event) => {
  if (!start || event.pointerId !== start.id) return;
  box.style.left = start.left +
    (event.clientX - start.x) + "px";
  box.style.top = start.top +
    (event.clientY - start.y) + "px";
});
function endDrag(event) {
  if (start && event.pointerId === start.id) start = null;
}
box.addEventListener("pointerup", endDrag);
box.addEventListener("pointercancel", endDrag);

L’identifiant stocké permet d’ignorer les mouvements et le relâchement d’un second pointeur. offsetLeft et offsetTop fournissent les positions de départ sous forme de nombres ; les styles nécessitent le suffixe "px".

La capture du pointeur maintient les événements suivants de ce pointeur dirigés vers la boîte, même lorsque le pointeur sort de celle-ci. Le navigateur libère la capture après le relâchement ou l’annulation du pointeur. releasePointerCapture(id) peut la libérer plus tôt.

Gérer la reprise en main par le navigateur

Un geste tactile peut devenir un défilement de la page ou un zoom, ce qui provoque pointercancel. Termine aussi le glissement à ce moment-là, comme pour pointerup ; sinon, un état périmé peut continuer à déplacer la boîte plus tard. Applique touch-action: none à la surface de glissement avant l’interaction pour réserver ce geste. Limite cette règle à cette surface afin que le reste de la page puisse défiler.

Utilise user-select: none sur la surface déplaçable pour éviter de sélectionner du texte. Définis draggable="false" sur ses images pour empêcher le comportement natif de glissement d’image.

Proposer un autre moyen de déplacer

Prévois le déplacement au clavier pour un composant qui a le focus et des boutons de déplacement sur lesquels cliquer ou appuyer. Les touches fléchées seules ne fournissent pas d’alternative à pointeur unique au glissement. Le critère de succès 2.5.7 des WCAG 2.2 exige une telle alternative, sauf si le glissement est essentiel ou relève d’un comportement du navigateur non modifié. Des boutons de déplacement natifs peuvent convenir aux utilisateurs du clavier comme du pointeur.

L’API HTML Drag and Drop, distincte, utilise dragstart, dragover et drop pour transférer des données, comme des fichiers. Sa séquence d’événements diffère de ce changement de position fondé sur le pointeur.

Points clés

  • Calcule chaque position à partir du point de départ mémorisé et du déplacement du pointeur.
  • Capture le pointeur actif et suis son identifiant.
  • Termine le glissement aussi bien à pointerup qu’à pointercancel.
  • Applique les règles tactiles et de sélection à la surface de glissement.
  • Prévois un accès au clavier et une alternative utilisable par clic ou contact tactile.
4

Gère les formulaires et valide les entrées avant l’envoi

Les formulaires combinent plusieurs types d’état : texte, valeurs numériques, choix cochés et noms répétés. Lis ces valeurs lors du bon événement, puis gère la soumission du formulaire comme une seule action. Les contraintes HTML fournissent des règles de validation courantes, tandis que JavaScript ajoute des relations entre les champs et des indications plus claires. Un formulaire utile conserve le travail de l’utilisateur, explique chaque correction et place le focus là où la prochaine modification doit être faite.

4.1 Lis les valeurs lorsqu’elles changent

Les composants de formulaire exposent différents types d’état. La propriété value d’un champ de texte est une chaîne ; la propriété checked d’une case à cocher est un booléen. Lire la bonne propriété est la première étape pour obtenir des calculs et des aperçus fiables.

Convertir les nombres volontairement

Même <input type="number"> possède une value qui est une chaîne. Avec le texte "3", ajouter 1 donne "31". Number(input.value) + 1 donne 4. Un champ numérique expose aussi valueAsNumber.

Une entrée vide nécessite une décision particulière. Number("") donne 0, ce qui peut faire passer une quantité manquante pour un vrai zéro. Vérifie d’abord input.value === "", ou utilise valueAsNumber, qui donne NaN pour un champ numérique vide. Teste ce résultat avec Number.isNaN().

Lire l’état sélectionné
ComposantPropriété à lire
Champ de texte, zone de texte, liste déroulantevalue
Champ numérique utilisé dans un calculvalueAsNumber, ou conversion d’une value non vide
Case à cocherchecked pour l’état coché ou non
Groupe de boutons radio nommé sizeform.elements.size.value pour la valeur sélectionnée

La propriété value d’une case à cocher est le texte configuré pour son envoi, ou "on" si aucun n’est fourni. Elle n’indique pas si la case est cochée. Une liste déroulante indique la valeur de l’option choisie. Pour trouver l’élément radio sélectionné lui-même, recherche input[name="size"]:checked.

Adapter l’événement à la mise à jour

input signale les modifications de l’utilisateur au fur et à mesure, y compris la saisie et le collage. change signale un choix validé : après la perte de focus d’un champ de texte modifié, ou immédiatement lorsqu’une case à cocher, un bouton radio ou une liste déroulante change.

message.addEventListener("input", () => {
  counter.textContent = 280 - message.value.length +
    " characters left";
});

Après « Hello », cinq caractères ont été utilisés et le compteur affiche « 275 characters left ». Un écouteur keydown s’exécuterait avant l’insertion du nouveau caractère dans la valeur et ne détecterait pas un collage effectué par un menu. Affecter message.value depuis le code ne déclenche ni input ni change ; appelle aussi directement la fonction de mise à jour.

Recueillir les champs nommés d’un formulaire

form.elements.email.value donne accès à un composant par son nom ou son identifiant. Utilise form.elements["first-name"] pour un nom contenant un trait d’union. La soumission utilise les noms : un identifiant seul n’inclut pas un champ dans les données.

const data = new FormData(form);
const email = data.get("email");
const topics = data.getAll("topics");

FormData recueille les paires nom-valeur actuelles admissibles. Les cases non cochées, les composants désactivés et les champs sans nom sont exclus. get() renvoie la première valeur pour un nom ; getAll() conserve les valeurs répétées, comme plusieurs sujets cochés. Les champs de fichier peuvent fournir des objets fichier ; les champs de texte ordinaires fournissent des chaînes.

Object.fromEntries(data) est pratique pour des noms distincts, mais ne garde que la dernière paire lorsque des noms sont répétés. Choisis getAll() lorsque chaque sélection compte. Comme input remonte par bouillonnement, un seul écouteur sur le formulaire peut lire event.target pour mettre à jour le champ qui a changé.

Points clés

  • Convertis la chaîne d’un champ avant un calcul et traite séparément un champ numérique vide.
  • Lis l’état d’une case à cocher dans checked.
  • Utilise input pour les modifications en temps réel et change pour les choix validés.
  • FormData inclut les composants nommés admissibles, pas tous les composants.
  • getAll() conserve les valeurs des noms répétés ; la conversion en objet ne le fait pas.
  • L’affectation d’une valeur par le code n’émet pas d’événement de modification.

4.2 Gère la soumission du formulaire

La soumission appartient au formulaire. Écoute son événement submit pour gérer par une seule voie un clic sur un bouton de soumission, un appui sur Entrée dans un champ sur une seule ligne et un appel de requestSubmit() par script.

Remplacer la navigation par une mise à jour de la page

Normalement, un formulaire envoie des données à l’URL de son action et charge la réponse. Sans action, la destination est la page actuelle. La méthode GET par défaut place les données dans l’URL. Pour mettre à jour la page actuelle avec JavaScript, annule cette action par défaut :

const form = document.querySelector("#new-todo");
form.addEventListener("submit", (event) => {
  event.preventDefault();
  const data = new FormData(form);
  const title = data.get("title").trim();
  if (title === "") return;
  addTodo(title);
  form.reset();
});

Ce formulaire possède un champ de texte activé nommé title. L’écouteur supprime les espaces au début et à la fin, ignore un résultat vide, ajoute un élément et rétablit les valeurs initiales des champs. reset() ne signifie pas toujours vider : un composant ayant une valeur initiale retrouve cette valeur.

Si l’élément apparaît brièvement puis disparaît lorsque la page se recharge, vérifie si preventDefault() a été oublié. Un écouteur de clic sur le bouton seul n’est pas le bon endroit pour gérer le formulaire, surtout lorsqu’une autre voie permet de le soumettre.

Comprendre ce qui déclenche la soumission

La soumission implicite par Entrée peut cliquer sur le bouton de soumission par défaut s’il est activé. Dans une zone de texte, Entrée insère une nouvelle ligne. Un bouton dans un formulaire est par défaut un bouton de soumission lorsque son type est omis : un bouton « Afficher le mot de passe » doit donc utiliser explicitement type="button".

Lorsqu’il y a plusieurs boutons de soumission, event.submitter indique celui qui a été utilisé. Il peut valoir null pour les voies sans bouton précis : le code doit donc le vérifier avant de le lire :

const button = event.submitter;
const intent = button ? button.value : "save";
const data = button ? new FormData(form, button) :
  new FormData(form);

Un bouton de soumission nommé, comme name="intent" value="publish", ajoute cette paire lorsqu’il est passé à FormData. Un appel à FormData(form) seul n’inclut pas la paire nom-valeur d’un bouton de soumission.

Préserver le parcours de validation
Voie de soumissionValidation automatiqueÉcouteur submit
Activation d’un bouton de soumission ou requestSubmit()Exécutée sauf si des attributs de validation la désactiventExécuté si la validation le permet
form.submit()IgnoréeIgnoré

La validation intégrée s’exécute avant l’événement de soumission. Si un champ obligatoire vide ne passe pas la validation, le navigateur signale le problème et ne déclenche pas submit. Une vérification personnalisée placée uniquement dans cet écouteur ne s’exécutera pas lors de cette tentative échouée. novalidate sur le formulaire désactive l’étape de validation automatique.

Utilise requestSubmit() lorsque le code a besoin du parcours normal de validation et de l’événement de soumission. Cette méthode demande la soumission sans déclencher de clic sur un bouton. Passe un bouton de soumission précis à requestSubmit(button) lorsque les paramètres de soumission de ce bouton doivent s’appliquer.

Points clés

  • Gère submit sur le formulaire pour couvrir les soumissions par l’utilisateur et par script.
  • Annule la soumission par défaut lorsque JavaScript remplace la navigation.
  • Donne type="button" aux boutons de formulaire qui ne servent pas à la soumission.
  • Utilise submitter pour distinguer les boutons de soumission et inclure ses données si nécessaire.
  • La validation précède submit ; requestSubmit() préserve ce parcours.
  • submit() contourne la validation et l’événement de soumission.
  • reset() rétablit les valeurs initiales.

4.3 Laisse HTML décrire les règles de validation

HTML peut décrire de nombreuses règles de saisie sans test JavaScript personnalisé. Le navigateur vérifie ces règles lors de la soumission et expose les résultats à ton code. Commence par les contraintes qui correspondent aux données dont tu as besoin.

Choisir une contrainte
AttributRègle
requiredUne valeur ou une sélection obligatoire doit être fournie.
type="email" ou "url"La valeur doit avoir la syntaxe attendue.
min, max, stepLes valeurs numériques ou les dates doivent respecter les bornes et les pas.
minlength, maxlengthLe texte saisi par l’utilisateur doit respecter une règle de longueur.
patternUne valeur textuelle non vide doit correspondre à une expression portant sur toute la valeur.

Pour pattern="[0-9]{5}", « 12345 » est accepté ; « 1234 », « 123456 » et « 12345a » sont refusés. Le motif couvre toute la valeur, pas une simple partie correspondante. Une entrée vide ignore la vérification du motif : ajoute donc required lorsque l’omission n’est pas autorisée.

La validation d’une adresse e-mail vérifie sa syntaxe, pas l’existence d’une boîte de réception. « ann@example.com » et « ann@example » respectent toutes deux la règle du navigateur, contrairement à « ann.example.com ». Un motif supplémentaire peut imposer un format plus précis si l’application l’exige.

Lire la raison de l’échec

L’objet validity d’un champ contient des indicateurs booléens. valueMissing, typeMismatch, patternMismatch, tooShort et tooLong décrivent du texte manquant ou mal formé. rangeUnderflow, rangeOverflow et stepMismatch décrivent des contraintes numériques. badInput couvre une saisie que le navigateur ne peut pas convertir en valeur exploitable, et customError indique la présence d’un message de validation personnalisé. valid est vrai lorsqu’aucune contrainte n’échoue.

Pour un champ numérique avec min="0" max="10" step="2", 12 dépasse le maximum, 7 ne respecte pas le pas autorisé et 6 est accepté. Plusieurs indicateurs peuvent être vrais ; ne suppose pas que chaque champ invalide présente exactement un problème.

Vérifier silencieusement ou signaler visiblement

checkValidity() renvoie un booléen et déclenche invalid sur les composants invalides sans afficher le message du navigateur. reportValidity() vérifie et signale aussi le problème à l’utilisateur. Appelle l’une ou l’autre méthode sur un champ ou un formulaire. validationMessage fournit le message dans la langue du navigateur. L’événement invalid ne remonte pas par bouillonnement.

Les contraintes de longueur s’appliquent au texte saisi par l’utilisateur. Affecter input.value = "ab" dans le code ne rend pas tooShort vrai simplement parce que minlength vaut 3. maxlength empêche normalement aussi l’utilisateur de saisir davantage de caractères au-delà de sa limite.

Afficher les erreurs au bon moment

:invalid s’applique immédiatement : un champ obligatoire encore intact correspond donc déjà au sélecteur. :user-invalid attend une interaction de l’utilisateur ou une tentative de soumission et peut éviter qu’un champ ne devienne rouge trop tôt. Utilise aussi du texte pour expliquer l’erreur, en plus d’un style visuel.

novalidate ignore la validation automatique du formulaire à la soumission ; formnovalidate l’ignore pour un bouton de soumission. Ces attributs ne suppriment pas les contraintes et ne désactivent pas checkValidity(). Les vérifications du navigateur aident les utilisateurs à corriger leurs erreurs ; le serveur doit valider à nouveau les données reçues, car une requête peut contourner la page.

Points clés

  • Utilise les contraintes HTML pour les valeurs obligatoires, la syntaxe, les bornes, les pas, la longueur et les motifs.
  • Un motif correspond à la valeur non vide entière ; utilise required pour refuser une entrée vide.
  • Lis les indicateurs de validity pour identifier pourquoi un champ est invalide.
  • checkValidity() vérifie ; reportValidity() affiche aussi un message.
  • Les attributs qui ignorent la validation laissent l’API de validation utilisable.
  • Valide aussi les données reçues sur le serveur.

4.4 Règles personnalisées et messages d’erreur utiles

Une règle qui concerne deux champs nécessite du code. Par exemple, une confirmation doit correspondre à un mot de passe ou une date de fin doit être postérieure à une date de début. Sépare la règle de la manière et du moment où son erreur est affichée.

Définir et effacer une erreur personnalisée

Une chaîne non vide passée à setCustomValidity() marque le champ comme invalide et définit customError. Passer "" efface cette erreur personnalisée ; les contraintes required, pattern ou d’autres contraintes peuvent toujours ne pas être respectées.

function checkMatch() {
  const matches = confirm.value === password.value;
  confirm.setCustomValidity(matches ? "" :
    "The passwords do not match.");
}
password.addEventListener("input", checkMatch);
confirm.addEventListener("input", checkMatch);

Vérifie à nouveau les deux champs dont dépend la règle. Modifier le premier mot de passe peut rendre incorrecte une confirmation auparavant correcte. Un message qui n’est jamais effacé garde le champ invalide après la correction de la différence. Exécute aussi la vérification initiale lorsque les champs peuvent contenir des valeurs dès le départ.

Les champs de date fournissent des chaînes ISO comme "2026-03-10", quel que soit le format de date local affiché. Les valeurs non vides de ces composants peuvent être comparées comme du texte. Si la règle impose que la fin soit postérieure au début, refuse end.value <= start.value, y compris l’égalité. Gère les dates manquantes avec required ou une vérification distincte des valeurs vides.

Expliquer la prochaine action utile

Un message doit indiquer le problème et sa correction. Pour une adresse e-mail manquante, indique « Saisis ton adresse e-mail. » Pour un texte d’adresse e-mail mal formé, indique « Saisis une adresse e-mail sous la forme name@example.com. » Conserve la valeur saisie pour que la personne puisse la modifier.

Un champ de nom obligatoire accepte les espaces, car ils forment une chaîne non vide. Vérifie name.value.trim() === "" lorsque les espaces en début et en fin de chaîne ne doivent pas compter. Efface cette erreur personnalisée dès qu’un texte qui a un sens apparaît.

Associer les messages aux composants
<label for="email">Email</label>
<input id="email" name="email" type="email"
  required aria-describedby="email-error">
<p id="email-error"></p>

Place l’erreur dans ce paragraphe et définis aria-invalid="true" tant que le champ présente une erreur. Efface le texte et supprime aria-invalid ou définis-le à "false" après correction. aria-describedby associe l’explication au champ pour la technologie d’assistance. Utilise du texte ; une bordure rouge seule ne permet pas à tout le monde de savoir ce qui a échoué.

Choisir le déroulement de la validation

Pour des messages entièrement personnalisés, ajoute novalidate et utilise un écouteur submit sur le formulaire. Mets à jour les règles personnalisées, examine la validité des champs, écris leurs messages et empêche la soumission si l’un d’eux est invalide. Déplace le focus vers le premier champ invalide ou vers un récapitulatif des erreurs contenant des liens. Si JavaScript gère aussi localement la soumission réussie, annule également cette soumission par défaut.

Évite de signaler un texte d’adresse e-mail incomplet dès les premières frappes. Une séquence utile consiste à afficher les erreurs après la perte de focus ou la soumission, puis à vérifier de nouveau sur input une erreur déjà signalée.

Points clés

  • Les messages personnalisés non vides rendent un champ invalide ; "" n’efface que cette erreur personnalisée.
  • Vérifie à nouveau chaque champ dont dépend une règle portant sur plusieurs champs.
  • Pour un ordre strict des dates, refuse l’égalité ainsi qu’une date de fin antérieure.
  • Explique la correction par du texte et associe ce texte au champ.
  • Efface les erreurs visibles et l’état d’erreur ARIA après correction.
  • Les messages personnalisés à la soumission nécessitent une gestion explicite de la validité et du focus.
5

Crée des composants personnalisés utilisables par tous

Choisir un élément natif fournit une grande partie du comportement d’un composant avant même l’écriture d’un écouteur. Les composants personnalisés demandent le même soin : un nom clair, un accès au clavier, un focus visible et un état qui correspond à ce qu’indique la technologie d’assistance. Les groupes nécessitent un déplacement prévisible entre les éléments. Lorsqu’un contenu s’ouvre, se ferme ou disparaît, une destination de focus choisie volontairement permet à l’utilisateur de poursuivre son interaction sans devoir chercher à nouveau dans la page.

5.1 Commence par un composant natif

Un composant a besoin de plus que d’une réponse au clic. Les personnes doivent pouvoir le trouver, l’atteindre, comprendre son rôle, l’utiliser et voir où se trouve le focus. Le HTML natif fournit déjà une grande partie de ce comportement.

Choisir l’élément adapté

Utilise un <button> pour une action, un <a href> pour la navigation et un composant de formulaire avec un libellé pour la saisie. <details> avec <summary> fournit un composant de divulgation. Mets ces éléments en forme avec CSS pour les adapter à la page. Un bouton qui a le focus s’active avec Entrée ou Espace sans écouteur de touche supplémentaire.

Un div avec un écouteur de clic ne possède ni la sémantique intégrée du bouton ni son comportement au clavier. Lui donner role="button" change ce qu’annonce la technologie d’assistance, mais ne lui permet pas de recevoir le focus et ne transforme pas les appuis sur les touches en clics.

BesoinBouton natifDiv personnalisé servant de bouton
RôleIntégréAjouter role="button".
Focus au clavierIntégréAjouter tabindex="0".
Entrée et EspaceIntégrésAjouter la gestion du clavier.
Nom accessibleGénéralement son texteFournir un texte qui a un sens ou un nom ARIA.
Comportement désactivédisabledVérifier aria-disabled dans le code.
Garder un ordre de focus prévisible

tabindex="0" ajoute un élément à la séquence normale de tabulation selon l’ordre du document. tabindex="-1" permet de donner le focus par le code sans ajouter d’arrêt de tabulation. Les valeurs positives placent les éléments avant la séquence habituelle et sont difficiles à maintenir ; évite-les.

Aucun de ces réglages n’ajoute de comportement d’activation. Un bouton personnalisé pouvant recevoir le focus a toujours besoin d’un écouteur pour fonctionner au clavier. Un rôle, un arrêt de tabulation et une fonction de rappel résolvent des parties différentes de l’interaction.

Donner un nom à chaque composant

Un lecteur d’écran utilise un nom accessible pour distinguer les composants. Un bouton textuel peut utiliser son texte visible. Un champ de texte ou une liste déroulante a besoin d’un libellé associé, comme <label for="email">Email</label> associé à id="email". aria-labelledby peut faire référence à un texte visible ailleurs ; aria-label peut fournir un nom lorsqu’il n’existe pas de texte visible adapté.

Un bouton de fermeture composé uniquement d’une icône peut être <button type="button" aria-label="Close">×</button>. Le nom décrit l’action au lieu de laisser l’utilisateur deviner le sens du symbole.

Afficher et faire respecter l’état

Garde un indicateur de focus visible. Si tu remplaces le contour par défaut, fournis un remplacement clair avec :focus-visible, par exemple outline: 3px solid #1a73e8. Le supprimer sans remplacement cache la position de l’utilisateur du clavier.

Un bouton natif désactivé quitte la séquence de tabulation et ne peut pas être activé normalement. aria-disabled="true" ne fait que communiquer son indisponibilité. Les actions au clic et au clavier d’un composant personnalisé doivent vérifier cet état et quitter la fonction sans agir. Centraliser cette vérification dans la fonction d’activation maintient la cohérence des deux modes d’entrée.

Points clés

  • Utilise un élément natif adapté à l’action ou à la saisie.
  • Un rôle ARIA fournit une sémantique, pas un comportement.
  • Utilise tabindex="0" pour l’accès normal par Tabulation et -1 pour un focus donné uniquement par le code.
  • Fournis un nom accessible et un indicateur de focus visible.
  • Fais respecter aria-disabled dans le code d’activation.

5.2 Associe le comportement au clavier et l’état

Un composant personnalisé doit donner le même résultat quelle que soit sa méthode d’activation. Garde l’action dans une seule fonction, dirige vers elle les utilisations au clavier et au pointeur, et mets à jour l’état lu à la fois par les styles et par la technologie d’assistance.

Permettre l’activation au clavier d’un bouton personnalisé
fakeButton.addEventListener("click", activate);
fakeButton.addEventListener("keydown", (event) => {
  if (event.key === "Enter" || event.key === " ") {
    event.preventDefault();
    activate();
  }
});

Ce code concerne un bouton personnalisé pouvant recevoir le focus. Annuler l’action d’Espace empêche le défilement de la page pendant son exécution. Un bouton natif produit déjà des clics lors de son activation au clavier : lui ajouter une seconde voie au clavier peut donc exécuter l’action deux fois.

Choisir l’état adapté au composant
ComposantÉtat
Bouton à bascule avec un libellé stablearia-pressed="true" ou "false"
Bouton ouvrant un composant de divulgationaria-expanded="true" ou "false"
Case à cocher ou interrupteur personnaliséaria-checked="true" ou "false"

Un bouton à bascule « Couper le son » garde ce libellé et modifie aria-pressed. Si le libellé de l’action devient « Activer le son », omets aria-pressed. Une case à cocher utilise role="checkbox" et Espace pour changer d’état ; un interrupteur utilise role="switch" pour les états activé et désactivé.

Les attributs contiennent des chaînes. Compare getAttribute("aria-expanded") avec "true", et non avec le booléen true :

detailsButton.addEventListener("click", () => {
  const open = detailsButton.getAttribute(
    "aria-expanded") === "true";
  detailsButton.setAttribute("aria-expanded", String(!open));
  panel.hidden = open;
});

Lorsque open était vrai, le nouvel état est faux et le panneau devient masqué. aria-controls peut identifier le panneau par son identifiant. Les éléments natifs <details> et <summary> fournissent le comportement de divulgation sans ce script.

Utilise l’attribut d’état comme source pour les styles, par exemple [aria-pressed="true"], afin que les états visible et annoncé changent ensemble. Ferme les éléments contextuels avec Échap et rends le focus à leur élément déclencheur.

Donner un seul arrêt de tabulation à un groupe

Les onglets, les barres d’outils et les groupes de boutons radio utilisent Tabulation pour entrer dans le groupe ou en sortir et les touches fléchées pour s’y déplacer. Le tabindex itinérant maintient l’élément courant à 0 et les autres à -1. Lors d’un déplacement, définis l’ancien élément à -1, le nouveau à 0 et donne le focus au nouvel élément.

Pour trois éléments, un déplacement vers la droite depuis l’indice 2 revient à 0 avec (2 + 1) % 3. Vers la gauche depuis 0, (0 - 1 + 3) % 3 permet d’atteindre 2. Ajoute la longueur avant l’opération de reste, car en JavaScript -1 % 3 vaut −1.

Vérifie au clavier : atteins le composant, vois le focus, active-le avec les touches appropriées, déplace-toi dans un groupe et ferme un élément contextuel avec Échap. Vérifie l’état visible et l’état ARIA à chaque changement.

Points clés

  • Dirige le clic, Entrée et Espace d’un bouton personnalisé vers une seule action.
  • Les boutons natifs fournissent déjà l’activation par clic au clavier.
  • Choisis aria-pressed, aria-expanded ou aria-checked selon l’état à représenter.
  • Compare les valeurs ARIA comme des chaînes et mets à jour les styles à partir du même état.
  • Le tabindex itinérant donne à un groupe un seul arrêt de tabulation et permet les déplacements avec les touches fléchées.
  • Échap ferme un élément contextuel et rend le focus à son élément déclencheur.

5.3 Déplace le focus lorsque la page change

Le focus détermine où va la prochaine action au clavier. Si le composant qui a le focus disparaît, l’utilisateur peut perdre sa place. Traite le focus comme une partie de la mise à jour de la page, en particulier lors de l’ouverture d’une boîte de dialogue, de la suppression d’un élément ou du signalement d’une erreur.

Ouvrir une boîte de dialogue et revenir à son élément déclencheur

Mémorise l’élément qui a le focus avant l’ouverture. Déplace le focus dans la nouvelle interaction, puis rétablis-le à la fermeture :

let opener;
openButton.addEventListener("click", () => {
  opener = document.activeElement;
  dialog.showModal();
});
dialog.addEventListener("close", () => {
  if (opener && opener.isConnected) opener.focus();
});

showModal() sur une boîte de dialogue native déplace le focus à l’intérieur et rend le reste de la page inerte : il est donc impossible de cliquer dessus ou de lui donner le focus tant que la boîte modale est ouverte. Échap provoque normalement un événement cancel, suivi de la fermeture et d’un événement close. Un écouteur cancel peut empêcher la fermeture si l’application nécessite ce comportement.

Choisis une destination initiale utile pour le focus dans la boîte de dialogue, comme son premier composant pertinent. Pour un élément contextuel personnalisé, le code doit déplacer volontairement le focus. Lorsque l’élément déclencheur d’origine n’existe plus, choisis plutôt un composant utile à proximité au lieu d’essayer de donner le focus à un élément détaché.

Rendre une destination utile accessible au focus

Un titre ou un récapitulatif des erreurs ne peut normalement pas recevoir le focus. Donne-lui tabindex="-1" avant d’appeler .focus(). Il peut alors recevoir le focus volontairement sans devenir un arrêt supplémentaire pendant la navigation normale par Tabulation. N’utilise 0 que s’il appartient à cette séquence normale.

Préserver la position après une suppression

Avant de supprimer un élément de liste dont le bouton de suppression a le focus, trouve la prochaine destination utile. Donne le focus au bouton de l’élément suivant ; s’il n’y a pas d’élément suivant, utilise le bouton de l’élément précédent. Si la liste devient vide, donne le focus à son titre avec tabindex="-1".

Trouver la destination avant la suppression évite de perdre le lien avec les éléments voisins. N’envoie pas le focus en haut du document après chaque suppression ; la personne doit pouvoir continuer à travailler près de l’endroit modifié.

Garder le focus dans une interaction en cours

Un élément contextuel peut se fermer lorsque le focus quitte toute sa zone. L’événement focusout, qui remonte par bouillonnement, fournit la destination :

menu.addEventListener("focusout", (event) => {
  if (!menu.contains(event.relatedTarget)) {
    menu.hidden = true;
  }
});

Passer d’un composant du menu à un autre ne le ferme pas, car la destination reste à l’intérieur. Une destination null est aussi à l’extérieur ; contains(null) est faux. Ne rends pas automatiquement le focus à l’élément déclencheur lorsque l’utilisateur l’a volontairement déplacé vers un autre composant de la page.

Rendre les changements prévisibles

Après l’échec d’une validation personnalisée de formulaire, donne le focus au premier champ invalide ou à un récapitulatif des erreurs contenant des liens vers celles-ci. La validation intégrée donne déjà le focus à un champ invalide. Garde le texte d’erreur disponible pour que la personne sache quoi corriger.

Ne passe pas à un nouveau champ pendant que l’utilisateur saisit du texte et ne lance pas une navigation dès qu’une liste déroulante change. Laisse une action claire confirmer le changement. Le déplacement du focus doit accompagner une action volontaire ou une correction, sans interrompre la saisie ordinaire.

Points clés

  • Mémorise l’élément déclencheur et rétablis le focus sur une destination disponible à la fermeture d’une boîte de dialogue.
  • Utilise tabindex="-1" pour un titre ou un récapitulatif auquel le code donne le focus.
  • Après une suppression, donne le focus à un élément voisin ou au titre de la liste vide.
  • Utilise relatedTarget pour distinguer un déplacement interne du focus d’une sortie de l’élément contextuel.
  • Après une validation échouée, donne le focus à une destination liée aux erreurs ; évite les déplacements inattendus du focus.

Événements JavaScript : exemples

5 Leçons Interactives

1

Crée et examine des écouteurs d’événements

13 étapes
Enregistre un compteur, examine des clics imbriqués et corrige la durée de vie des écouteurs.
  1. 1
    IntroductionFais réagir un bouton

    Un écouteur relie un événement à une fonction. Construis un petit compteur en choisissant le bouton, en enregistrant son action et en conservant le total entre les appels. Examine ensuite un click imbriqué et contrôle la durée de vie de l’écouteur.

    Observe la différence entre le code de mise en place, qui s’exécute maintenant, et la fonction de rappel, que le navigateur appelle lorsque l’événement choisi se produit.

  2. 2
    ExempleStocke le total hors de la fonction de rappel

    Sélectionne le bouton existant et stocke son compteur avant l’enregistrement :

    const button = document.querySelector("#like");
    let likes = 0;
    button.addEventListener("click", () => {
      likes = likes + 1;
      button.textContent = "Likes: " + likes;
    });
    

    Chaque appel augmente le total précédent. Après trois clics, le libellé est « Likes: 3 ». Un compteur déclaré dans la fonction de rappel repartirait de zéro à chaque appel.

  3. 3
    ConseilPasse l’action sans l’appeler

    addEventListener("click", showMenu) passe une fonction pour une utilisation ultérieure. showMenu() l’appellerait pendant la mise en place. Lorsque des arguments sont nécessaires, utilise () => showMenu("main").

    Charge le script après la création du bouton, par exemple avec defer, et respecte l’orthographe exacte de l’événement. Un écouteur de "Click" ne reçoit pas les événements "click" ordinaires.

  4. 4
    DéfiCorrige un enregistrement

    Un bouton doit ouvrir le panneau de conseils à chaque activation. La mise en place utilise actuellement button.addEventListener("click", openTips()). Que faut-il changer et pourquoi ?

    ---reveal---

    Passe openTips sans parenthèses. Cela fournit la fonction de rappel à exécuter lors d’un click ultérieur. Appeler openTips() pendant la mise en place ouvre immédiatement le panneau et passe son résultat au lieu de conserver l’action pour l’événement.

  5. 5
    ExplicationLis les deux propriétés d’élément

    Pour un bouton contenant une image, cliquer sur l’image fait d’elle la target. Dans l’écouteur du bouton, currentTarget est le bouton.

    La propriété target indique où l’événement a commencé ; la cible courante, distincte de target, indique où cette fonction de rappel a été enregistrée. Cette différence explique pourquoi lire le dataset d’un bouton depuis target peut échouer lorsque le click atteint son image.

  6. 6
    ExempleLis les données du bouton qui les possède

    Supposons que button possède data-id="7" et contienne une icône :

    button.addEventListener("click", (event) => {
      console.log(event.currentTarget.dataset.id);
    });
    

    Le résultat est "7" aussi bien pour un click sur l’icône que pour un click sur l’arrière-plan du bouton. La même expression fonctionne dans un écouteur écrit avec une fonction fléchée ou classique. Le this d’une fonction fléchée ne désigne pas automatiquement le bouton.

  7. 7
    DéfiIdentifie l’élément auquel appartient l’écouteur

    Une section contient un bouton avec un span. Un écouteur click est ajouté uniquement à la section et l’utilisateur clique sur le span. Que désignent target et currentTarget pendant cette fonction de rappel ?

    ---reveal---

    target désigne le span où l’événement a commencé. currentTarget désigne la section à laquelle l’écouteur a été ajouté. L’origine de l’événement n’est pas remplacée par l’ancêtre qui le reçoit.

  8. 8
    ExplicationGarde la référence pour la suppression

    La suppression nécessite le même type d’événement, le même objet fonction de rappel et le même réglage de capture :

    const handler = () => closePanel();
    button.addEventListener("click", handler);
    button.removeEventListener("click", handler);
    

    Une fonction anonyme peut être supprimée lorsque sa référence est enregistrée ainsi. Écrire un nouveau () => closePanel() dans l’appel de suppression crée un autre objet qui ne correspond pas à l’enregistrement précédent.

  9. 9
    LienMets fin à plusieurs enregistrements ensemble

    Une fonctionnalité temporaire peut passer un seul signal AbortController à plusieurs enregistrements. Appeler controller.abort() supprime ces écouteurs, y compris les fonctions de rappel enregistrées ou anonymes.

    Utilise un nouveau contrôleur pour une autre période d’utilisation. Pour une réponse unique, { once: true } supprime cet enregistrement après son exécution. Aucune des deux options n’empêche des fonctions de rappel distinctes de s’accumuler avant la fin de leur durée de vie.

  10. 10
    DéfiDiagnostique une mise en place répétée

    L’ouverture d’un panneau enregistre à chaque fois un nouvel écouteur de touches anonyme sur le document. La fermeture masque le panneau mais laisse l’écouteur en place. Après trois ouvertures, une touche déclenche trois actions. Comment corriger ce cycle de vie ?

    ---reveal---

    Supprime les enregistrements lorsque le panneau se ferme, par exemple en annulant leur signal partagé, et crée un nouveau contrôleur à la réouverture. Tu peux aussi enregistrer une fonction de rappel et supprimer cette même référence. Masquer le panneau ne supprime pas un écouteur sur le document.

  11. 11
    Point cléDéclenche immédiatement une notification

    Pour informer un autre code, crée un CustomEvent avec ses données dans detail. Définis bubbles: true si les ancêtres doivent le recevoir :

    item.dispatchEvent(new CustomEvent("cart:add", {
      detail: { id: 42 }, bubbles: true
    }));
    

    Les écouteurs s’exécutent avant le retour de l’appel. L’événement déclenché a isTrusted à faux. C’est une notification envoyée par ton code, pas une demande au navigateur d’attendre une action de l’utilisateur.

  12. 12
    DéfiCombine origine et durée de vie

    Le gestionnaire click d’un bouton utilise son propre data-key et ne doit agir qu’à la première activation. Il contient une icône SVG. Quels propriété et option permettent de satisfaire les deux exigences ?

    ---reveal---

    Lis event.currentTarget.dataset.key dans l’écouteur ajouté directement au bouton et enregistre-le avec { once: true }. La propriété désigne le bouton concerné même lors d’un click sur l’icône. L’option supprime cet enregistrement après son premier appel.

  13. 13
    RécapitulatifVérifie un écouteur à trois endroits

    Lorsqu’une interaction échoue, examine la mise en place, les données de la fonction de rappel et sa durée de vie. Vérifie que l’élément existe et que le nom de l’événement est exact ; examine target et currentTarget pendant l’appel ; puis cherche une suppression manquante ou un enregistrement répété. Ces vérifications permettent de distinguer un écouteur qui ne reçoit jamais d’événement d’un écouteur qui le reçoit correctement mais agit sur le mauvais élément.

2

Suis les événements et délègue les actions

13 étapes
Prévois l’ordre des écouteurs, remplace les actions par défaut du navigateur et gère les nouveaux éléments d’une liste.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuis un clic dans une fiche
  2. 2
    ExempleLis le trajet de remontée
  3. 3
    ExplicationAjoute le trajet de descente
  4. 4
    DéfiSuis un arbre plus petit
  5. 5
    ExplicationRemplace la navigation
  6. 6
    Point cléArrêter la propagation est un choix distinct
  7. 7
    DéfiGarde un observateur parent actif
  8. 8
    ExplicationDéplace l’écouteur sur la liste
  9. 9
    ExempleTrouve et vérifie le bouton de suppression
  10. 10
    DéfiGère une icône imbriquée
  11. 11
    ConseilUtilise un événement qui atteint le conteneur
  12. 12
    DéfiSépare l’ouverture et la fermeture
  13. 13
    RécapitulatifChoisis où gérer chaque action
3

Gère les touches et crée un glissement au pointeur

16 étapes
Choisis les événements d’entrée, manipule les coordonnées et rends un glissement robuste et utilisable.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisis le bon niveau d’entrée
  2. 2
    ExplicationDistingue le sens de la position
  3. 3
    ConseilProtège la saisie et gère les répétitions
  4. 4
    DéfiChoisis un événement pour un aperçu
  5. 5
    LienRends l’activation accessible au clavier
  6. 6
    ExempleChange de repère de coordonnées
  7. 7
    DéfiExamine un clic après défilement
  8. 8
    Point cléÉvite de faire du survol le seul accès
  9. 9
    ExempleCalcule un mouvement de glissement
  10. 10
    ExplicationStocke le départ et capture le pointeur
  11. 11
    ExempleApplique le déplacement à chaque mouvement
  12. 12
    ConseilTermine le glissement même si le navigateur reprend la main
  13. 13
    DéfiPrévois la suite d’un glissement
  14. 14
    LienPropose un déplacement sans glissement
  15. 15
    DéfiDiagnostique deux échecs de glissement
  16. 16
    RécapitulatifAssocie l’événement à la tâche
4

Crée une interaction complète avec un formulaire

16 étapes
Lis les champs, gère la soumission et guide la correction avec la validation native et personnalisée.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuis un formulaire de la modification à la soumission
  2. 2
    ExempleLis un nombre sans concaténation
  3. 3
    ExplicationLis les choix et les noms répétés
  4. 4
    DéfiConserve chaque sujet sélectionné
  5. 5
    ExplicationGère la soumission sur le formulaire
  6. 6
    ExempleLis, ajoute et réinitialise
  7. 7
    DéfiConserve le parcours normal de soumission
  8. 8
    ExempleLis les échecs de contraintes indépendantes
  9. 9
    Point cléUn motif n’exige pas de valeur
  10. 10
    DéfiVérifie un intervalle avec un pas
  11. 11
    ExplicationAjoute une règle reliant deux champs
  12. 12
    ConseilDistingue la validité du moment d’affichage des erreurs
  13. 13
    DéfiCorrige une règle de dates non actualisée
  14. 14
    LienPrends en charge les messages lorsque ceux du navigateur sont désactivés
  15. 15
    DéfiComplète le parcours de correction
  16. 16
    RécapitulatifVérifie les parcours valides et invalides
5

Crée des composants et préserve la position au clavier

14 étapes
Choisis le comportement natif, synchronise l’état personnalisé et gère le focus lorsque la page change.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionRends une interaction utilisable au clavier
  2. 2
    ExplicationUtilise le comportement déjà fourni par HTML
  3. 3
    ConseilDéfinis l’accès au focus selon le besoin
  4. 4
    DéfiCorrige une action inaccessible
  5. 5
    ExempleGarde une seule fonction d’activation
  6. 6
    ExplicationExprime le bon type d’état
  7. 7
    DéfiInverse correctement un composant de divulgation
  8. 8
    ExempleDéplace un arrêt de tabulation dans un groupe
  9. 9
    LienMémorise l’origine d’une boîte de dialogue
  10. 10
    ExempleMaintiens ouvert l’élément lors d’un déplacement interne du focus
  11. 11
    DéfiChoisis le focus après une suppression
  12. 12
    DéfiSuis la mise à jour d’un groupe
  13. 13
    DéfiRends un élément contextuel prévisible
  14. 14
    RécapitulatifTeste la séquence complète du composant

Événements JavaScript : QCM

50 Questions Pratiques en 5 séries

Série 1 : Suis les actions imbriquées et la délégation10 Questions Pratiques

Question 1 sur 10

Un bouton se trouve dans une section, elle-même dans un élément main. Chacun possède un écouteur de clic ordinaire. Dans quel ordre s’exécutent-ils lorsqu’on clique sur le bouton ?
  1. Main → section → bouton.
  2. Section → bouton → main.
  3. Bouton → section → main.
  4. Bouton → main → section.
Afficher la réponseMasquer la réponse
Réponse : C
Les écouteurs ordinaires s’exécutent sur la cible, puis sur le trajet de bouillonnement. Le clic commence sur le bouton, passe par sa section, puis par son ancêtre main. Un ordre commençant par main décrirait des écouteurs en phase de capture sur le trajet des ancêtres, ce qui ne correspond pas aux enregistrements indiqués ici.

Question 2 sur 10

Un conteneur possède un écouteur de clic en phase de capture et un écouteur de clic ordinaire. Son bouton enfant possède un écouteur de clic ordinaire. Quel est l’ordre affiché lorsqu’on clique sur le bouton ?
  1. Capture du conteneur → bouton → écouteur ordinaire du conteneur.
  2. Bouton → capture du conteneur → écouteur ordinaire du conteneur.
  3. Écouteur ordinaire du conteneur → bouton → capture du conteneur.
  4. Capture du conteneur → écouteur ordinaire du conteneur → bouton.
Afficher la réponseMasquer la réponse
Réponse : A
L’écouteur en phase de capture observe la descente avant le traitement de la cible. L’écouteur du bouton s’exécute ensuite sur la cible, suivi de l’écouteur ordinaire du conteneur pendant le bouillonnement. L’ordre d’enregistrement ne place pas l’écouteur de bouillonnement d’un ancêtre avant la phase cible.

Question 3 sur 10

Un formulaire possède un écouteur focus ordinaire, mais donner le focus à son champ enfant ne l’appelle pas. Comment le formulaire peut-il observer le focus de ses descendants sans utiliser la capture ?
  1. Écouter blur sur le formulaire.
  2. Ajouter bubbles: true comme option de l’écouteur.
  3. Lire currentTarget dans la fonction de rappel focus existante.
  4. Écouter focusin sur le formulaire.
Afficher la réponseMasquer la réponse
Réponse : D
focusin remonte par bouillonnement depuis le champ jusqu’à son formulaire : un écouteur ordinaire sur le formulaire peut donc l’observer. focus et blur ne remontent pas. Une option d’écouteur ne peut pas changer le comportement de bouillonnement de l’événement du navigateur ; lire une propriété dans une fonction de rappel qui ne s’exécute jamais ne peut pas résoudre l’absence de l’événement.

Question 4 sur 10

L’écouteur d’un lien appelle uniquement event.stopPropagation(). Qu’arrive-t-il à sa navigation normale ?
  1. La navigation est annulée.
  2. Le lien est quand même suivi.
  3. Le lien exige deux clics.
  4. Les écouteurs des ancêtres la bloquent.
Afficher la réponseMasquer la réponse
Réponse : B
Arrêter la propagation empêche l’événement d’atteindre d’autres éléments, mais la navigation est l’action par défaut distincte du lien. Puisqu’aucune annulation n’est indiquée, cette action reste possible. Utilise preventDefault() dans un écouteur qui peut annuler l’événement lorsque le code remplace la navigation par une action dans la page.

Question 5 sur 10

L’écouteur de soumission d’un formulaire appelle preventDefault(). Un écouteur de soumission ordinaire existe aussi sur une section qui l’entoure. Que peut observer l’écouteur de la section ?
  1. Il est ignoré, car l’annulation arrête le bouillonnement.
  2. Il s’exécute et lit defaultPrevented à faux.
  3. Il ne s’exécute que s’il appelle aussi preventDefault().
  4. Il s’exécute et peut lire defaultPrevented à vrai.
Afficher la réponseMasquer la réponse
Réponse : D
Annuler l’action par défaut du formulaire n’empêche pas l’événement de soumission de remonter par bouillonnement. L’écouteur de la section s’exécute quand même et peut voir que l’action par défaut a été empêchée. Il faudrait arrêter séparément la propagation ; répéter l’annulation dans l’ancêtre n’est pas nécessaire pour recevoir l’événement.

Question 6 sur 10

Un bouton ouvre un menu. Un écouteur de clic sur le document le referme ensuite lors du même clic. Le menu doit aussi se fermer lors des véritables clics à l’extérieur, et la journalisation au niveau du document doit continuer à fonctionner. Quel changement répond à ces trois besoins ?
  1. Fermer seulement si ni le menu ni son élément déclencheur ne contient la cible.
  2. Arrêter la propagation à chaque clic sur le bouton du menu avant l’ouverture.
  3. Annuler le clic sur le bouton du menu avant de changer l’état masqué.
  4. Fermer seulement si le menu lui-même ne contient pas la cible.
Afficher la réponseMasquer la réponse
Réponse : A
Le clic d’ouverture remonte par bouillonnement jusqu’au document et se trouve hors du menu mais dans son élément déclencheur. Tester les deux zones préserve le menu qui vient de s’ouvrir tout en le fermant lors des autres clics à l’extérieur. Arrêter la propagation cacherait cet événement à la journalisation du document ; annuler une action par défaut ne change aucun des deux tests d’appartenance.

Question 7 sur 10

Un écouteur délégué sur une barre d’outils reçoit un clic dont la cible est un SVG dans un bouton. Quelle expression trouve le bouton à partir de cette cible ?
  1. event.target.closest("button")
  2. event.currentTarget.closest("button")
  3. event.target.matches("button")
  4. event.target.querySelector("button")
Afficher la réponseMasquer la réponse
Réponse : A
closest() part du SVG cliqué et remonte jusqu’au bouton. matches() ne teste que le SVG et ne peut donc pas identifier le composant qui l’entoure. Chercher vers le bas avec querySelector() suit aussi la mauvaise direction pour un bouton qui contient la cible de l’événement.

Question 8 sur 10

Une liste vide reçoit un écouteur de clic délégué. Le code ajoute plus tard un bouton de suppression correspondant dans un élément. Quel enregistrement faut-il pour le nouveau bouton ?
  1. Enregistrer aussi la même fonction de rappel sur le nouveau bouton.
  2. Aucun nouvel enregistrement ; son clic atteint la liste.
  3. Supprimer puis réajouter l’écouteur de la liste après l’insertion.
  4. Déclencher de nouveau DOMContentLoaded après l’ajout du bouton.
Afficher la réponseMasquer la réponse
Réponse : B
L’événement remonte par bouillonnement depuis le nouveau bouton jusqu’à la liste existante, où la fonction de rappel déléguée s’exécute déjà. Elle sélectionne le composant concerné à partir de la cible de l’événement. Ajouter un autre écouteur direct est inutile et peut doubler le travail si les deux fonctions de rappel effectuent la même action.

Question 9 sur 10

Un écouteur délégué utilise closest(".action") dans un conteneur imbriqué dans un élément extérieur .action. Un clic dans un espace vide trouve cet élément extérieur. Quelle vérification limite le traitement au conteneur ?
  1. Quitter si event.currentTarget === container.
  2. Quitter seulement si l’élément trouvé est égal à event.target.
  3. Quitter si l’élément trouvé n’a pas d’éléments enfants.
  4. Quitter si l’élément trouvé est hors de container.
Afficher la réponseMasquer la réponse
Réponse : D
closest() peut remonter au-delà du conteneur de l’écouteur et renvoyer un ancêtre extérieur. Après avoir vérifié qu’un élément a été trouvé, utilise container.contains(match) pour exclure ce résultat. Tester currentTarget === container exclurait tous les événements dans cet écouteur, y compris les clics valides sur ses propres composants enfants.

Question 10 sur 10

Une liste délègue les clics de suppression avec closest(".remove") et des vérifications d’appartenance. Les nouveaux boutons fonctionnent, sauf sur une ligne dont l’écouteur de l’icône appelle stopPropagation(). La zone de remplissage du bouton de cette même ligne fonctionne. Pourquoi cette différence ?
  1. La vérification d’appartenance exclut tous les SVG descendants.
  2. Les nouvelles lignes exigent des écouteurs directs sur toutes leurs icônes.
  3. Les clics sur l’icône sont arrêtés avant d’atteindre la liste.
  4. closest cherche vers le bas lorsque la cible est une icône.
Afficher la réponseMasquer la réponse
Réponse : C
L’écouteur de l’icône bloque la remontée : la fonction de rappel de la liste ne reçoit donc jamais ce clic. Un clic sur la zone de remplissage du bouton ne passe pas par l’écouteur de l’icône et peut toujours remonter jusqu’à la liste. closest() peut gérer une icône comme cible, mais ne peut pas aider une fonction de rappel déléguée qui ne reçoit jamais l’événement.
Série 2 : Configure et examine des écouteurs d’événements10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un bouton doit appeler showHints uniquement lorsqu’il est activé. Quel enregistrement permet cela ?
  1. button.addEventListener("click", showHints());
  2. button.addEventListener("click", showHints);
  3. button.addEventListener("onclick", showHints);
  4. button.addEventListener("click", () => showHints);
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un script dans l’en-tête sélectionne un bouton dont le balisage apparaît plus loin, puis échoue sur addEventListener. Quelle modification du chargement permet d’attendre que le HTML soit analysé avant la sélection ?
  1. Renommer le paramètre de l’écouteur en event.
  2. Utiliser onclick comme nom d’événement enregistré.
  3. Déplacer la sélection dans un appel de fonction immédiat.
  4. Ajouter defer à la balise du script externe.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un script externe utilise const items = document.querySelectorAll(".choice"); items.addEventListener("click", choose);. Tous les choix existent déjà. Pourquoi cela échoue-t-il et comment faut-il modifier la mise en place ?
  1. Le résultat est une NodeList ; enregistrer sur chaque élément.
  2. Le résultat est une NodeList ; utiliser le nom d’événement "onclick".
  3. La fonction de rappel manque de parenthèses ; enregistrer choose() sur la liste.
  4. Le résultat est un élément ; y enregistrer un écouteur en phase de capture.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Deux fonctions distinctes sont affectées dans cet ordre : button.onclick = first; button.onclick = second;. Que se passe-t-il lorsque l’utilisateur clique une fois sur le bouton ?
  1. first s’exécute, puis second.
  2. Seule first s’exécute.
  3. Seule second s’exécute.
  4. second s’exécute, puis first.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un écouteur de clic est enregistré sur un bouton contenant un span. L’utilisateur clique sur le span. Que valent target et currentTarget pendant l’exécution de cet écouteur ?
  1. target : le bouton ; currentTarget : le span.
  2. target : le span ; currentTarget : le bouton.
  3. target : le span ; currentTarget : le span.
  4. target : le bouton ; currentTarget : le bouton.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un écouteur écrit avec une fonction fléchée sur <button data-code="r8"><span>Run</span></button> lit event.target.dataset.code. Pourquoi cette expression peut-elle renvoyer undefined, et quelle expression permet à l’écouteur direct de lire le code du bouton ?
  1. Le span peut être la cible ; lire event.currentTarget.dataset.code.
  2. Le bouton perd ses données ; lire event.type.dataset.code.
  3. Le span peut être la cible ; lire this.dataset.code dans la fonction fléchée.
  4. Le bouton est la cible ; lire event.currentTarget.value.code.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un écouteur affiche son objet événement dans la console. Après la fin de l’interaction, développer l’objet affiché révèle currentTarget: null. Comment le développeur peut-il examiner l’élément auquel appartient l’écouteur pendant l’appel ?
  1. Lire event.target après l’appel comme élément de l’écouteur.
  2. Ajouter once: true pour que l’objet garde sa cible courante.
  3. Afficher à nouveau l’objet événement après le déclenchement.
  4. Afficher event.currentTarget dans l’écouteur.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une fonction de rappel a été enregistrée avec { capture: true }. Le même type et la même fonction sont passés à removeEventListener, mais aucun troisième argument n’est fourni. Pourquoi la fonction de rappel reste-t-elle enregistrée ?
  1. La suppression exige de répéter toutes les options initiales.
  2. Les fonctions en phase de capture ne peuvent être supprimées qu’avec abort().
  3. La suppression recherche l’enregistrement sans capture.
  4. La suppression compare le code source de la fonction plutôt que son identité.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Chaque clic sur « Begin » enregistre board.addEventListener("click", () => mark()). Après deux démarrages, un clic sur le plateau place deux marques. Quel changement de mise en place empêche cette accumulation ?
  1. Ajouter once: true à chaque nouvelle fonction de rappel du plateau.
  2. Supprimer un nouveau () => mark() avant de l’ajouter.
  3. Définir board.onclick = null avant d’ajouter chaque fonction de rappel.
  4. Enregistrer une seule fonction de rappel conservée lors de la mise en place initiale.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un bouton sans autre écouteur reçoit les enregistrements suivants, puis l’utilisateur clique deux fois dessus. Combien de fois log s’exécute-t-elle au total ?

button.addEventListener("click", log, { once: true });
button.addEventListener("click", log);
button.addEventListener("click", log, true);
button.removeEventListener("click", log);
  1. 2
  2. 1
  3. 3
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Gère les entrées au clavier, au pointeur et par glissement10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un raccourci doit suivre la lettre produite quelle que soit la disposition du clavier. Quelle propriété doit-il tester ?
  1. event.code
  2. event.repeat
  3. event.button
  4. event.key
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un aperçu ne prend pas en compte le texte collé depuis un menu contextuel et affiche la saisie avec un caractère de retard. Il lit actuellement le champ dans keydown. Quel changement corrige les deux symptômes ?
  1. Lire le champ dans un écouteur keyup.
  2. Lire event.code dans l’écouteur keydown.
  3. Lire le champ dans un écouteur input.
  4. Appeler preventDefault() à chaque keydown.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un raccourci sur « n » seul, au niveau du document, doit ouvrir un panneau une fois par appui sans interrompre la saisie. Maintenir N enfoncé dans un div modifiable l’ouvre actuellement de façon répétée. Quelles conditions faut-il vérifier avant l’ouverture ?
  1. Ignorer les cibles modifiables et les appels keydown répétés.
  2. Ignorer seulement les appels répétés ; accepter toutes les cibles modifiables.
  3. Ignorer seulement les éléments input ; accepter tous les appels répétés.
  4. Annuler d’abord chaque touche, puis ignorer les cibles modifiables.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

L’action d’un bouton natif fonctionne à la souris, mais pas lorsqu’il est activé avec Espace. Son seul écouteur utilise pointerdown. Quel événement doit gérer l’action ?
  1. pointermove
  2. click
  3. mousedown
  4. pointerenter
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Le document a défilé de 420 px vers le bas. Un événement de pointeur indique clientY à 75. Quelle est sa coordonnée verticale par rapport au document ?
  1. 495 px
  2. 345 px
  3. 75 px
  4. 420 px
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une fiche d’aide masque son infobulle lorsque le pointeur passe de l’arrière-plan de la fiche à un badge enfant. Son écouteur de masquage utilise pointerout. Quel événement détecte mieux la sortie de la fiche entière ?
  1. pointerover
  2. pointermove
  3. pointerleave
  4. pointerdown
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une boîte commence à left: 65px; top: 90px. Son pointeur part de 180, 210 et se déplace jusqu’à 155, 245 en coordonnées client. Quelle position la boîte doit-elle atteindre ?
  1. left: 155px; top: 245px
  2. left: 90px; top: 55px
  3. left: 25px; top: 35px
  4. left: 40px; top: 125px
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une boîte stocke les bonnes positions de départ et capture son premier contact tactile. Un second contact écrase ensuite les positions de départ, et le relâchement de l’un ou l’autre contact termine le mouvement. Quel changement d’état corrige ces deux défauts ?
  1. Capturer chaque nouveau pointeur et écraser les départs à chaque appui.
  2. Stocker l’identifiant du pointeur actif et vérifier l’appui, le mouvement et la fin.
  3. Utiliser les coordonnées page et laisser tout pointeur terminer l’interaction.
  4. Ignorer pointercancel et garder tous les écouteurs de mouvement passifs.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un glissement tactile utilise la capture du pointeur et des calculs corrects, mais un geste de défilement du navigateur l’annule. Le mouvement suivant du pointeur peut encore déplacer la boîte. Quels deux changements règlent la prise en charge du geste et l’état resté actif ?
  1. Appliquer localement user-select: none ; effacer l’état seulement à pointerup.
  2. Capturer à nouveau le pointeur à chaque mouvement ; ignorer l’annulation.
  3. Appliquer localement touch-action: none ; effacer l’état à pointercancel.
  4. Annuler chaque keydown du document ; effacer l’état au relâchement d’une touche.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une liste réorganisable prend en charge le glissement et le déplacement avec les touches fléchées. Un utilisateur tactile ne peut pas effectuer un glissement précis. Quel ajout lui offre une alternative adaptée ?
  1. Des boutons de déplacement utilisables par clic ou contact tactile.
  2. Une poignée de glissement plus longue sur chaque élément.
  3. Des instructions décrivant les touches fléchées.
  4. Un menu d’indications de déplacement accessible uniquement au survol.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Lis les données de formulaire et diagnostique la validation10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un champ numérique contient "6". Que produit input.value + 2 ?
  1. La chaîne "62".
  2. Le nombre 8.
  3. Le nombre 62.
  4. La chaîne "8".
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un formulaire contient des champs de sujets cochés nommés topic, avec les valeurs "art" et "code" dans l’ordre du document, un champ topic non coché de valeur "music" et une note nommée désactivée. Que renvoie new FormData(form).getAll("topic") et pourquoi la conversion en objet présente-t-elle un risque ?
  1. ["art", "code", "music"] ; la conversion en objet ne garde que le premier nom répété.
  2. ["art", "code"] ; la conversion en objet ajoute les composants désactivés à la collection.
  3. ["code"] ; la conversion en objet recueille toutes les valeurs de sujets dans un tableau.
  4. ["art", "code"] ; la conversion en objet ne garde que le dernier nom répété.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un bouton « Afficher les détails » dans un formulaire doit uniquement révéler un panneau. Quel type explicite l’empêche d’envoyer le formulaire ?
  1. type="submit"
  2. type="reset"
  3. type="text"
  4. type="button"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un formulaire possède un champ obligatoire vide. Une barre d’outils appelle form.submit(), et l’écouteur du formulaire qui empêche la navigation ne s’exécute jamais. Quel appel rétablit le parcours attendu et que se passe-t-il avant la correction du champ ?
  1. Utiliser requestSubmit() ; l’écouteur de soumission s’exécute avant que la validation le bloque.
  2. Utiliser à nouveau submit() ; le second appel exécute l’écouteur après la validation.
  3. Utiliser requestSubmit() ; la validation bloque la soumission avant le déclenchement de submit.
  4. Utiliser dispatchEvent(new Event("submit")) ; cet appel effectue la validation intégrée normale.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un champ de texte facultatif possède pattern="[A-Z]{3}". Une valeur vide satisfait-elle cette contrainte de motif ?
  1. Non ; chaque motif rend la saisie obligatoire.
  2. Oui ; le motif ignore les valeurs vides.
  3. Non ; la valeur vide provoque typeMismatch.
  4. Oui ; le motif ne s’applique qu’aux chiffres saisis.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un champ numérique possède min="2" max="14" step="4". L’utilisateur saisit 12. Quelle contrainte échoue ?
  1. stepMismatch, car les valeurs autorisées par le pas sont 2, 6, 10, 14.
  2. rangeOverflow, car 12 dépasse le dernier pas inférieur à 14.
  3. Aucune contrainte ; 12 est entre le minimum et le maximum.
  4. rangeUnderflow, car le pas commence à zéro.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un formulaire utilise novalidate et vérifie les champs dans l’ordre du document à la soumission. Son champ de quantité est obligatoire avec min="2" max="14" step="4" ; il contient maintenant 10 et un ancien message personnalisé a été effacé avec setCustomValidity(""). Le champ suivant est une adresse e-mail obligatoire qui est vide. Quel champ doit bloquer cette tentative et recevoir le focus ?
  1. La quantité, car effacer un message personnalisé la laisse invalide.
  2. L’adresse e-mail, car elle manque ; la quantité respecte ses contraintes.
  3. Aucun des deux champs, car novalidate désactive l’API de validation.
  4. La quantité, car 10 ne respecte pas le pas de quatre depuis son minimum.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une confirmation de mot de passe était invalide. Les valeurs correspondent maintenant, mais un ancien message de validation personnalisé non vide reste présent. Que doit faire la fonction de vérification ?
  1. Réaffecter confirm.value à lui-même.
  2. Définir uniquement confirm.required = false.
  3. Appeler confirm.setCustomValidity("").
  4. Appeler form.requestSubmit() à plusieurs reprises.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une réservation exige une date de fin non vide strictement postérieure à sa date de début. Les deux champs de date sont obligatoires. La vérification actuelle ne refuse que end.value < start.value et ne s’exécute que lors des modifications de la fin. Quels deux changements corrigent les défauts restants entre les champs ?
  1. Refuser <= et vérifier à nouveau lorsque l’une ou l’autre date change.
  2. Refuser < et vérifier à nouveau seulement lorsque la fin perd le focus.
  3. Refuser >= et vérifier à nouveau lorsque l’une ou l’autre date change.
  4. Refuser === et vérifier à nouveau seulement lorsque le début perd le focus.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un message indiquant qu’une adresse e-mail est invalide apparaît pendant la correction du champ. Quel choix de moment permet de le retirer rapidement sans afficher d’erreurs dès la première frappe dans les champs encore intacts ?
  1. Vérifier à nouveau seulement à la perte de focus, même après l’affichage d’une erreur.
  2. Afficher chaque champ vide comme erroné dès le chargement initial de la page.
  3. Effacer tous les messages à chaque keydown avant de lire la validité.
  4. Revérifier les erreurs signalées sur input ; commencer les messages à la perte de focus ou à la soumission.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Crée un accès au clavier et préserve le focus10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un div possède role="button" et un écouteur de clic. Que fournit le rôle lui-même ?
  1. Un arrêt normal de tabulation et un contour de focus visible.
  2. Une sémantique de bouton pour la technologie d’assistance.
  3. L’activation avec Entrée et Espace sans code supplémentaire.
  4. Le comportement natif de désactivation grâce à aria-disabled.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un titre d’erreur de formulaire doit recevoir le focus après une soumission échouée, sans ajouter d’arrêt pendant la navigation normale par Tabulation. Quelle configuration convient ?
  1. Définir tabindex="1" et appeler .focus().
  2. Définir role="alert" et compter sur le focus par Tabulation.
  3. Définir tabindex="-1" et appeler .focus().
  4. Définir tabindex="0" et supprimer son contour.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un bouton personnalisé pouvant recevoir le focus dirige click et keydown vers activate(). Il possède aria-disabled="true". La fonction commence par if (button.getAttribute("aria-disabled") === true) return;, mais les deux voies continuent à agir. Quelle correction fait respecter l’état désactivé tout en permettant d’agir lorsque l’état est la chaîne « false » ?
  1. Comparer avec "true" dans la fonction d’activation partagée.
  2. Tester si l’attribut renvoyé est une valeur vraie dans activate.
  3. Comparer avec le booléen vrai uniquement dans l’écouteur de clic.
  4. Déplacer la vérification inchangée dans un écouteur pointerdown.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un bouton de divulgation personnalisé ouvre un panneau d’aide. Quel attribut ARIA indique si ce panneau est ouvert ?
  1. aria-checked
  2. aria-pressed
  3. aria-disabled
  4. aria-expanded
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un composant de divulgation possède actuellement aria-expanded="true" et un panneau visible. Son gestionnaire de clic lit l’ancien état développé. Quel doit être l’état suivant ?
  1. aria-expanded="true" ; panel.hidden = true.
  2. aria-expanded="false" ; panel.hidden = false.
  3. aria-expanded="true" ; panel.hidden = false.
  4. aria-expanded="false" ; panel.hidden = true.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une barre d’outils de quatre éléments utilise un tabindex itinérant. L’élément 0 a le focus. Après ArrowLeft, quels changements d’indice et de tabindex maintiennent la navigation ?
  1. Donner le focus à −1 ; laisser l’élément 0 à 0 et tous les autres à −1.
  2. Donner le focus à 3 ; définir l’élément 0 à −1 et l’élément 3 à 0.
  3. Donner le focus à 3 ; laisser les éléments 0 et 3 tous deux à 0.
  4. Donner le focus à 1 ; définir l’élément 0 à 0 et l’élément 1 à −1.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un bouton à bascule natif appelle la même fonction d’inversion depuis click et depuis keydown sur Entrée. Entrée laisse son état enfoncé inchangé, tandis qu’un clic au pointeur le fait basculer une fois. Quel changement corrige l’utilisation au clavier sans perdre l’accès ?
  1. Garder l’action de clic et supprimer l’activation supplémentaire par Entrée.
  2. Garder les deux écouteurs et ajouter une inversion sur keydown pour Espace.
  3. Remplacer click par pointerdown et ne garder aucun écouteur de touche.
  4. Garder les deux écouteurs et appeler preventDefault après chaque clic.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une boîte de dialogue modale se ferme alors que son élément déclencheur existe toujours. Où le focus doit-il normalement revenir ?
  1. Au corps de la page après chaque fermeture.
  2. Au premier lien du document.
  3. Au composant qui l’a ouverte.
  4. Au bouton de fermeture masqué de la boîte de dialogue.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un élément contextuel possède deux champs. Le focus passe du premier au second et un écouteur focusout qui remonte par bouillonnement masque l’élément contextuel. Que doit vérifier l’écouteur avant de le masquer ?
  1. Si relatedTarget est hors de l’élément contextuel.
  2. Si target est égal au premier champ.
  3. Si currentTarget est égal à l’élément contextuel.
  4. Si la touche utilisée pour se déplacer était Tabulation.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une liste possède deux éléments et un titre avec tabindex="-1". Le bouton de suppression du dernier élément, qui a le focus, supprime cet élément ; plus tard, l’élément restant est lui aussi supprimé. Quelle séquence de focus permet de continuer à utiliser le clavier ?
  1. D’abord le corps de la page, puis le bouton précédent supprimé.
  2. D’abord le bouton de l’élément précédent, puis le titre de la liste.
  3. D’abord le titre, puis le frère suivant de l’élément supprimé.
  4. D’abord le bouton supprimé, puis le premier lien du document.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

80 Mots-Clés, chacun avec sa définition

A

AbortController
Un AbortController fournit un signal qui peut regrouper les durées de vie des écouteurs et supprime les écouteurs associés lorsque sa méthode abort() est appelée.
La fermeture d’un outil de dessin annule le signal utilisé pour ses écouteurs sur le document et la fenêtre.
Action par défaut
Une action par défaut est un comportement fourni par le navigateur et associé à un événement, comme suivre un lien, saisir du texte ou envoyer un formulaire.
L’action par défaut du lien d’aide mènerait à sa destination, sauf si le clic est annulé.
Activation
L’activation est la demande de l’utilisateur d’exécuter l’action d’un composant, représentée par click pour l’utilisation au pointeur et l’utilisation native au clavier.
Un bouton suivant natif réagit par click, qu’il soit activé avec Espace ou avec une souris.
Alternative à pointeur unique
Une alternative à pointeur unique exécute une fonction de glissement par des clics ou des contacts tactiles sans exiger que le pointeur reste enfoncé pendant le mouvement.
Des boutons de déplacement permettent à un utilisateur tactile de repositionner un élément sans effectuer de geste de glissement.
aria-describedby
L’attribut aria-describedby associe un composant à un texte descriptif en énumérant les identifiants des éléments qui contiennent ce texte.
Le champ d’adresse e-mail référence email-error pour que la technologie d’assistance puisse lui associer l’erreur.
aria-invalid
L’attribut aria-invalid indique que la valeur saisie dans un composant comporte une erreur ; le code doit le mettre à jour lorsque l’erreur change.
Le champ d’adresse e-mail possède aria-invalid="true" tant que son message de correction est affiché à côté.
Arrière-plan inerte
Un arrière-plan inerte est un contenu de page temporairement inaccessible aux clics ordinaires et au focus pendant qu’une interaction modale est active.
La page derrière une boîte de dialogue modale native ouverte ne peut pas recevoir normalement le focus avant sa fermeture.
Attribut de données
Un attribut de données est un attribut HTML commençant par data- qui stocke des informations de l’application accessibles par le dataset d’un élément.
Une barre d’outils lit data-action="clear" sous la forme button.dataset.action pour sélectionner une action connue.

B

Boîte de dialogue modale
Une boîte de dialogue modale est une interaction qui rend le reste de la page inerte pendant son ouverture, limitant l’interaction de l’utilisateur à sa zone active.
Appeler showModal() ouvre la boîte de dialogue native et déplace le focus dans son contenu.
Bouillonnement
Le bouillonnement est la remontée d’un événement à travers les ancêtres après la phase cible ; il n’est possible que pour les événements dont la valeur bubbles est vraie.
L’événement input d’un champ enfant remonte par bouillonnement jusqu’à un écouteur enregistré sur le formulaire qui le contient.
Bouton à bascule
Un bouton à bascule active ou désactive une action, généralement avec un libellé visible stable et aria-pressed qui indique l’état actuel.
Un bouton de coupure du son garde le libellé « Couper le son » tandis que sa valeur aria-pressed passe de vrai à faux et inversement.
Bouton de soumission
Le bouton de soumission est le bouton utilisé pour envoyer un formulaire, accessible par event.submitter lorsqu’un bouton particulier a lancé cette soumission.
Un formulaire distingue l’enregistrement d’un brouillon de la publication en lisant la valeur du bouton de soumission.

C

cancelable
La propriété cancelable est un booléen qui indique si un événement permet d’annuler son action par défaut avec preventDefault().
Un événement input signale une modification déjà effectuée : sa propriété cancelable est donc fausse.
Capture du pointeur
La capture du pointeur dirige vers un élément les événements ultérieurs d’un pointeur actif donné, même après que le pointeur a dépassé les limites de cet élément.
Une boîte déplacée capture le pointeur initial afin de continuer à recevoir ses événements même si un mouvement rapide le fait sortir de la zone de la boîte.
checked
La propriété checked est l’état booléen qui indique si une case à cocher ou un bouton radio est sélectionné, indépendamment de sa valeur de soumission.
Un aperçu lit checkbox.checked pour décider s’il doit afficher une section facultative.
checkValidity
La méthode checkValidity() renvoie si les contraintes sont respectées et déclenche des événements invalid en cas d’échec, sans afficher de message du navigateur.
Un traitement de soumission personnalisé vérifie le formulaire avant de décider quelles erreurs afficher à côté des champs.
closest
La méthode closest() vérifie un élément puis ses ancêtres pour trouver le plus proche qui correspond au sélecteur, et renvoie null si aucun ne correspond.
En partant d’une icône, closest("button") trouve le bouton d’action qui l’entoure.
code
La propriété code indique la position physique d’une touche indépendamment du caractère produit par la disposition actuelle du clavier.
Un jeu utilise code lorsque ses commandes de déplacement doivent rester à des positions physiques fixes.
Composant de divulgation
Un composant de divulgation comprend un bouton et un panneau qui révèle ou masque du contenu, le bouton indiquant son état avec aria-expanded.
Un bouton de détails change son état développé en même temps que la visibilité du panneau d’aide qu’il contrôle.
Composant natif
Un composant natif est un élément HTML doté d’une sémantique et d’un comportement d’interaction intégrés, comme un bouton, un lien, une case à cocher ou une liste déroulante.
Un bouton natif mis en forme conserve son activation par Entrée et Espace sans écouteur de touche personnalisé.
contains
La méthode contains() vérifie si un nœud est l’élément lui-même ou l’un de ses descendants et renvoie un résultat booléen.
Un écouteur délégué sur une liste vérifie list.contains(button) avant d’autoriser l’action du bouton.
Contrainte de validation personnalisée
Une contrainte de validation personnalisée est une règle définie par l’application avec setCustomValidity(), dont un message non vide marque le composant comme invalide.
Une confirmation qui ne correspond pas reçoit un message personnalisé, effacé dès que les deux mots de passe correspondent.
Coordonnées dans la zone d’affichage
Les coordonnées dans la zone d’affichage sont les positions du pointeur mesurées depuis le coin supérieur gauche de la zone visible à l’aide de clientX et clientY.
Un calcul de mouvement soustrait deux relevés de coordonnées client sans ajouter le défilement de la page.
Coordonnées dans le document
Les coordonnées dans le document sont les positions du pointeur mesurées depuis le coin supérieur gauche du document à l’aide de pageX et pageY, défilement compris.
Un clic à 100 px sous le haut de la zone d’affichage après un défilement de 300 px donne pageY à 400.
currentTarget
La propriété currentTarget indique l’objet dont l’écouteur s’exécute et est réinitialisée à null après la fin du déclenchement de l’événement.
Dans un écouteur enregistré sur un bouton, currentTarget permet au code de lire les données de ce bouton.
CustomEvent
Un CustomEvent est un événement créé par script qui peut transporter des données de l’application dans detail et être configuré pour remonter par bouillonnement jusqu’aux ancêtres.
Un article du panier déclenche "cart:add" avec son identifiant dans detail de l’événement.

D

Déclenchement synchrone
Le déclenchement synchrone signifie que les écouteurs s’exécutent pendant l’appel à dispatchEvent(), avant que cette méthode rende la main au code appelant.
Un message affiché après dispatchEvent() apparaît après les messages de ses écouteurs.
defaultPrevented
La propriété defaultPrevented est un booléen qui indique si l’action par défaut d’un événement a été annulée avec succès.
Un écouteur sur un ancêtre peut examiner defaultPrevented avant de décider comment gérer un clic.
Délégation d’événements
La délégation d’événements gère les événements de plusieurs descendants par un écouteur sur un ancêtre commun, qui identifie le composant concerné.
L’unique écouteur de clic d’une liste continue à fonctionner pour les nouveaux boutons de suppression insérés ultérieurement.

É

Écouteur d’événements
Un écouteur d’événements est une fonction enregistrée sur une cible d’événement afin de pouvoir s’exécuter lorsqu’un type d’événement donné y est déclenché.
L’écouteur du compteur augmente le total stocké chaque fois que son bouton reçoit un clic.
Écouteur passif
Un écouteur passif est un écouteur enregistré avec l’engagement de ne pas annuler l’action par défaut, ce qui permet au navigateur de poursuivre sans attendre une éventuelle annulation.
Appeler preventDefault() dans un écouteur tactile passif n’arrête pas le défilement du navigateur.
Élément déclencheur
Un élément déclencheur est le composant qui ouvre une interaction avec un élément contextuel ou une boîte de dialogue et constitue généralement la destination adaptée du focus à sa fermeture.
La boîte de dialogue mémorise le bouton d’ouverture afin de pouvoir lui rendre le focus après l’événement de fermeture.
État ARIA
Un état ARIA est une valeur d’attribut qui communique la condition actuelle d’un composant, par exemple coché, développé, enfoncé ou désactivé.
La valeur aria-checked de l’interrupteur est mise à jour lorsque son apparence visible passe de l’état activé à l’état désactivé ou inversement.
État du glissement
L’état du glissement est l’ensemble des informations stockées qui indiquent qu’un glissement est actif et conservent les coordonnées initiales du pointeur et la position initiale de l’élément.
Pendant un glissement, chaque mouvement du pointeur compare les coordonnées actuelles au départ mémorisé pour positionner une boîte déplacée.
Événement
Un événement est un signal qui indique que quelque chose s’est produit, comme un clic, la modification d’un champ, un appui sur une touche ou la fin de l’analyse du HTML.
Un événement click permet à la page de réagir lorsqu’une personne active le bouton suivant de la galerie.
Événement change
Un événement change signale une modification validée par l’utilisateur, comme quitter un champ de texte modifié ou choisir un nouvel état pour une case à cocher ou une liste déroulante.
Un champ de texte modifié déclenche change lorsque l’utilisateur le quitte pour passer au composant suivant.
Événement de pointeur
Un événement de pointeur décrit une interaction avec un dispositif de pointage au moyen d’une famille d’événements commune à la souris, au tactile et au stylet.
Un même écouteur pointermove peut lire le mouvement d’une souris ou d’un contact tactile.
Événement input
Un événement input signale une modification effectuée par l’utilisateur après le changement de valeur d’un composant, y compris une modification de texte sans appui physique sur une touche.
Coller une phrase dans un champ de message met à jour un compteur grâce à l’écouteur input du champ.
Événement submit
Un événement submit est un événement de formulaire annulable, déclenché pendant le parcours normal de soumission après que la validation automatique a autorisé l’envoi.
L’écouteur submit d’un formulaire gère une soumission valide en ajoutant un élément localement et en annulant la navigation.

F

Focus
Le focus est l’état de la page qui indique l’élément recevant actuellement les entrées au clavier ; cet élément est accessible par document.activeElement.
Appeler search.focus() dirige le prochain caractère saisi vers le champ de recherche.
FormData
FormData est une collection de paires nom-valeur admissibles d’un formulaire qui peut conserver les noms répétés et exclut les composants qui ne sont pas soumis.
Lorsque plusieurs cases à cocher partagent le nom « topics », data.getAll("topics") récupère ensemble toutes celles qui sont sélectionnées.

G

Gestion du focus
La gestion du focus consiste à choisir volontairement une destination utile pour le clavier lorsqu’un contenu s’ouvre, se ferme, disparaît ou présente des erreurs à l’utilisateur.
La suppression d’une ligne ayant le focus déplace celui-ci vers le composant d’une ligne voisine au lieu de perdre la position.
Groupe de composants composite
Un groupe de composants composite est un ensemble de composants liés, comme des onglets ou une barre d’outils, dans lequel les touches fléchées permettent de naviguer et Tabulation permet d’entrer et de sortir.
Le groupe d’onglets conserve un seul arrêt de tabulation pour permettre aux utilisateurs de passer le groupe sans visiter chaque onglet.

I

Identité d’un écouteur
L’identité d’un écouteur combine le type d’événement, l’objet fonction de rappel et le réglage de capture ; elle détermine les doublons à l’enregistrement et la suppression.
Une nouvelle fonction fléchée ne peut pas supprimer une fonction de rappel précédente simplement parce que leurs corps sont identiques.
Indicateur de focus
Un indicateur de focus est une marque visible qui désigne l’élément ayant actuellement le focus afin que les utilisateurs du clavier puissent repérer leur position dans la page.
Un contour :focus-visible montre quel bouton de la barre d’outils recevra la prochaine action au clavier.
Indicateur de touche de modification
Un indicateur de touche de modification est une propriété booléenne d’un événement clavier qui indique si Maj, Contrôle, Alt ou Meta est maintenue enfoncée pendant l’événement.
Le raccourci d’enregistrement accepte ctrlKey ou metaKey avec la lettre S.

K

key
La propriété key indique la valeur produite par une touche, compte tenu de la disposition du clavier et des touches de modification comme Maj.
Maj peut changer la valeur key d’une lettre de "a" à "A" tandis que sa position reste identique.
keydown
Un événement keydown signale l’appui sur une touche avant son effet normal de modification et peut se répéter tant que la touche physique reste enfoncée.
Le raccourci vérifie si Échap a été pressée dans keydown avant de fermer le panneau ouvert.

M

Masque de bits des boutons
Un masque de bits des boutons représente les boutons de pointeur actuellement enfoncés en combinant des indicateurs numériques dans la propriété buttons de l’événement.
Maintenir les boutons principal et secondaire donne buttons à 3, en combinant les indicateurs 1 et 2.

N

Nom accessible
Un nom accessible est le texte que la technologie d’assistance utilise pour identifier un composant, fourni par un contenu adapté, un libellé ou un nom ARIA.
Un bouton de fermeture composé uniquement d’une icône utilise aria-label="Close" pour indiquer l’action de son symbole.
novalidate
L’attribut de formulaire novalidate ignore la validation automatique des contraintes à la soumission tout en laissant disponibles les contraintes et les méthodes de validation.
Un traitement d’erreurs personnalisé utilise novalidate pour que son écouteur de soumission puisse examiner lui-même chaque champ.

O

Objet événement
Un objet événement est la valeur passée à un écouteur, qui contient des propriétés communes aux événements et des détails propres à la famille de cet événement.
Un écouteur clavier lit la propriété key de l’événement reçu pour décider s’il doit fermer un panneau.
once
L’option d’écouteur once demande la suppression automatique de cet enregistrement après son premier appel pour le type d’événement choisi.
Une bannière de bienvenue peut utiliser once: true pour le clic qui la ferme pendant cette période d’utilisation.

P

pattern
L’attribut pattern définit une contrainte par expression régulière portant sur la valeur entière des champs de texte compatibles, appliquée uniquement lorsque leur valeur n’est pas vide.
Un motif à cinq chiffres refuse six chiffres, mais nécessite required pour refuser un champ vide.
Phase cible
La phase cible est la partie du déclenchement qui se déroule à l’origine de l’événement, où les écouteurs en phase de capture s’exécutent avant les autres.
Les deux écouteurs du bouton cliqué indiquent eventPhase à 2 pendant leur appel.
Phase de capture
La phase de capture est le trajet descendant de l’événement à travers les ancêtres vers sa cible, observé par les écouteurs enregistrés pour la capture.
L’écouteur en phase de capture d’un conteneur s’exécute avant que l’écouteur d’un bouton descendant ne gère le clic.
pointercancel
Un événement pointercancel indique que le navigateur a annulé l’interaction du pointeur, ce qui oblige à effacer l’état actif d’un glissement.
Un geste repris par le navigateur pour faire défiler la page peut terminer le glissement personnalisé par pointercancel.
pointerId
La propriété pointerId identifie un pointeur individuel pendant une interaction afin que les contacts simultanés puissent être gérés séparément.
Deux doigts ont des identifiants différents, ce qui permet au code de glissement de ne suivre que celui qui l’a commencé.
preventDefault
La méthode preventDefault() annule l’action par défaut d’un événement qui peut l’être dans un écouteur non passif, sans arrêter sa propagation.
Un écouteur de soumission appelle preventDefault() avant d’ajouter un élément local sans navigation.
Propagation
La propagation est le parcours d’un événement dans l’arbre du document, comprenant le trajet de capture, la phase cible et, le cas échéant, le trajet de bouillonnement.
Un clic sur un bouton peut être observé par des écouteurs placés sur le bouton et sur la fiche qui l’entoure.
Propriété de gestionnaire d’événements
Une propriété de gestionnaire d’événements est une propriété d’élément comme onclick, qui contient une seule fonction de rappel d’événement et la remplace lors d’une nouvelle affectation.
Affecter une autre fonction à button.onclick remplace le gestionnaire précédent de cette propriété.

R

Récapitulatif des erreurs
Un récapitulatif des erreurs est une région de la page qui rassemble les problèmes d’un formulaire et des liens vers leurs champs, et fournit une destination utile pour le focus après un échec.
Après une soumission invalide, le récapitulatif pouvant recevoir le focus permet à l’utilisateur de choisir le champ à corriger.
Référence de fonction
Une référence de fonction est une valeur qui désigne un objet fonction et permet au code de passer cette fonction pour une utilisation ultérieure sans l’appeler.
Passer openPanel enregistre la fonction ; passer openPanel() l’appelle pendant la mise en place.
Réinitialisation de formulaire
Une réinitialisation de formulaire rétablit les valeurs et les états de sélection initiaux des composants, qui peuvent comprendre des valeurs par défaut non vides issues du balisage.
Après l’ajout d’un élément par un formulaire, form.reset() rétablit les valeurs initiales de ses champs.
relatedTarget
La propriété relatedTarget indique l’autre élément concerné par un changement de focus, ou vaut null lorsqu’aucun élément de ce type n’est disponible.
L’écouteur focusout d’un menu vérifie si la destination reste dans le menu.
reportValidity
La méthode reportValidity() vérifie les contraintes et demande aussi au navigateur d’afficher un message de validation pour les échecs non gérés.
Un bouton de vérification explicite appelle reportValidity() pour aider l’utilisateur à trouver un champ invalide.
requestSubmit
La méthode requestSubmit() demande la soumission d’un formulaire selon le parcours normal de validation et de l’événement submit, sans déclencher de clic sur un bouton.
Une barre d’outils appelle form.requestSubmit() pour que la validation et l’écouteur de soumission du formulaire s’exécutent.
Rôle ARIA
Un rôle ARIA communique la fonction d’un élément à la technologie d’assistance sans ajouter le comportement au clavier ni les règles de focus associés à cette fonction.
Un div avec role="button" a toujours besoin de code pour l’activation et d’un arrêt de tabulation adapté.

S

stopImmediatePropagation
La méthode stopImmediatePropagation() arrête la propagation de l’événement et ignore aussi les écouteurs restants enregistrés sur la cible courante de l’événement.
Lorsque la première fonction de rappel invoque cette méthode, une fonction de rappel ultérieure sur le même élément est ignorée.
stopPropagation
La méthode stopPropagation() empêche un événement de se propager vers d’autres éléments tout en laissant actifs les autres écouteurs sur son élément courant.
Une action imbriquée peut empêcher son clic d’atteindre l’écouteur en phase de bouillonnement de la fiche qui la contient.
Suppression des espaces en début et en fin de chaîne
La suppression des espaces en début et en fin de chaîne retire les caractères d’espacement situés aux extrémités du texte avant qu’une règle ou une action utilise son contenu utile.
La vérification name.value.trim() === "" détecte un nom composé uniquement d’espaces.

T

tabindex
L’attribut tabindex contrôle la participation à la tabulation ordinaire et la capacité à recevoir le focus depuis le code : 0 place l’élément dans l’ordre normal et −1 hors de cette séquence.
Le titre d’erreur utilise tabindex="-1" pour que le code puisse lui donner le focus sans ajouter d’arrêt normal de tabulation.
Tabindex itinérant
Le tabindex itinérant est une technique de navigation dans un groupe qui donne à un élément un arrêt normal de tabulation et déplace cet arrêt ainsi que le focus lorsque les touches fléchées changent d’élément.
Dans une barre d’outils, Tabulation atteint l’élément courant et les touches fléchées mènent aux composants voisins.
target
La propriété target indique l’origine de l’événement, qui peut être un élément imbriqué dans le composant dont l’action est gérée.
Un clic sur l’image d’un bouton d’enregistrement fait de cette image la target du clic.
Test de clic à l’extérieur
Un test de clic à l’extérieur vérifie si un événement a commencé hors d’un élément contextuel ouvert et de son élément déclencheur avant de fermer cet élément contextuel.
Un écouteur sur le document qui ignore les clics sur le bouton d’un menu empêche le clic d’ouverture de fermer ce menu.
touch-action
La propriété CSS touch-action déclare quels gestes tactiles du navigateur sont autorisés lorsqu’un geste commence sur un élément.
Utiliser touch-action: none sur la surface de glissement réserve le mouvement dans cette zone au glissement.

V

Validation des contraintes
La validation des contraintes vérifie si les valeurs d’un formulaire respectent les règles HTML, comme les champs obligatoires, la syntaxe du type, les bornes, les pas et les motifs.
Une quantité hors des bornes bloque la soumission normale avant l’exécution de l’écouteur de soumission du formulaire.
ValidityState
Un ValidityState est l’objet exposé par la propriété validity d’un composant, avec des indicateurs booléens qui identifient les contraintes non respectées.
Une quantité peut indiquer stepMismatch même si elle se trouve entre son minimum et son maximum.
value
La propriété value expose la valeur actuelle d’un composant de formulaire sous forme de texte, y compris celle des champs numériques dont le contenu doit encore être converti.
Un champ de quantité contenant "8" nécessite une conversion avant que le code puisse lui ajouter une valeur numérique.
valueAsNumber
La propriété valueAsNumber lit directement la valeur numérique d’un champ compatible et renvoie NaN lorsqu’aucune valeur numérique exploitable n’est présente.
Un champ numérique vide produit NaN, que le code détecte avec Number.isNaN().

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer