Técnica ARIA WCAG 2.2
ARIA19Usar la función (role) alert de ARIA o regiones activas para identificar errores
En resumen
Cuando un formulario muestra un mensaje de error sin recargar la página, quien usa un lector de pantalla puede no enterarse porque el foco sigue en otro sitio. Esta técnica coloca un contenedor vacío con role="alert" (o aria-live="assertive") en la página desde el principio y, al producirse el error, inyecta el mensaje en él para que la tecnología de asistencia lo anuncie de inmediato. Úsela en validaciones de formularios hechas con JavaScript.
Ejemplo práctico
Formulario de suscripción al boletín de una tienda online que valida el correo con JavaScript sin recargar la página. El mensaje de error se inserta en un contenedor junto al botón, lejos del foco del usuario.
Así no: Error insertado en un párrafo sin región activa
El mensaje se ve en rojo, pero se escribe en un <p> normal: el lector de pantalla no anuncia nada y quien lo usa sigue en el botón sin saber que el envío ha fallado. Para notarlo, active NVDA o VoiceOver y envíe el formulario vacío.
<form id="boletin" action="#" novalidate>
<label for="correo">Correo electrónico</label>
<input type="email" id="correo" autocomplete="email">
<button>Suscribirme</button>
<p id="error" class="error"></p>
</form>
<style>.error { color: #b00020; font-weight: bold; }</style>
<script>
document.getElementById('boletin').addEventListener('submit', function (e) {
e.preventDefault();
var campo = document.getElementById('correo');
var valido = campo.value && campo.validity.valid;
document.getElementById('error').textContent = valido ? '' :
'Error: escriba un correo electrónico válido, por ejemplo nombre@dominio.es.';
});
</script>

La demostración contiene, a propósito, el error de accesibilidad que se explica.
Así sí: Contenedor con role="alert" presente desde la carga
El mismo párrafo lleva role="alert" y aria-atomic="true" desde que se carga la página, de modo que el texto que se inyecta se anuncia de inmediato. En cada envío se vacía el contenedor y se vuelve a escribir el mensaje, para que se anuncie también si el error se repite.
<form id="boletin" action="#" novalidate>
<label for="correo">Correo electrónico</label>
<input type="email" id="correo" autocomplete="email">
<button>Suscribirme</button>
<p id="error" class="error" role="alert" aria-atomic="true"></p>
</form>
<style>.error { color: #b00020; font-weight: bold; }</style>
<script>
document.getElementById('boletin').addEventListener('submit', function (e) {
e.preventDefault();
var campo = document.getElementById('correo'), caja = document.getElementById('error');
var valido = campo.value && campo.validity.valid;
caja.textContent = '';
if (!valido) setTimeout(function () {
caja.textContent = 'Error: escriba un correo electrónico válido, por ejemplo nombre@dominio.es.';
}, 100);
});
</script>
Pruébelo aquí:
Cómo comprobarlo
Errores frecuentes en auditorías
- Crear el contenedor con role="alert" en el mismo momento del error, de modo que muchos lectores de pantalla no lo anuncian.
- Escribir el mismo mensaje que ya había en la región activa, sin vaciarla antes, con lo que el segundo error no se anuncia.
- Poner role="alert" en todo el formulario o en un contenedor con mucho contenido, que se lee entero cada vez que cambia algo.
- Usar role="alert" para mensajes informativos o de éxito que no son urgentes y deberían ir en role="status".
Técnica completa: traducción al español del texto del W3C
Aplicabilidad
Tecnologías que admiten Accessible Rich Internet Applications (WAI-ARIA).
Descripción
El propósito de esta técnica es notificar a las tecnologías de asistencia cuando se produce un error de entrada. El atributo aria-live hace posible que una tecnología de asistencia (como un lector de pantalla) reciba una notificación cuando se inyectan mensajes de error en un contenedor de región activa (live region). El contenido de la región aria-live es leído automáticamente por la tecnología de asistencia, sin que esta tenga que situar el foco en el lugar donde se muestra el texto.
También existen varias funciones (roles) de región activa para casos especiales que pueden usarse en lugar de aplicar directamente las propiedades de región activa.
Ejemplos
Inyectar mensajes de error en un contenedor con role=alert ya presente en el DOM
El siguiente ejemplo usa role=alert, que equivale a usar aria-live=assertive.
En el ejemplo hay un elemento contenedor de mensajes de error vacío con aria-atomic=true y una propiedad aria-live o una función alert, presente en el DOM al cargar la página. El contenedor de errores debe estar presente en el DOM al cargar la página para que la mayoría de los lectores de pantalla lean el mensaje de error. aria-atomic=true es necesario para que VoiceOver en iOS lea los mensajes de error después de más de un envío no válido.
Se usa JavaScript para comprobar si los campos de entrada están vacíos al enviar el formulario y, en ese caso, inyectar los mensajes de error en los contenedores de región activa. Cada vez que se intenta un nuevo envío, los mensajes de error anteriores se eliminan del contenedor y se inyectan los nuevos.
// Get the form element
const form = document.getElementById('signup');
// Listen for when the form is submitted
form.addEventListener('submit', function(event) {
// Stop the form from actually submitting (so we can check it first)
event.preventDefault();
// Get references to the input fields
const firstNameInput = document.getElementById('first');
const lastNameInput = document.getElementById('last');
const emailInput = document.getElementById('email');
// Get the element where we'll show error messages
const errorsContainer = document.getElementById('errors');
// Create an empty array to collect error messages
const errorMessages = [];
// Check if first name is empty
if (firstNameInput.value === '') {
errorMessages.push('<li>Please enter your first name.</li>');
}
// Check if last name is empty
if (lastNameInput.value === '') {
errorMessages.push('<li>Please enter your last name.</li>');
}
// Check if email is empty
if (emailInput.value === '') {
errorMessages.push('<li>Please enter your email address.</li>');
}
// Clear the errors container first
// (This helps screen readers notice when new content appears)
errorsContainer.innerHTML = '';
// Wait 500 milliseconds, then show the errors
setTimeout(function() {
// If there are any errors, wrap them in a list and display them
if (errorMessages.length > 0) {
errorsContainer.innerHTML = '<ul>' + errorMessages.join('') + '</ul>';
}
}, 500);
});
<form name="signup" id="signup">
<p id="errors" role="alert" aria-atomic="true"></p>
<div>
<label for="first">First Name (required)</label>
<input autocomplete="given-name" type="text" name="first" id="first">
</div>
<div>
<label for="last">Last Name (required)</label>
<input autocomplete="family-name" type="text" name="last" id="last">
</div>
<div>
<label for="email">Email (required)</label>
<input autocomplete="email" type="text" name="email" id="email">
</div>
<div>
<input type="submit" name="button" id="button" value="Submit">
</div>
</form>
Ejemplo funcional: Usar role=alert para identificar errores.
Pruebas
Procedimiento
- Determinar que al cargar la página hay presente en el DOM (Document Object Model) un contenedor de errores vacío con el atributo
role=alertoaria-live=assertive. - Provocar el error que hace que el contenido de la región activa aparezca o se actualice.
- Determinar que el mensaje de error se ha inyectado en el contenedor de errores ya presente.
Resultados esperados
- Las comprobaciones n.º 1 y n.º 3 son verdaderas.
Recursos
- WAI-ARIA Authoring Practices Guide (guía de prácticas de autor de WAI-ARIA)
- WAI-ARIA, Supported States and Properties, aria-describedby (estados y propiedades admitidos: aria-describedby)
- WAI-ARIA, The Roles model, alert (modelo de funciones: alert)
Cómo lo comprobamos en ADDAW
En las auditorías de accesibilidad de ADDAW revisamos cada criterio de conformidad siguiendo este catálogo de técnicas: comprobamos si la web aplica una técnica suficiente y documentamos cada fallo común con capturas y el código afectado, para que el equipo de desarrollo sepa exactamente qué corregir. Los informes siguen la metodología del Observatorio de Accesibilidad y la norma UNE-EN 301 549.
Fuente y licencia
Traducción al español, no oficial, realizada por ADDAW a partir de la técnica ARIA19 del documento «Techniques for WCAG 2.2» del W3C (versión del repositorio público del W3C a 22/10/2026). Copyright © W3C® (MIT, ERCIM, Keio, Beihang). Se publica conforme a la licencia de documentos del W3C. El texto normativo de referencia es el original en inglés; si detecta un error en la traducción, escríbanos.