alertdialog
Un dialog che trasmette un messaggio urgente e richiede una risposta dell'utente. Combina la semantica del dialog con l'annuncio dell'alert. Da usare solo per conferme distruttive, errori che bloccano l'operatività o altre interruzioni che non possono attendere.
Quando usarlo
Solo per interruzioni: un errore che impedisce all’utente di proseguire, una richiesta di conferma del tipo «Sei sicuro di voler eliminare?», un avviso di modifiche non salvate durante la navigazione. Ricorrere a alertdialog per modali di routine è eccessivo — per queste si usa il semplice role="dialog".
La differenza rispetto a role="dialog" è che un alertdialog viene annunciato come un role="alert" — in modo assertivo e immediato — nel momento in cui appare. Ciò è appropriato per interruzioni genuine; l’uso improprio porta all’affaticamento da screen reader.
aria-labelledby (che punta al titolo) e aria-describedby (che punta al testo del corpo) sono entrambi obbligatori. L’alertdialog deve contenere almeno un pulsante attivabile affinché l’utente possa chiuderlo.
Contratto tastiera + focus
Secondo il pattern APG alertdialog:
- Il focus si sposta sull’alertdialog all’apertura — tipicamente sul pulsante più sicuro (Annulla), in modo che una pressione accidentale di Invio non confermi un’azione distruttiva.
- Tab / Shift+Tab spostano il focus all’interno del dialog.
- Escape chiude l’alertdialog e restituisce il focus all’elemento che lo ha attivato.
- Il resto della pagina è inattivo mentre l’alertdialog è aperto.
Scegliere con cura il focus iniziale: per le richieste di conferma «Elimina?», il focus ricade di default su Annulla — mai sul pulsante distruttivo.
Errori comuni
- Usare
role="alertdialog"per ogni modale. Gli screen reader bombardano l’utente con l’annuncio assertivo a ogni apertura di modale. - Focus iniziale sul pulsante distruttivo (Elimina, Scarta) — una pressione involontaria di Invio cancella il lavoro dell’utente.
aria-describedbymancante sul testo del corpo. L’utente sente il titolo e i pulsanti ma non l’avviso.- Alertdialog privo di pulsanti — non è possibile chiuderlo, e il ruolo impone una risposta attiva.
- Alertdialog che si chiude automaticamente dopo un timeout. Vanifica la semantica «richiede risposta».
Esempio
<div
role="alertdialog"
aria-modal="true"
aria-labelledby="confTitle"
aria-describedby="confDesc"
>
<h2 id="confTitle">Eliminare la bozza?</h2>
<p id="confDesc">«Bozza senza titolo (12 marzo)» verrà eliminata definitivamente. Questa azione non può essere annullata.</p>
<button type="button" autofocus>Annulla</button>
<button type="button">Elimina bozza</button>
</div>