Criteri di successo WCAG · Level A

WCAG 2.5.2: Annullamento del puntatore

WCAG 2.5.2 richiede che le funzionalità attivate da un singolo puntatore (mouse, touch o stilo) possano essere annullate o invertite, prevenendo attivazioni accidentali. Questo protegge le persone con disabilità motorie che potrebbero toccare o fare clic involontariamente.

Cosa Significa Questa Regola

WCAG 2.5.2 Annullamento del puntatore si applica a tutta la funzionalità che viene azionata usando un singolo puntatore — questo include clic del mouse, tocchi su touchscreen, pressioni con stilo e qualsiasi altro dispositivo di input che attivi un punto sullo schermo. Il criterio esiste per garantire che le attivazioni accidentali causate da una pressione o un tocco involontari possano essere annullate prima che abbiano effetto.

Perché un’interazione a singolo puntatore sia conforme a questo criterio, deve soddisfare almeno una delle seguenti quattro condizioni definite dalla specifica WCAG:

  • Nessun evento di pressione (down-event): La funzionalità non viene attivata sull’evento di pressione (ad es. mousedown, touchstart o pointerdown). L’attivazione avviene solo sull’evento di rilascio (up-event) (mouseup, touchend o pointerup).
  • Interruzione o annullamento: È disponibile un meccanismo per interrompere l’azione prima del completamento o per annullare l’azione dopo che è stata completata.
  • Reversal all’evento di rilascio: L’evento di rilascio (up-event) annulla qualsiasi risultato che sia stato attivato sull’evento di pressione (down-event) — per esempio, un trascinamento che torna alla posizione iniziale se il puntatore viene rilasciato al di fuori del bersaglio.
  • Eccezione essenziale: L’attivazione sull’evento di pressione è essenziale per la funzionalità — per esempio, una tastiera di pianoforte su schermo in cui il suono deve iniziare nel momento in cui il tasto viene premuto. Tuttavia, questa eccezione è molto ristretta e si applica solo quando la tempistica dell’evento di pressione è fondamentalmente necessaria.

In termini pratici di HTML e JavaScript, questo significa che gli sviluppatori devono prestare attenzione a dove agganciano i listener degli eventi. Usare mousedown, touchstart o pointerdown per eseguire immediatamente e in modo irreversibile un’azione — come inviare un form, eliminare un record o navigare via da una pagina — senza fornire alcun modo per annullare o invertire quell’azione è una chiara violazione di questo criterio. Il comportamento standard del browser per gli elementi nativi <button> e <a> attiva già l’azione sull’evento di rilascio per impostazione predefinita, il che significa che i controlli nativi implementati correttamente in genere soddisfano questo criterio senza sforzi aggiuntivi.

I componenti interattivi personalizzati costruiti con JavaScript — come interfacce drag-and-drop, slider basati su gesture, controlli di caroselli e image map — sono le fonti di errore più comuni. Qualsiasi componente che collega una logica irreversibile a un listener di evento di pressione senza fornire annullamento o inversione non soddisfa questo criterio.

Perché È Importante

L’Annullamento del puntatore è principalmente un criterio progettato per proteggere le persone con disabilità motorie, ma i suoi benefici si estendono a un’ampia gamma di utenti, inclusi coloro che hanno tremori, spasticità, limitato controllo motorio fine o disabilità cognitive che influiscono su attenzione e precisione.

Si consideri una persona con il morbo di Parkinson che sta navigando una pagina di checkout di e-commerce su un touchscreen. Il tremore della mano può far sì che il dito atterri su un pulsante “Conferma acquisto” che non intendeva toccare. Se l’acquisto viene attivato nel momento in cui il dito tocca lo schermo — sull’evento touchstart — la transazione viene elaborata immediatamente senza possibilità di annullamento. Se invece l’attivazione fosse collegata all’evento touchend, la persona potrebbe far scorrere il dito lontano dal pulsante prima di sollevarlo, annullando l’azione. Questa semplice differenza tra binding sull’evento di rilascio e sull’evento di pressione può significare la differenza tra un’esperienza frustrante e un’esperienza accessibile per milioni di persone.

Secondo l’Organizzazione Mondiale della Sanità, circa 1,3 miliardi di persone nel mondo vivono con qualche forma di disabilità, e le disabilità motorie rappresentano una parte significativa di quella popolazione. Oltre alla disabilità, le attivazioni accidentali sono una frustrazione comune per chiunque utilizzi un dispositivo touchscreen di piccole dimensioni, rendendo questo criterio rilevante anche per l’usabilità generale.

La disabilità cognitiva è un’altra considerazione importante. Le persone che elaborano le informazioni più lentamente possono premere un pulsante e poi rendersi conto di aver selezionato l’opzione sbagliata. Se l’azione è irreversibile — attivata sull’evento di pressione — non hanno alcuna possibilità di rimediare. Un meccanismo di annullamento o l’attivazione sull’evento di rilascio offre a queste persone il tempo necessario per confermare la propria intenzione.

