Critères de succès WCAG · Level A

WCAG 2.5.2 : Annulation du pointeur

La norme WCAG 2.5.2 exige que toute fonctionnalité déclenchée par un seul dispositif de pointage (souris, toucher ou stylet) puisse être annulée ou inversée, afin d’éviter les activations accidentelles. Cela protège les personnes ayant des troubles moteurs qui peuvent toucher ou cliquer involontairement.

Ce que signifie cette règle

WCAG 2.5.2 Annulation de pointeur s’applique à toutes les fonctionnalités qui sont actionnées à l’aide d’un seul pointeur — cela inclut les clics de souris, les pressions sur écran tactile, les pressions de stylet et tout autre dispositif d’entrée qui active un point sur l’écran. Ce critère existe pour garantir que les activations accidentelles causées par une pression ou un appui involontaire peuvent être annulées avant de produire leurs effets.

Pour qu’une interaction à pointeur unique soit conforme à ce critère, elle doit satisfaire au moins une des quatre conditions suivantes définies par la spécification WCAG :

  • Aucun événement « down » : La fonctionnalité n’est pas déclenchée sur l’événement « down » (par exemple, mousedown, touchstart ou pointerdown). L’activation se produit uniquement sur l’événement « up » (mouseup, touchend ou pointerup).
  • Abandon ou annulation : Un mécanisme est disponible pour abandonner l’action avant son achèvement, ou pour annuler l’action après qu’elle a été réalisée.
  • Inversion à l’événement « up » : L’événement « up » annule tout résultat qui a été déclenché sur l’événement « down » — par exemple, un glisser-déposer qui revient à sa position initiale si le pointeur est relâché en dehors de la cible.
  • Exception essentielle : Le déclenchement sur l’événement « down » est essentiel à la fonctionnalité — par exemple, un clavier de piano à l’écran où le son doit commencer au moment où la touche est pressée. Cependant, cette exception est très limitée et ne s’applique que lorsque le moment de l’événement « down » est fondamentalement nécessaire.

En termes pratiques de HTML et JavaScript, cela signifie que les développeurs doivent faire attention à l’endroit où ils attachent les écouteurs d’événements. Utiliser mousedown, touchstart ou pointerdown pour exécuter immédiatement et irréversiblement une action — comme soumettre un formulaire, supprimer un enregistrement ou quitter une page — sans fournir de moyen d’annuler ou de revenir sur cette action constitue clairement un échec à ce critère. Le comportement standard du navigateur pour les éléments natifs <button> et <a> déclenche déjà l’activation sur l’événement « up » par défaut, ce qui signifie que les contrôles natifs correctement implémentés satisfont généralement ce critère sans effort supplémentaire.

Les composants interactifs personnalisés construits avec JavaScript — tels que les interfaces de glisser-déposer, les curseurs basés sur des gestes, les contrôles de carrousel et les images réactives — sont les sources d’échec les plus courantes. Tout composant qui lie une logique irréversible à un écouteur d’événement « down » sans fournir de mécanisme d’annulation ou d’inversion ne respecte pas ce critère.

Pourquoi c’est important

L’annulation de pointeur est principalement un critère conçu pour protéger les personnes ayant des déficiences motrices, mais ses bénéfices s’étendent à un large éventail d’utilisateurs, y compris ceux qui ont des tremblements, de la spasticité, une motricité fine limitée ou des handicaps cognitifs affectant l’attention et la précision.

Considérons une personne atteinte de la maladie de Parkinson qui navigue sur une page de paiement d’un site de commerce électronique sur un écran tactile. Son tremblement de la main peut faire atterrir son doigt sur un bouton « Confirmer l’achat » qu’elle n’avait pas l’intention d’appuyer. Si l’achat est déclenché au moment où le doigt touche l’écran — sur l’événement touchstart — la transaction est immédiatement traitée sans possibilité d’annulation. Si l’activation avait été liée à l’événement touchend, la personne aurait pu faire glisser son doigt hors du bouton avant de le lever, annulant ainsi l’action. Cette simple différence entre la liaison à l’événement « up » et à l’événement « down » peut faire la différence entre une expérience frustrante et une expérience accessible pour des millions d’utilisateurs.

Selon l’Organisation mondiale de la Santé, environ 1,3 milliard de personnes dans le monde vivent avec une forme de handicap, et les déficiences motrices représentent une part significative de cette population. Au-delà du handicap, les activations accidentelles sont une source de frustration courante pour tout utilisateur sur un petit appareil à écran tactile, ce qui rend ce critère pertinent également pour l’ergonomie générale.

Le handicap cognitif est un autre aspect important. Les personnes qui traitent l’information plus lentement peuvent appuyer sur un bouton puis se rendre compte qu’elles ont sélectionné la mauvaise option. Si l’action est irréversible — déclenchée sur l’événement « down » — elles n’ont aucun recours. Un mécanisme d’annulation ou une activation sur l’événement « up » donne à ces personnes le temps dont elles ont besoin pour confirmer leur intention.

