Fallo Común F103 de WCAG 2.1: Mensajes de estado no determinables programáticamente

Ejemplo de error en accesibilidad: mensaje de resultados de búsqueda sin rol de estado, impidiendo su anuncio por lectores de pantalla.

La accesibilidad web es clave para garantizar que todas las personas, incluidas aquellas con discapacidades, puedan interactuar con el contenido sin barreras. Uno de los problemas más comunes es cuando los mensajes de estado en una página web no pueden ser detectados automáticamente por tecnologías de asistencia como los lectores de pantalla.

Este problema está relacionado con el Criterio de Conformidad 4.1.3 de WCAG 2.1, que exige que los mensajes de estado sean programáticamente determinables para que los usuarios no pierdan información clave sobre cambios en la interfaz.

Según estudios, más del 70% de los usuarios con discapacidad visual dependen de lectores de pantalla para interactuar con las páginas web. Si los mensajes de estado no son anunciados correctamente, estos usuarios pueden no darse cuenta de cambios importantes, como la confirmación de un envío de formulario o la falta de resultados en una búsqueda.

Acerca de este fallo

Este fallo ocurre cuando los mensajes de estado dinámicos no son programáticamente determinables porque no tienen roles o atributos adecuados como aria-live="polite", role="status"o role="alert", entre otros.

Impacto en la accesibilidad:

  • Los usuarios de lectores de pantalla no reciben alertas automáticas sobre cambios de estado.
  • Puede generar confusión o frustración al no obtener confirmaciones de acciones realizadas.
  • Impide una experiencia inclusiva y accesible en aplicaciones dinámicas.

Escenarios donde ocurre este fallo:

  • Un usuario realiza una búsqueda y no obtiene resultados, pero el mensaje «0 resultados encontrados» no es anunciado.
  • Una alerta de error en un formulario aparece visualmente, pero no se informa mediante tecnologías de asistencia.
  • Una notificación de éxito después de una acción (como «Mensaje enviado») no se comunica a usuarios con discapacidad visual.

Ejemplos

Ejemplo incorrecto 1: Mensaje de estado sin rol accesible

En este caso, el mensaje «Búsqueda completada. 0 resultados» se muestra en pantalla, pero no es detectado por un lector de pantalla, ya que no tiene un atributo aria-live.

<form id=»searchForm»>
<input type=»text» id=»searchInput» placeholder=»Buscar»>
<button type=»submit»>Buscar</button>
</form>

<div id=»searchResults»>Búsqueda completada. 0 resultados</div>

🔴 Problema: Los lectores de pantalla no anuncian el mensaje automáticamente porque el div no tiene un rol accesible.

Solución correcta: Uso de aria-live para anunciar el mensaje

<div id=»searchResults» aria-live=»polite»>Búsqueda completada. 0 resultados</div>

✅ ¿Qué mejora?: El mensaje ahora será anunciado automáticamente por lectores de pantalla.

Ejemplo incorrecto 2: Mensaje de error sin role="alert"

Este formulario muestra un error, pero los usuarios de lectores de pantalla no son notificados de inmediato.

<form>
<input type=»email» id=»email» placeholder=»Introduce tu correo»>
<button type=»submit»>Enviar</button>
</form>

<div id=»errorMessage»>Error: El campo de correo es obligatorio.</div>

🔴 Problema: Los lectores de pantalla no detectan el error automáticamente.

Solución correcta: Uso de role="alert"

<div id=»errorMessage» role=»alert»>Error: El campo de correo es obligatorio.</div>

✅ ¿Qué mejora?: Ahora el mensaje será anunciado automáticamente cuando aparezca.

Ejemplo correcto: Solución ideal

A continuación, se muestra una solución correcta para un mensaje de estado accesible. Se usa aria-live="polite" para asegurarse de que el mensaje sea anunciado por los lectores de pantalla cuando se actualiza dinámicamente, sin interrumpir la experiencia del usuario.

<form id=»searchForm»>
<input type=»text» id=»searchInput» placeholder=»Buscar»>
<button type=»submit»>Buscar</button>
</form>

<div id=»searchResults» aria-live=»polite»></div>

