Fallo Común F101 de WCAG 2.1: Activación de un control en el evento de bajada

Mano presionando un botón rojo, representando la activación inmediata de un control sin opción de cancelación, un error de accesibilidad según WCAG 2.1.

La accesibilidad web garantiza que todos los usuarios, independientemente de sus habilidades o dispositivos, puedan interactuar con los elementos de una página sin obstáculos. Uno de los problemas recurrentes en la usabilidad es la activación de controles en el evento de bajada (down-event), lo que puede llevar a acciones accidentales e irreversibles.

Este problema afecta especialmente a usuarios con discapacidades motoras o aquellos que utilizan dispositivos táctiles o stylus. Según el W3C, los controles deben activarse preferiblemente en el evento de subida (up-event) o proporcionar una opción de cancelación para evitar errores. En este artículo exploraremos el fallo F101 y cómo solucionarlo.

Acerca de este fallo

El fallo F101 se produce cuando un control, como un botón o enlace, activa su funcionalidad en el momento en que el usuario presiona el ratón, la pantalla táctil o un stylus (down-event), en lugar de hacerlo cuando el usuario suelta (up-event). Esto puede provocar activaciones involuntarias y frustración para quienes tienen dificultades motoras o utilizan tecnología asistiva.

¿Por qué es un problema?

  • No permite cancelar la acción antes de que ocurra.
  • Puede generar errores en usuarios con temblores o dificultades de precisión.
  • No cumple con el criterio de conformidad 2.5.2: Cancelación del puntero de WCAG 2.1.

Ejemplos

Ejemplo incorrecto 1: Botón de cierre activado en el evento de bajada

En este caso, un botón de «Cerrar» en un formulario se activa cuando el usuario toca o presiona el botón, sin esperar a que lo suelte.

<button id=»close» type=»button»>Cerrar</button>

<script>
document.getElementById(«close»).addEventListener(«mousedown», function() {
// Cierra el formulario inmediatamente al presionar
closeForm();
});

function closeForm() {
alert(«El formulario se ha cerrado.»);
}
</script>

🔴 Problema:

  • El formulario se cierra inmediatamente cuando el usuario presiona el botón.
  • No hay opción de cancelación si la acción fue accidental.
  • Los usuarios con movilidad reducida pueden activar el botón sin querer.

Solución correcta: Activación en el evento de subida

En esta versión, el botón solo cierra el formulario cuando el usuario suelta el clic o levanta el dedo (up-event), permitiendo cancelar la acción si se desliza fuera del botón antes de soltar.

<button id=»close» type=»button»>Cerrar</button>

<script>
document.getElementById(«close»).addEventListener(«mouseup», function() {
closeForm();
});

function closeForm() {
alert(«El formulario se ha cerrado.»);
}
</script>

✅ ¿Qué mejora?:

  • La acción solo se ejecuta cuando el usuario suelta el botón.
  • Si el usuario presiona por error y desliza el cursor fuera del botón, la acción no se activa.
  • Cumple con el Criterio de Conformidad 2.5.2.

Ejemplo incorrecto 2: Enlace activado en «touchstart»

Un enlace en una interfaz táctil activa su acción cuando el usuario apenas toca la pantalla (touchstart), sin permitir cancelación.

<a href=»pagina.html» id=»enlace»>Ir a página</a>

<script>
document.getElementById(«enlace»).addEventListener(«touchstart», function() {
window.location.href = «pagina.html»;
});
</script>

🔴 Problema:

  • La navegación ocurre sin esperar a que el usuario retire el dedo.
  • No hay forma de evitar la acción si fue accidental.

Solución correcta: Activación en «touchend»

El siguiente código permite que el usuario cancele la acción si desliza el dedo fuera del enlace antes de soltar.

<a href=»pagina.html» id=»enlace»>Ir a página</a>

<script>
document.getElementById(«enlace»).addEventListener(«touchend», function() {
window.location.href = «pagina.html»;
});
</script>

