Técnica ARIA WCAG 2.2
ARIA21Marcar los campos con errores con aria-invalid
Nombre oficial en el W3C: Usar aria-invalid para indicar un campo con error
En pocas palabras
Cuando un campo de formulario no supera la validación, se le añade aria-invalid="true". El lector de pantalla anuncia entonces que el dato no es válido. Lo ideal es enlazar también el mensaje de error con aria-describedby, para que se oiga qué falla y cómo arreglarlo.
Por qué es importante
Muchas webs marcan los errores solo con un borde rojo. Quien no ve bien o no distingue colores no sabe qué campo falla.
Con aria-invalid="true", el lector de pantalla dice «no válido» al llegar al campo. Si además el mensaje está enlazado, la persona oye, por ejemplo, «Correo electrónico, no válido, falta la arroba».
Cómo se hace
- No ponga
aria-invalid="true"al cargar la página. Añádalo solo cuando el campo haya fallado la validación. - Quítelo, o cámbielo a
"false", en cuanto el dato sea correcto. - Escriba junto al campo un mensaje de error visible que diga qué falla.
- Enlace el mensaje con el campo: dele un
idy añada al campoaria-describedbycon eseid. - No confíe solo en el color. Incluya texto o un icono con texto alternativo.
Cómo comprobarlo
- Cargue la página y compruebe que ningún campo tiene todavía
aria-invalid="true". - Envíe el formulario con datos vacíos o mal escritos. Los campos que fallan deben pasar a
aria-invalid="true". - Corrija un dato y compruebe que el atributo desaparece o vuelve a
"false". - Con un lector de pantalla, vaya a un campo con error. Debe anunciar «no válido» y el texto del error.
Ejemplo
Campo de correo tras fallar la validación, con su mensaje de error enlazado.
<label for="correo">Correo electrónico</label>
<input type="email" id="correo"
aria-invalid="true" aria-describedby="error-correo">
<p id="error-correo">
Error: falta la arroba (@). Ejemplo: nombre@dominio.es
</p>
Ver el texto completo del W3C (traducción al español)
Esta es una traducción no oficial al español de la técnica ARIA21 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.
Aplicabilidad
HTML con Accessible Rich Internet Applications.
Descripción
Esta técnica muestra cómo puede usarse aria-invalid para identificar los campos que no han superado la validación. El atributo aria-invalid puede usarse como parte de un patrón de validación personalizado, en lugar de usar el atributo required de HTML junto con tipos de entrada específicos (por ejemplo: type="email").
El atributo aria-invalid no debe establecerse en "true" antes de que se realice la validación de la entrada. Establecer aria-invalid en "false" equivale a no poner el atributo en el control de formulario.
Ejemplos
Usar aria-invalid en campos obligatorios
El atributo aria-invalid se usa en los campos obligatorios que están vacíos cuando se envía el formulario. Un mensaje situado encima del formulario indica al usuario que hay campos de formulario que deben completarse.
HTML:
<form name="signup" id="signup" method="post" action="">
<p id="errors" aria-live="assertive"></p>
<div>
<label for="first">First Name (required)</label>
<input aria-invalid="false" autocomplete="given-name" id="first" name="first" type="text">
</div>
<div>
<label for="last">Last Name (required)</label>
<input aria-invalid="false" autocomplete="family-name" id="last" name="last" type="text">
</div>
<div>
<label for="email">Email (required)</label>
<input aria-invalid="false" autocomplete="email" id="email" name="email" type="text">
</div>
<div>
<button id="button" type="submit">Sign Up</button>
</div>
</form>
CSS:
label.failed {
background:#CE0000;
color:#fff;
}
JavaScript:
Estas son las dos funciones JavaScript que establecen el atributo aria-invalid="true" y después crean el mensaje de error de validación:
const requiredFields = ['first', 'last', 'email'];
let errorCount = 0;
requiredFields.forEach(fieldId => {
const field = document.getElementById(fieldId);
if (field.value.trim() === '') {
field.setAttribute('aria-invalid', 'true');
document.querySelector(`label[for='${fieldId}']`).classList.add('failed');
errorCount++;
}
});
if (errorCount > 0) {
errText.textContent = `Please complete all ${errorCount} required ${errorCount === 1 ? 'field' : 'fields'} and retry`;
}
Ejemplo funcional: usar aria-invalid en campos obligatorios.
Identificar errores en el formato de los datos
En este ejemplo, aria-invalid y aria-describedby se usan conjuntamente para indicar un error cuando el número de identificación personal (PIN), la dirección de correo electrónico o la fecha de inicio no tienen el formato esperado. El mensaje de error se asocia al campo mediante aria-describedby, y aria-invalid facilita encontrar por software los campos con errores.
Características
- Añade un atributo
aria-invalid="true"a un campo de formulario si faltan los datos introducidos o no tienen el formato esperado:- El PIN contiene menos de 4 caracteres;
- La dirección de correo electrónico no cumple el formato requerido;
- El apellido debe contener al menos dos letras;
- La fecha de inicio de la póliza es anterior a la fecha de hoy.
- Muestra un mensaje de error que se conecta por software con el campo de formulario correspondiente mediante el atributo
aria-describedby.
HTML:
<div class="control">
<label for="pin4">PIN * (4 digits)</label>
<input id="pin4" name="pin4" pattern="\d{4}" size="4" type="text" aria-describedby="pin4-errormsg" aria-invalid="true" class="error">
<span class="errtext" id="pin4-errormsg">Error: PIN is required</span>
</div>
CSS:
.error {
border: #CE0000 thin solid;
}
.errtext {
background: #EEEEFF url('error-icon.svg') no-repeat right 0.25em center;
color:#CE0000;
display:block;
margin-bottom: 1em;
max-width: fit-content;
padding: .25em 1.6em .25em .25em;
}
JavaScript:
Se necesita JavaScript para añadir los atributos aria-invalid, aria-describedby y class, así como para añadir el texto del error. Esta función es la parte relevante del script de validación completo:
function addFieldError(field, message) {
const errId = field.id + '-errormsg';
const errDiv = document.createElement('div');
errDiv.className = 'errtext';
errDiv.id = errId;
errDiv.textContent = message;
field.parentNode.appendChild(errDiv);
field.setAttribute('aria-describedby', errId);
field.setAttribute('aria-invalid', 'true');
field.classList.add('error');
}
Ejemplo funcional: identificar errores en el formato de los datos.
Pruebas
Procedimiento
Para cada control de formulario que dependa de aria-invalid para transmitir un fallo de validación:
- Comprobar que
aria-invalidno está establecido en true cuando no existe un fallo de validación. - Comprobar que
aria-invalidestá establecido en true cuando sí existe un fallo de validación. - Comprobar que las etiquetas asociadas por software o el texto de instrucciones asociado por software al campo proporcionan información suficiente para entender el error.
Resultados esperados
- Las comprobaciones n.º 1 a n.º 3 son verdaderas.
Recursos
- Supported States and Properties: WAI-ARIA (estados y propiedades admitidos en WAI-ARIA)
- Using aria-invalid For Error Indication (uso de aria-invalid para indicar errores)
Cómo lo comprobamos en ADDAW
En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.
Basado en la técnica ARIA21 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.