alertdialog
En dialog, der formidler en presserende besked og kræver brugerens svar. Kombinerer dialog-semantik med alert-annoncering. Brug kun til destruktive bekræftelser, fejl der blokerer videre arbejde, eller afbrydelser, der ikke kan vente.
Hvornår bruges den
Kun til afbrydelser: en fejl, der forhindrer brugeren i at komme videre, en “Er du sikker på, at du vil slette?”-bekræftelse, eller en advarsel om ugemte ændringer ved navigation væk fra siden. Det er overdrevet at nå ud efter alertdialog til rutinemæssige modaler — brug den simple role="dialog" til dem.
Forskellen fra role="dialog" er, at en alertdialog annonceres som et role="alert" — assertivt og øjeblikkeligt — når den vises. Dette er passende til reelle afbrydelser; misbrug fører til træthed hos skærmlæser-brugere.
Både aria-labelledby (der peger på titlen) og aria-describedby (der peger på brødteksten) er påkrævede. Alertdialogen skal indeholde mindst én fokuserbar knap, så brugeren kan lukke den.
Tastatur og fokuskontrakt
Ifølge APG alertdialog-mønsteret:
- Fokus flyttes til alertdialogen ved åbning — typisk til den sikreste knap (Annuller), så et utilsigtet Enter ikke bekræfter en destruktiv handling.
- Tab / Shift+Tab cykler fokus inden for dialogen.
- Escape lukker alertdialogen og returnerer fokus til udløseren.
- Resten af siden er inaktiv, mens alertdialogen er åben.
Vælg det initiale fokus omhyggeligt: for “Slet?”-prompter skal fokus som standard være på Annuller — aldrig på den destruktive knap.
Hyppige fejl
- Bruge
role="alertdialog"til alle modaler. Skærmlæsere blaster brugeren med den assertive annoncering, hver gang en modal åbnes. - Initialt fokus på den destruktive knap (Slet, Kassér) — et fejlagtigt Enter sletter brugerens arbejde.
- Manglende
aria-describedbypå brødteksten. Brugeren hører titlen og knapperne, men ikke advarslen. - Alertdialog uden knapper — der er ingen måde at lukke den på, og rollen kræver et handlingsrettet svar.
- Selvlukkende alertdialoger efter en timeout. Ophæver semantikken “kræver svar”.
Eksempel
<div
role="alertdialog"
aria-modal="true"
aria-labelledby="confTitle"
aria-describedby="confDesc"
>
<h2 id="confTitle">Delete draft?</h2>
<p id="confDesc">"Untitled draft (March 12)" will be permanently deleted. This action cannot be undone.</p>
<button type="button" autofocus>Cancel</button>
<button type="button">Delete draft</button>
</div>