Addaw, ir a inicio Donar

Fallo común WCAG 2.2

F101Botones que actúan nada más pulsar, sin esperar a soltar

Nombre oficial en el W3C: Fallo del criterio de conformidad 2.5.2 debido a activar una función en el evento de pulsación (down-event) cuando no es esencial

En pocas palabras

El error es que un botón o un enlace haga su acción en cuanto se pulsa el ratón o se toca la pantalla, antes de soltar. Así no hay forma de echarse atrás a tiempo. La acción debe ocurrir al soltar, o poder deshacerse con facilidad.

Por qué es importante

Con el evento habitual, click, quien pulsa por error puede apartar el dedo o el puntero antes de soltar. Entonces la acción no se hace. Si la acción salta al pulsar, esa salida desaparece.

Afecta sobre todo a personas con temblores, poca precisión en las manos o baja visión, que tocan sin querer el control equivocado. También a cualquiera que use el móvil en el autobús. Un toque accidental puede cerrar un formulario largo y perder todo lo escrito.

Cómo evitarlo

  1. Use el evento click para activar botones y enlaces. Se dispara al soltar y también funciona con el teclado.
  2. Evite lanzar acciones con mousedown, touchstart o pointerdown.
  3. Si necesita uno de esos eventos, haga que soltar fuera del control cancele la acción. O permita deshacerla con facilidad.
  4. Empezar a arrastrar al pulsar está bien si, al soltar fuera de un destino válido, todo vuelve a su sitio.
  5. Actuar al pulsar solo es aceptable cuando es imprescindible. Por ejemplo, en un instrumento musical en pantalla o en una prueba de tiempo de reacción.

Cómo comprobarlo

  1. Con el ratón, pulsar cada botón, enlace o control sin soltar. Ver si la acción ya ha ocurrido.
  2. Si ha ocurrido, soltar y comprobar si se deshace. Probar también a apartar el puntero antes de soltar.
  3. Repetir en una pantalla táctil, apoyando el dedo sin levantarlo.
  4. Como ayuda, buscar en el JavaScript mousedown, touchstart o pointerdown. No basta para decidir, pero señala qué controles revisar.
  5. Hay fallo si la acción se completa al pulsar, no se puede deshacer y no es imprescindible.

Ejemplo

El mismo botón «Cerrar» de un formulario, escuchando un evento incorrecto y uno correcto.

// Incorrecto: se cierra al pulsar, antes de soltar
botonCerrar.addEventListener('pointerdown', cerrarFormulario);

// Correcto: se cierra al soltar y funciona con teclado
botonCerrar.addEventListener('click', cerrarFormulario);
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 F101 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

Todas las tecnologías que incluyen controles interactivos que pueden activarse mediante un puntero.

Descripción

El objetivo de este fallo es describir las situaciones en las que:

  1. los controles están configurados para activar una función en el evento de pulsación (down-event) de un puntero;
  2. no se dispone de ningún mecanismo adicional para abortar o deshacer;
  3. el evento de liberación (up-event) no revierte el resultado de la activación;
  4. no es esencial que la función se ejecute y complete en el evento de pulsación.

En lugar de aprovechar el evento click, los autores pueden usar eventos de pulsación como mousedown, touchstart o pointerdown. Como consecuencia, la función se ejecutará en cuanto se pulse un botón del ratón (aunque aún no se haya soltado), o en cuanto un dedo o un lápiz óptico entren en contacto con la pantalla táctil.

Es posible usar el evento de pulsación y mitigar los posibles problemas para evitar fallar el criterio de conformidad. Por ejemplo, ofrecer un método para deshacer o abortar la función con facilidad, o revertir el resultado en el evento de liberación (cuando se suelta el botón del ratón, o cuando el dedo o el lápiz óptico se levantan de la pantalla táctil). Y téngase en cuenta que algunos usos del evento de pulsación son esenciales para la función (por ejemplo, cuando el control simula el funcionamiento de un instrumento musical, como un conjunto de teclas de piano, o cuando el control se usa como control en pantalla de un juego que requiere una respuesta rápida e inmediata), en cuyo caso no fallarían este criterio de conformidad.

El procedimiento de prueba que se describe a continuación podría complementarse con pruebas automáticas o semiautomáticas que busquen código JavaScript que registre escuchadores de eventos como mousedown, touchstart o pointerdown. La prueba automática no sería suficiente para determinar si el contenido cumple o falla, pero puede ayudar a reducir el número de controles potencialmente problemáticos.

Ejemplos

Un botón de cerrar que se activa en los eventos de pulsación

Un diálogo modal contiene un formulario extenso que el usuario debe completar. El modal ofrece un sencillo control «Close» (cerrar) que cierra el diálogo y pierde toda la información que el usuario ya haya introducido en el formulario. Sin embargo, en lugar de limitarse a escuchar el evento click (que en la mayoría de los agentes de usuario se dispara en el evento de liberación), el autor decidió cerrar el diálogo en el evento de pulsación. Esto puede provocar que el usuario cierre el diálogo por accidente y pierda todos los datos que había introducido en el formulario hasta ese momento.

<!-- modal dialog with a form -->
...
<button id="close" type="button">Close</button>
...
const trigger = document.getElementById("close");
function closeDialog() {
  /* close the modal dialog */
  ...
}
trigger.addEventListener('mousedown', closeDialog);
trigger.addEventListener('touchstart', closeDialog);
trigger.addEventListener('pointerdown', closeDialog);

Pruebas

Procedimiento

Abrir el contenido en un dispositivo con entradas de puntero (ratón, pantalla táctil, lápiz óptico) y, para todos los controles disponibles (botones, enlaces, componentes complejos):

  1. Provocar eventos de pulsación (por ejemplo, pulsando sin soltar el botón del ratón, o apoyando un dedo o el lápiz óptico en la pantalla táctil) y comprobar si la función se ejecuta antes del evento de liberación (por ejemplo, soltar el botón del ratón o levantar el dedo o el lápiz óptico).
  2. Si la función se ejecutó en el evento de pulsación, comprobar si provocar el evento de liberación (soltar el botón del ratón pulsado, o levantar el dedo o el lápiz óptico de la pantalla táctil) revierte el resultado.
  3. Evaluar si podría considerarse esencial que los controles ejecuten y completen la función en el evento de pulsación.

Resultados esperados

  • Si la comprobación n.º 1 es verdadera, y las comprobaciones n.º 2 y n.º 3 son falsas, entonces el contenido falla el criterio de conformidad.

Cómo lo comprobamos en ADDAW

Este error es uno de los que buscamos en cada auditoría de ADDAW. Se lo entregamos con capturas y la forma de corregirlo.

Solicitar una auditoría

Basado en la técnica F101 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.