Du point de vue de l’entreprise, réduire les soumissions de formulaires, achats et suppressions accidentels améliore la satisfaction des utilisateurs, réduit les demandes d’assistance et diminue les taux d’abandon de transaction. Un modèle d’interaction au pointeur accessible réduit également le risque de responsabilité juridique au titre des réglementations en matière d’accessibilité en Turquie et à l’international.

Règles Axe-core associées

WCAG 2.5.2 nécessite des tests manuels et ne peut pas être évalué de manière fiable par des analyseurs automatiques d’accessibilité seuls. Aucune règle automatisée axe-core spécifique ne correspond directement à ce critère. Voici pourquoi la détection automatisée est insuffisante :

  • Pourquoi l’automatisation échoue pour l’annulation de pointeur : Les outils automatisés comme axe-core peuvent analyser le HTML et détecter certains problèmes ARIA ou structurels, mais ils ne peuvent pas déterminer de manière fiable l’intention sémantique et la réversibilité des gestionnaires d’événements JavaScript. Un outil peut détecter qu’un écouteur d’événement mousedown existe sur un élément, mais il ne peut pas déterminer si cet écouteur déclenche une action irréversible, si un mécanisme d’annulation est présent ailleurs dans l’application, ou si le moment de l’événement « down » est réellement essentiel à la fonctionnalité. La combinaison du comportement à l’exécution, de l’état de l’application et du contexte utilisateur nécessaire pour évaluer ce critère dépasse le cadre d’une analyse automatisée statique ou basée sur le DOM.
  • Ce que les testeurs manuels doivent vérifier : Les testeurs doivent interagir avec chaque contrôle interactif à l’aide d’un dispositif de pointage et observer précisément quand l’action se déclenche — à l’appui ou au relâchement. Ils doivent également vérifier si le fait de faire glisser le pointeur hors de l’élément avant de le relâcher annule l’action, et si un mécanisme d’annulation ou d’abandon est accessible après l’activation.
  • Signaux partiels issus de l’automatisation : Certains outils de linting ou règles axe personnalisées peuvent signaler les éléments avec des attributs onmousedown, ontouchstart ou onpointerdown comme nécessitant un examen, mais ces signaux nécessitent un jugement humain pour déterminer la conformité ou la non-conformité. Considérez tout signal automatisé de ce type comme une invitation à une investigation manuelle, et non comme un rapport d’échec définitif.