Dal punto di vista aziendale, ridurre l’invio accidentale di form, gli acquisti e le eliminazioni migliora la soddisfazione delle persone, riduce le richieste di supporto e diminuisce i tassi di abbandono delle transazioni. Un modello di interazione con il puntatore accessibile riduce anche il rischio di responsabilità legale ai sensi delle normative sull’accessibilità in Turchia e a livello internazionale.

Regole Axe-core Correlate

WCAG 2.5.2 richiede test manuali e non può essere valutato in modo affidabile solo da scanner automatici di accessibilità. Nessuna regola automatizzata specifica di axe-core corrisponde direttamente a questo criterio. Ecco perché il rilevamento automatico è insufficiente:

  • Perché l’automazione fallisce per l’annullamento del puntatore: Strumenti automatici come axe-core possono analizzare l’HTML e rilevare alcuni problemi ARIA o strutturali, ma non possono determinare in modo affidabile l’intento semantico e la reversibilità degli handler di eventi JavaScript. Uno strumento può rilevare che esiste un listener per l’evento mousedown su un elemento, ma non può determinare se quel listener attiva un’azione irreversibile, se è presente un meccanismo di annullamento altrove nell’applicazione o se la tempistica dell’evento di pressione è realmente essenziale per la funzionalità. La combinazione di comportamento a runtime, stato dell’applicazione e contesto d’uso necessaria per valutare questo criterio va oltre l’ambito di un’analisi automatizzata statica o basata sul DOM.
  • Cosa devono cercare i tester manuali: Le persone che testano devono interagire con ciascun controllo interattivo usando un dispositivo di puntamento e osservare con precisione quando l’azione viene attivata — alla pressione o al rilascio. Devono anche verificare se far scorrere il puntatore fuori dall’elemento prima del rilascio annulla l’azione e se, dopo l’attivazione, è accessibile un qualsiasi meccanismo di annullamento o interruzione.
  • Segnali parziali dall’automazione: Alcuni strumenti di linting o regole personalizzate di axe possono segnalare elementi con attributi onmousedown, ontouchstart o onpointerdown come bisognosi di revisione, ma questi avvisi richiedono un giudizio umano per determinare la conformità o la non conformità. Tratta qualsiasi segnalazione automatica di questo tipo come un invito a un’indagine manuale, non come un rapporto di errore definitivo.