✅ ¿Qué mejora?:

  • El enlace solo se activa cuando el usuario retira el dedo.
  • Si el usuario cambia de idea antes de soltar, puede evitar la navegación.

Ejemplo correcto: Solución ideal

Este código garantiza que la acción solo se ejecute cuando el usuario suelta el botón (up-event), además de permitir una opción de cancelación si el usuario cambia de opinión antes de soltar.

<button id=»cerrar» type=»button»>Cerrar</button>

<script>
let isPressed = false;

document.getElementById(«cerrar»).addEventListener(«mousedown», function() {
isPressed = true; // Marcar que el botón fue presionado
});

document.getElementById(«cerrar»).addEventListener(«mouseleave», function() {
isPressed = false; // Cancelar la acción si el cursor sale del botón
});

document.getElementById(«cerrar»).addEventListener(«mouseup», function() {
if (isPressed) {
closeForm();
}
});

function closeForm() {
alert(«El formulario se ha cerrado.»);
}
</script>

✅ ¿Qué mejora?:

  • Solo ejecuta la acción en el up-event (cuando se suelta el clic o el toque).
  • Si el usuario cambia de idea y mueve el cursor fuera del botón, la acción no ocurre.
  • Evita activaciones accidentales y mejora la accesibilidad para todos los usuarios.

Este enfoque asegura que el control sea más predecible y fácil de usar, cumpliendo con el Criterio de Conformidad 2.5.2 de WCAG 2.1

Errores comunes y cómo evitarlos

Errores frecuentes:

  1. Usar mousedown, pointerdown o touchstart para activar acciones críticas.
  2. No proporcionar una opción de cancelación o deshacer.
  3. Asumir que todos los usuarios interactúan con la misma precisión.

Cómo evitar estos errores:

  • Usar mouseup o touchend para activar controles.
  • Implementar un mecanismo para deshacer acciones accidentales.
  • Diseñar botones y enlaces con un área táctil suficiente.

Preguntas frecuentes

¿Por qué es un problema activar controles en «down-event»?

Porque puede provocar activaciones accidentales sin opción de cancelación, afectando la accesibilidad.

¿Cuándo está permitido usar el evento de bajada (down-event)?

Cuando es esencial para la funcionalidad, como en teclados virtuales o juegos que requieren respuesta inmediata.

¿Cómo pruebo si mi sitio tiene este problema?

Prueba presionar y mantener un botón sin soltar y verifica si la acción se ejecuta inmediatamente.

¿Cómo soluciono este problema en mi código?

Usando mouseup o touchend en lugar de mousedown o touchstart.

¿Este problema afecta a usuarios con discapacidad?

Sí, especialmente a quienes tienen dificultades motoras o utilizan tecnología asistiva.

¿Puedo usar mousedown y cumplir con WCAG?

Sí, pero solo si implementas una opción de cancelación o deshacer la acción.

Recursos relacionados

Pruebas y validación

Procedimiento

  • Abre la página en un dispositivo con pantalla táctil o con un mouse.
  • Pulsa un botón o enlace sin soltar inmediatamente.
  • Observa si la acción se ejecuta antes de soltar el clic o el toque.
  • Suelta el botón o levanta el dedo y revisa si la acción ocurre en este momento.
  • Intenta deslizar el cursor o el dedo fuera del control antes de soltar.

Resultados esperados

  • ✅ Si la acción solo ocurre cuando el usuario suelta el control (up-event) o se proporciona una opción de cancelación, el contenido cumple con WCAG 2.1.
  • ❌ Si la acción se ejecuta inmediatamente al presionar (down-event) y no hay forma de cancelarla, el contenido falla el criterio 2.5.2 y debe corregirse.

El fallo F101 afecta la accesibilidad y usabilidad de una web, especialmente para usuarios con dificultades motoras. Implementar eventos de activación en up-event y ofrecer mecanismos de cancelación mejora la experiencia de todos.

¿Tu web cumple con este criterio?
Si necesitas ayuda con la accesibilidad de tu sitio, contáctanos y te ayudaremos a mejorar la experiencia 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.