<script>
document.getElementById(«searchForm»).addEventListener(«submit», function(event) {
event.preventDefault();

let searchResults = document.getElementById(«searchResults»);

// Simulamos un resultado vacío en la búsqueda
searchResults.textContent = «No se encontraron resultados.»;
});
</script>

✅ ¿Qué mejora?:

  • aria-live="polite": Permite que los lectores de pantalla anuncien automáticamente el mensaje cuando el contenido cambia, sin interrumpir la navegación del usuario.
  • Se actualiza dinámicamente el contenido del div con los resultados de búsqueda.
  • El usuario recibe feedback inmediato sin necesidad de mover el foco ni hacer clic en otro lugar.

Errores comunes y cómo evitarlos

Errores frecuentes:

  1. No incluir aria-live en mensajes dinámicos.
  2. Usar solo cambios visuales sin atributos accesibles.
  3. No emplear role="status" o role="alert" cuando sea necesario.
  4. Insertar mensajes de estado después de la interacción, pero sin atributos que permitan detectarlos.

Cómo evitar estas errores:

  • Siempre usa aria-live="polite" para mensajes informativos y aria-live="assertive" para alertas críticas.
  • Emplea role="status", role="alert" o role="log" en función del tipo de mensaje.
  • Asegura que los mensajes sean anunciados automáticamente sin requerir interacción adicional del usuario.

Preguntas frecuentes sobre el fallo F103

¿Por qué los lectores de pantalla no anuncian algunos mensajes dinámicos?

Porque estos mensajes no tienen roles o atributos que los hagan programáticamente detectables, como aria-live.

¿Cuándo usar role="alert" en lugar de aria-live?

Usa role="alert" cuando se trate de mensajes críticos o errores que requieren la atención inmediata del usuario.

¿Es necesario usar aria-live en todos los mensajes de estado?

No, solo en aquellos que no toman el foco y que son necesarios para informar sobre el estado de una acción.

¿Qué diferencia hay entre aria-live="polite" y aria-live="assertive"?

  • aria-live="polite" anuncia el mensaje cuando el lector de pantalla termina de leer el contenido en curso.
  • aria-live="assertive" interrumpe inmediatamente al usuario para anunciar el mensaje.

¿Los mensajes de estado pueden ser ocultos visualmente y aún así ser accesibles?

Sí, mediante técnicas como visually-hidden, que oculta el contenido visualmente pero lo mantiene accesible para lectores de pantalla.

¿Cómo probar si los mensajes de estado son accesibles?

Utiliza un lector de pantalla como NVDA o VoiceOver y verifica si los mensajes se anuncian automáticamente al aparecer.

Recursos relacionados

Pruebas y validación

Procedimiento

  1. Usa un lector de pantalla (NVDA, JAWS, VoiceOver) y realiza una acción en la página.
  2. Verifica si los mensajes de estado son anunciados sin cambiar el foco del usuario.
  3. Inspecciona el código para confirmar la presencia de aria-live, role="alert", role="status", o role="log".
  4. Si los mensajes no son detectados, verifica que no estén ocultos o sin atributos accesibles.

Resultados esperados

Si las pruebas confirman que:

  • Los mensajes de estado se anuncian automáticamente a los usuarios de lectores de pantalla.
  • Se usan aria-live, role="status", role="alert", o role="log" correctamente.

Entonces, el contenido cumple con WCAG 2.1 – Criterio 4.1.3.

Si alguno de los elementos anteriores no se cumple, el contenido falla el criterio 4.1.3 y debe corregirse.

Garantizar que los mensajes de estado sean programáticamente accesibles es fundamental para la inclusión digital. Implementar correctamente aria-live, role="alert", y role="status" permitirá que los usuarios con discapacidad visual reciban información clave sin obstáculos.

📢 ¡Mejora la accesibilidad de tu web hoy! Si necesitas ayuda con la implementación de WCAG 2.1, contáctanos y hagamos la web más accesible para todos. 🚀

¿Tienes dudas? Solicita una consultoría inicial gratuita

Evaluamos tu sitio web para identificar barreras que dificultan el acceso a personas con discapacidad. Te entregamos un informe con errores detectados y soluciones para que tu web sea usable por todos.