Come Testare

  1. Scansione automatizzata (indagine iniziale): Esegui axe DevTools o Lighthouse sulla pagina per identificare gli elementi interattivi e qualsiasi binding di eventi personalizzati segnalato per revisione manuale. In Chrome DevTools, usa il pannello Elements per ispezionare i listener di eventi collegati a pulsanti, link e controlli personalizzati — cerca handler mousedown, touchstart o pointerdown su elementi che attivano azioni irreversibili.
  2. Test con puntatore del mouse — annullamento tramite clic e trascinamento: Per ciascun pulsante, link e controllo personalizzato sulla pagina, premi e tieni premuto il pulsante del mouse sull’elemento, quindi trascina il puntatore fuori dal perimetro dell’elemento prima di rilasciare. Se l’azione viene attivata mentre il pulsante è ancora premuto (prima del rilascio), questo è un errore. Se il trascinamento verso l’esterno impedisce l’attivazione dell’azione al rilascio, questo è conforme alle condizioni di reversal all’evento di rilascio o di assenza di evento di pressione.
  3. Test su dispositivo touch: Su un dispositivo touchscreen o un emulatore di browser (modalità dispositivo di Chrome DevTools), tocca e tieni premuto ciascun elemento interattivo, quindi fai scorrere il dito via prima di sollevarlo. Se l’azione viene attivata immediatamente al tocco (prima che tu sollevi il dito), questo è un errore a meno che la tempistica dell’evento di pressione non sia essenziale. Verifica che sollevare il dito al di fuori dell’elemento non attivi l’azione.
  4. Verifica dei controlli da tastiera: Sebbene questo criterio riguardi specificamente le interazioni con il puntatore, verifica che tutti gli elementi interattivi siano anche azionabili da tastiera. Premi Tab per portare il focus su ciascun elemento e Enter o Space per attivarlo, confermando che l’elemento è raggiungibile e funzionale senza un puntatore — questo supporta il quadro più ampio dell’accessibilità.
  5. Verifica del meccanismo di annullamento/interruzione: Per le azioni collegate a eventi di pressione (in cui può applicarsi l’eccezione essenziale), conferma che esista un chiaro meccanismo di annullamento o interruzione e che sia accessibile a tutte le persone, incluse quelle che usano tecnologie assistive. Per esempio, dopo un’azione di drag-and-drop, è presente un pulsante “annulla” raggiungibile da tastiera e da screen reader?
  6. Test combinato screen reader + puntatore (NVDA + Firefox, JAWS + Chrome, VoiceOver + Safari): Attiva gli elementi interattivi usando sia il puntatore sia il cursore virtuale dello screen reader. Conferma che le azioni attivate dal puntatore siano coerenti con quelle attivate dallo screen reader e che non vengano attivate inaspettatamente azioni immediate e irreversibili.
  7. Revisione del codice: Cerca nel codebase i binding dei listener di eventi: addEventListener('mousedown', addEventListener('touchstart', addEventListener('pointerdown' e gli attributi inline onmousedown, ontouchstart. Per ciascun caso, valuta se l’handler attiva un’azione irreversibile e se una delle quattro condizioni WCAG è soddisfatta.

Come Correggere

Azione irreversibile su mousedown — Non corretto

<!-- FAIL: Delete viene attivato immediatamente su mousedown, nessuna possibilità di annullamento -->
<button onmousedown='deleteRecord(recordId)'>Delete Record</button>

<script>
function deleteRecord(id) {
  // Il record viene eliminato immediatamente alla pressione del pulsante, prima del rilascio
  fetch('/api/records/' + id, { method: 'DELETE' });
}
</script>

Azione irreversibile su mousedown — Corretto

<!-- PASS: Delete viene attivato su click (evento di rilascio), comportamento nativo del pulsante -->
<button onclick='deleteRecord(recordId)'>Delete Record</button>

<!-- Ancora meglio: fornire una finestra di conferma come meccanismo di interruzione aggiuntivo -->
<button onclick='confirmDelete(recordId)'>Delete Record</button>

<script>
function confirmDelete(id) {
  // L'utente può annullare tramite la finestra di dialogo — soddisfa la condizione Interruzione o Annullamento
  if (confirm('Are you sure you want to delete this record? This cannot be undone.')) {
    fetch('/api/records/' + id, { method: 'DELETE' });
  }
}
</script>

Gesto touch attivato su touchstart — Non corretto

<!-- FAIL: L'azione viene attivata immediatamente su touchstart, nessuna possibilità di interruzione -->
<div id='buy-btn'>Buy Now</div>

<script>
document.getElementById('buy-btn').addEventListener('touchstart', function() {
  // L'acquisto viene avviato immediatamente quando il dito tocca l'elemento
  initiatePurchase();
});
</script>

Gesto touch attivato su touchstart — Corretto

<!-- PASS: Usa un pulsante nativo e collega l'azione a click, che viene attivato su touchend -->
<button id='buy-btn'>Buy Now</button>

<script>
// L'evento 'click' su un pulsante nativo viene attivato sull'evento di rilascio (touchend/mouseup)
// dando alle persone la possibilità di annullare facendo scorrere il dito via prima di rilasciare
document.getElementById('buy-btn').addEventListener('click', function() {
  initiatePurchase();
});
</script>

Drag-and-drop personalizzato senza reversal all’evento di rilascio — Non corretto

<!-- FAIL: L'elemento viene spostato nella nuova posizione su pointerdown, non su pointerup -->
<div class='draggable' onpointerdown='moveItemToTarget(this)'>
  Drag me
</div>

Drag-and-drop personalizzato con reversal all’evento di rilascio — Corretto

<!-- PASS: L'elemento si sposta nel target solo quando il puntatore viene rilasciato sopra la drop zone -->
<!-- Se l'utente trascina via prima di rilasciare, l'elemento torna alla posizione originale -->
<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) {
  // Registra solo l'intenzione; non sposta ancora l'elemento
  event.dataTransfer.setData('text/plain', event.target.id);
}
function handleDrop(event) {
  event.preventDefault();
  // L'elemento viene spostato solo al drop (equivalente all'evento di rilascio)
  // Se l'utente rilascia al di fuori della drop zone, l'elemento torna all'origine — reversal all'evento di rilascio soddisfatto
  const id = event.dataTransfer.getData('text/plain');
  event.currentTarget.appendChild(document.getElementById(id));
}
</script>

Errori Comuni

  • Collegare azioni irreversibili come invio di form, eliminazione di record o navigazione a eventi mousedown o pointerdown invece che a click, che viene attivato sull’evento di rilascio e consente l’annullamento tramite trascinamento via per impostazione predefinita.
  • Usare touchstart per attivare acquisti, conferme o modifiche di dati su interfacce di e-commerce o bancarie, dove un contatto momentaneo del dito non dovrebbe essere trattato come intenzione confermata dell’utente.
  • Dare per scontato che, poiché un pulsante usa un elemento nativo <button>, tutto il JavaScript collegato ad esso sia automaticamente conforme — un listener mousedown aggiunto tramite addEventListener viola comunque questo criterio se attiva un’azione irreversibile.
  • Invocare finestre modali, overlay o cambi di navigazione a pagina intera sull’evento di pressione di un puntatore, disorientando le persone che non intendevano attivare il controllo e non hanno modo di tornare indietro.
  • Implementare slider o controlli di range personalizzati che inviano un valore al server su pointerdown invece di attendere pointerup o un’azione di conferma separata.
  • Fare affidamento sulla finestra di dialogo confirm() predefinita del browser come unico meccanismo di annullamento per un’azione su evento di pressione senza testare se le tecnologie assistive possono accedere e usare in modo affidabile la finestra di dialogo prima che l’azione distruttiva sia completata.
  • Non fornire alcun feedback visivo o programmatico che indichi che un’azione su evento di pressione è in sospeso, rendendo impossibile per le persone capire che potrebbero interrompere spostando il puntatore via prima del rilascio.
  • Trattare l’eccezione essenziale in modo troppo ampio — per esempio, sostenendo che un pulsante “acquisto rapido” debba attivarsi su mousedown per motivi di velocità, quando non esiste alcun reale vincolo temporale e la motivazione è una comodità di prodotto piuttosto che una necessità funzionale.
  • Non testare sia su dispositivi con mouse sia su dispositivi touch — un’interfaccia può usare correttamente gli eventi di rilascio per le interazioni con il mouse ma collegare comunque azioni irreversibili a touchstart in un percorso di codice specifico per mobile.
  • Implementare funzionalità di annullamento accessibili solo tramite scorciatoia da tastiera (ad es. Ctrl+Z) senza fornire un controllo equivalente su schermo, lasciando le persone che usano solo il puntatore senza un meccanismo di annullamento dopo un’attivazione su evento di pressione.

Relazione con le Normative di Accessibilità della Turchia

La Circolare Presidenziale 2025/10 della Turchia, pubblicata nella Gazzetta Ufficiale n. 32933 il 21 giugno 2025, stabilisce requisiti obbligatori di accessibilità web allineati agli standard WCAG 2.2. In base a questa circolare, la conformità ai criteri di Livello A — inclusa WCAG 2.5.2 Annullamento del puntatore — è legalmente richiesta per un’ampia gamma di soggetti pubblici e privati che gestiscono servizi digitali in Turchia.

La circolare copre un ampio spettro di organizzazioni. Le istituzioni pubbliche e gli enti governativi devono raggiungere la piena conformità al Livello A entro un anno dalla data di pubblicazione della circolare. I soggetti del settore privato coperti dalla regolamentazione — incluse piattaforme di e-commerce, banche e istituzioni finanziarie, ospedali e fornitori di servizi sanitari, società di telecomunicazioni con 200,000 o più abbonati, agenzie di viaggio, società di trasporto private e scuole private autorizzate dal Ministero dell’Istruzione Nazionale (MoNE) — hanno una finestra di due anni per la conformità.

Per questi soggetti, la mancata corretta implementazione dell’Annullamento del puntatore comporta un reale rischio regolatorio. Si consideri una piattaforma di e-commerce turca la cui pagina di checkout mobile attiva la conferma del pagamento su touchstart — una tale implementazione costituirebbe una violazione diretta di WCAG 2.5.2 e, per estensione, della Circolare Presidenziale. Le persone che avviano accidentalmente un acquisto su quella piattaforma a causa di un tremore, di una disabilità motoria o di un semplice tocco errato avrebbero basi legali per sostenere che la piattaforma non ha adempiuto ai propri obblighi di accessibilità.

Oltre alla conformità normativa, le organizzazioni turche dovrebbero riconoscere che l’Annullamento del puntatore non è semplicemente una casella tecnica da spuntare, ma un principio di progettazione fondamentale che protegge la capacità delle persone di interagire in modo sicuro e intenzionale con i servizi digitali. Implementare l’attivazione sull’evento di rilascio e meccanismi di annullamento in tutti i componenti interattivi — dai carrelli della spesa e sistemi di prenotazione appuntamenti agli strumenti di gestione documentale — dimostra un impegno verso un design inclusivo che avvantaggia tutte le persone, non solo quelle con disabilità.

Le organizzazioni soggette alla circolare dovrebbero condurre audit sistematici dei propri pattern di gestione degli eventi JavaScript, in particolare sulle pagine ottimizzate per mobile e sui componenti interattivi personalizzati, per identificare e correggere eventuali attivazioni su evento di pressione che mancano di meccanismi di annullamento o inversione. Documentare questi interventi di correzione supporterà anche gli obblighi di rendicontazione della conformità che potrebbero essere richiesti dalle disposizioni di applicazione della circolare.