Comment tester

  1. Analyse automatisée (premier repérage) : Exécutez axe DevTools ou Lighthouse sur la page pour identifier les éléments interactifs et tout lien d’événement personnalisé signalé pour examen manuel. Dans Chrome DevTools, utilisez le panneau Elements pour inspecter les écouteurs d’événements attachés aux boutons, liens et contrôles personnalisés — recherchez des gestionnaires mousedown, touchstart ou pointerdown sur des éléments qui déclenchent des actions irréversibles.
  2. Test au pointeur de souris — annulation par cliquer-glisser : Pour chaque bouton, lien et contrôle personnalisé interactif sur la page, appuyez et maintenez le bouton de la souris enfoncé sur l’élément, puis faites glisser le pointeur en dehors des limites de l’élément avant de le relâcher. Si l’action se déclenche pendant que le bouton est maintenu enfoncé (avant le relâchement), c’est un échec. Si le fait de glisser à l’extérieur empêche l’action de se déclencher au relâchement, c’est une réussite pour les conditions d’inversion à l’événement « up » ou d’absence d’événement « down ».
  3. Test sur appareil tactile : Sur un appareil à écran tactile ou un émulateur de navigateur (mode appareil de Chrome DevTools), touchez et maintenez chaque élément interactif, puis faites glisser votre doigt à l’extérieur avant de le lever. Si l’action se déclenche immédiatement au toucher (avant que vous ne leviez le doigt), c’est un échec, sauf si le moment de l’événement « down » est essentiel. Vérifiez que le fait de lever le doigt en dehors de l’élément ne déclenche pas l’action.
  4. Vérification des contrôles au clavier : Bien que ce critère concerne spécifiquement les interactions au pointeur, vérifiez que tous les éléments interactifs sont également utilisables au clavier. Appuyez sur Tab pour focaliser chaque élément et sur Enter ou Space pour l’activer, en confirmant que l’élément est atteignable et fonctionnel sans pointeur — cela soutient le tableau plus large de l’accessibilité.
  5. Vérification des mécanismes d’annulation/abandon : Pour les actions liées aux événements « down » (là où l’exception essentielle peut s’appliquer), confirmez qu’un mécanisme clair d’annulation ou d’abandon existe et est accessible à tous les utilisateurs, y compris ceux qui utilisent des technologies d’assistance. Par exemple, après une action de glisser-déposer, y a-t-il un bouton « annuler » accessible au clavier et au lecteur d’écran ?
  6. Test combiné lecteur d’écran et pointeur (NVDA + Firefox, JAWS + Chrome, VoiceOver + Safari) : Activez les éléments interactifs à la fois avec le pointeur et avec le curseur virtuel du lecteur d’écran. Confirmez que les actions déclenchées par le pointeur sont cohérentes avec celles déclenchées par le lecteur d’écran et qu’aucune action irréversible immédiate ne se produit de manière inattendue.
  7. Revue de code : Recherchez dans la base de code les liaisons d’écouteurs d’événements : addEventListener('mousedown', addEventListener('touchstart', addEventListener('pointerdown', et les attributs inline onmousedown, ontouchstart. Pour chaque occurrence, évaluez si le gestionnaire déclenche une action irréversible et si l’une des quatre conditions WCAG est satisfaite.

Comment corriger

Action irréversible sur mousedown — Incorrect

<!-- FAIL: Delete fires immediately on mousedown, no cancellation possible -->
<button onmousedown='deleteRecord(recordId)'>Delete Record</button>

<script>
function deleteRecord(id) {
  // Record is deleted immediately on button press, before the user releases
  fetch('/api/records/' + id, { method: 'DELETE' });
}
</script>

Action irréversible sur mousedown — Correct

<!-- PASS: Delete fires on click (up-event), native button behavior -->
<button onclick='deleteRecord(recordId)'>Delete Record</button>

<!-- Even better: provide confirmation dialog as an additional abort mechanism -->
<button onclick='confirmDelete(recordId)'>Delete Record</button>

<script>
function confirmDelete(id) {
  // User can cancel via the dialog — satisfies the Abort or Undo condition
  if (confirm('Are you sure you want to delete this record? This cannot be undone.')) {
    fetch('/api/records/' + id, { method: 'DELETE' });
  }
}
</script>

Geste tactile déclenché sur touchstart — Incorrect

<!-- FAIL: Action fires immediately on touchstart, no opportunity to abort -->
<div id='buy-btn'>Buy Now</div>

<script>
document.getElementById('buy-btn').addEventListener('touchstart', function() {
  // Purchase initiated immediately when finger touches the element
  initiatePurchase();
});
</script>

Geste tactile déclenché sur touchstart — Correct

<!-- PASS: Use a native button and bind to click, which fires on touchend -->
<button id='buy-btn'>Buy Now</button>

<script>
// The 'click' event on a native button fires on the up-event (touchend/mouseup)
// giving users the ability to cancel by sliding their finger away before releasing
document.getElementById('buy-btn').addEventListener('click', function() {
  initiatePurchase();
});
</script>

Glisser-déposer personnalisé sans inversion à l’événement « up » — Incorrect

<!-- FAIL: Item is moved to new position on pointerdown, not on pointerup -->
<div class='draggable' onpointerdown='moveItemToTarget(this)'>
  Drag me
</div>

Glisser-déposer personnalisé avec inversion à l’événement « up » — Correct

<!-- PASS: Item moves to target only when pointer is released over the drop zone -->
<!-- If user drags away before releasing, item returns to original position -->
<div
  class='draggable'
  draggable='true'
  ondragstart='handleDragStart(event)'
>
  Drag me
</div>
<div
  class='drop-zone'
  ondragover='event.preventDefault()'
  ondrop='handleDrop(event)'
  aria-label='Drop zone'
>
  Drop here
</div>

<script>
function handleDragStart(event) {
  // Only records intent; does not move the item yet
  event.dataTransfer.setData('text/plain', event.target.id);
}
function handleDrop(event) {
  event.preventDefault();
  // Item is moved only on drop (up-event equivalent)
  // If user releases outside drop zone, item returns to origin — up-reversal satisfied
  const id = event.dataTransfer.getData('text/plain');
  event.currentTarget.appendChild(document.getElementById(id));
}
</script>

Erreurs courantes

  • Lier des actions irréversibles telles que la soumission de formulaire, la suppression d’enregistrement ou la navigation à des événements mousedown ou pointerdown au lieu de click, qui se déclenche sur l’événement « up » et permet par défaut l’annulation en faisant glisser le pointeur à l’extérieur.
  • Utiliser touchstart pour déclencher des achats, confirmations ou modifications de données sur des interfaces de commerce électronique ou bancaires, où un simple contact momentané du doigt ne devrait pas être considéré comme une intention confirmée de l’utilisateur.
  • Supposer que, parce qu’un bouton utilise un élément natif <button>, tout JavaScript qui y est attaché est automatiquement conforme — un écouteur mousedown ajouté via addEventListener enfreint toujours ce critère s’il déclenche une action irréversible.
  • Invoquer des boîtes de dialogue modales, des superpositions ou des changements de navigation en pleine page sur l’événement « down » d’un pointeur, ce qui désoriente les personnes qui n’avaient pas l’intention d’activer le contrôle et n’ont aucun moyen de revenir en arrière.
  • Implémenter des curseurs ou contrôles de plage personnalisés qui valident une valeur sur le serveur sur pointerdown plutôt que d’attendre pointerup ou une action de confirmation distincte.
  • Se reposer sur la boîte de dialogue confirm() par défaut du navigateur comme seul mécanisme d’annulation pour une action liée à un événement « down » sans tester si les technologies d’assistance peuvent accéder et utiliser de manière fiable la boîte de dialogue avant que l’action destructive ne soit terminée.
  • Ne pas fournir de retour visuel ou programmatique indiquant qu’une action liée à un événement « down » est en attente, ce qui rend impossible pour les utilisateurs de comprendre qu’ils pourraient l’annuler en déplaçant le pointeur avant de le relâcher.
  • Traiter l’exception essentielle de manière trop large — par exemple, prétendre qu’un bouton « achat rapide » doit se déclencher sur mousedown pour des raisons de rapidité, alors qu’aucune contrainte de temps réelle n’existe et que cette affirmation relève de la commodité produit plutôt que d’une nécessité fonctionnelle.
  • Ne pas tester à la fois sur des dispositifs de pointage à la souris et tactiles — une interface peut utiliser correctement les événements « up » pour les interactions à la souris mais lier tout de même des actions irréversibles à touchstart dans un chemin de code spécifique au mobile.
  • Implémenter une fonctionnalité d’annulation accessible uniquement via un raccourci clavier (par exemple, Ctrl+Z) sans fournir un contrôle équivalent à l’écran, laissant les personnes qui n’utilisent que le pointeur sans mécanisme d’annulation après une activation sur événement « down ».

Lien avec la réglementation d’accessibilité de la Turquie

La circulaire présidentielle 2025/10 de la Turquie, publiée au Journal officiel n° 32933 le 21 juin 2025, établit des exigences obligatoires en matière d’accessibilité du web alignées sur les normes WCAG 2.2. En vertu de cette circulaire, la conformité aux critères de niveau A — y compris WCAG 2.5.2 Annulation de pointeur — est légalement requise pour un large éventail d’entités publiques et privées exploitant des services numériques en Turquie.

La circulaire couvre un large spectre d’organisations. Les institutions publiques et les organismes gouvernementaux doivent atteindre une conformité complète au niveau A dans l’année suivant la date de publication de la circulaire. Les entités du secteur privé couvertes par la réglementation — y compris les plateformes de commerce électronique, les banques et institutions financières, les hôpitaux et prestataires de soins de santé, les entreprises de télécommunications comptant 200,000 abonnés ou plus, les agences de voyage, les entreprises de transport privé et les écoles privées autorisées par le ministère de l’Éducation nationale (MoNE) — disposent d’un délai de deux ans pour se mettre en conformité.

Pour ces entités concernées, le fait de ne pas implémenter correctement l’annulation de pointeur comporte un risque réglementaire réel. Considérez une plateforme de commerce électronique turque dont la page de paiement mobile déclenche la confirmation de paiement sur touchstart — une telle implémentation constituerait une violation directe de WCAG 2.5.2 et, par extension, de la circulaire présidentielle. Les personnes qui initient accidentellement un achat sur cette plateforme en raison d’un tremblement, d’une déficience motrice ou d’une simple erreur de toucher auraient des bases légales pour affirmer que la plateforme n’a pas respecté ses obligations en matière d’accessibilité.

Au-delà de la conformité réglementaire, les organisations turques devraient reconnaître que l’annulation de pointeur n’est pas simplement une case technique à cocher, mais un principe de conception fondamental qui protège la capacité des utilisateurs à interagir de manière sûre et intentionnelle avec les services numériques. Mettre en œuvre l’activation sur événement « up » et des mécanismes d’annulation sur l’ensemble des composants interactifs — des paniers d’achat et systèmes de prise de rendez-vous aux outils de gestion de documents — démontre un engagement en faveur d’une conception inclusive qui bénéficie à tous les utilisateurs, et pas seulement aux personnes handicapées.

Les organisations soumises à la circulaire devraient mener des audits systématiques de leurs modèles de gestion d’événements JavaScript, en particulier sur les pages optimisées pour mobile et les composants interactifs personnalisés, afin d’identifier et de corriger toute activation sur événement « down » dépourvue de mécanisme d’annulation ou d’inversion. La documentation de ces efforts de remédiation soutiendra également les obligations de rapport de conformité susceptibles d’être requises dans le cadre des dispositions d’application de la circulaire.