alertdialog
Un diálogo que transmite un mensaje urgente y requiere respuesta del usuario. Combina la semántica de diálogo con el anuncio de alerta. Debe usarse únicamente para confirmaciones destructivas, errores que bloquean el trabajo o interrupciones que no pueden esperar.
Cuándo utilizarlo
Solo para interrupciones: un error que impide al usuario continuar, una confirmación de tipo «¿Está seguro de que desea eliminar esto?», una advertencia de cambios sin guardar al navegar fuera de la página. Recurrir a alertdialog para modales rutinarios es excesivo — para esos casos se debe usar el simple role="dialog".
La diferencia con role="dialog" es que un alertdialog se anuncia como un role="alert" — de forma asertiva e inmediata — en el momento en que aparece. Esto es apropiado para interrupciones genuinas; el uso indebido provoca fatiga en los lectores de pantalla.
Tanto aria-labelledby (apuntando al título) como aria-describedby (apuntando al texto del cuerpo) son obligatorios. El alertdialog debe contener al menos un botón con foco para que el usuario pueda cerrarlo.
Contrato de teclado y foco
Según el patrón de alertdialog de APG:
- El foco se mueve al alertdialog al abrirse — normalmente al botón más seguro (Cancelar) para que una pulsación accidental de Enter no confirme una acción destructiva.
- Tab / Shift+Tab ciclan el foco dentro del diálogo.
- Escape cierra el alertdialog y devuelve el foco al elemento que lo desencadenó.
- El resto de la página permanece inerte mientras el alertdialog está abierto.
El foco inicial debe elegirse con cuidado: en los diálogos de confirmación de eliminación, se debe poner el foco en Cancelar por defecto — nunca en el botón destructivo.
Errores frecuentes
- Usar
role="alertdialog"para todos los modales. Los lectores de pantalla impactan al usuario con el anuncio asertivo en cada apertura de modal. - Foco inicial en el botón destructivo (Eliminar, Descartar) — una pulsación de Enter accidental destruye el trabajo del usuario.
aria-describedbyausente en el texto del cuerpo. El usuario escucha el título y los botones, pero no la advertencia.- Un alertdialog sin botones — no hay forma de cerrarlo, y el rol exige una respuesta accionable.
- Alertdialogs que se cierran automáticamente después de un tiempo de espera. Contradice la semántica de «requiere respuesta».
Ejemplo
<div
role="alertdialog"
aria-modal="true"
aria-labelledby="confTitle"
aria-describedby="confDesc"
>
<h2 id="confTitle">¿Eliminar borrador?</h2>
<p id="confDesc">«Borrador sin título (12 de marzo)» se eliminará de forma permanente. Esta acción no puede deshacerse.</p>
<button type="button" autofocus>Cancelar</button>
<button type="button">Eliminar borrador</button>
</div>