Criterios de éxito de las WCAG · Level A
WCAG 2.5.2: Cancelación de puntero
WCAG 2.5.2 requiere que la funcionalidad activada por un único puntero (ratón, toque o lápiz óptico) pueda cancelarse o revertirse, evitando activaciones accidentales. Esto protege a las personas usuarias con discapacidades motoras que pueden tocar o hacer clic de manera involuntaria.
Qué Significa Esta Regla
WCAG 2.5.2 Cancelación de Puntero se aplica a toda funcionalidad que se opera usando un único puntero; esto incluye clics de ratón, toques en pantallas táctiles, presiones con lápiz óptico y cualquier otro dispositivo de entrada que active un punto en la pantalla. Este criterio existe para garantizar que las activaciones accidentales causadas por una pulsación o toque no intencional puedan deshacerse antes de que surtan efecto.
Para que una interacción de un solo puntero cumpla con este criterio, debe satisfacer al menos una de las siguientes cuatro condiciones definidas por la especificación WCAG:
- Sin evento de pulsación (down-event): La funcionalidad no se activa en el evento de pulsación (por ejemplo,
mousedown,touchstartopointerdown). La activación ocurre solo en el evento de liberación (up-event) (mouseup,touchendopointerup). - Abortar o deshacer: Hay un mecanismo disponible para abortar la acción antes de que se complete, o para deshacer la acción después de que se haya completado.
- Reversión en el evento de liberación: El evento de liberación revierte cualquier resultado que se haya activado en el evento de pulsación; por ejemplo, un arrastre que vuelve a su posición original si el puntero se suelta fuera del objetivo.
- Excepción esencial: Activar en el evento de pulsación es esencial para la funcionalidad; por ejemplo, un teclado de piano en pantalla donde el sonido debe comenzar en el momento en que se presiona la tecla. Sin embargo, esta excepción es muy limitada y se aplica solo cuando el momento del evento de pulsación es fundamentalmente necesario.
En términos prácticos de HTML y JavaScript, esto significa que las personas desarrolladoras deben tener cuidado con dónde adjuntan los listeners de eventos. Usar mousedown, touchstart o pointerdown para ejecutar de forma inmediata e irreversible una acción —como enviar un formulario, eliminar un registro o navegar fuera de una página— sin proporcionar ninguna forma de cancelar o deshacer esa acción es un incumplimiento claro de este criterio. El comportamiento estándar del navegador para los elementos nativos <button> y <a> ya dispara la activación en el evento de liberación de forma predeterminada, lo que significa que los controles nativos correctamente implementados generalmente cumplen este criterio sin esfuerzo adicional.
Los componentes interactivos personalizados construidos con JavaScript —como interfaces de arrastrar y soltar, controles deslizantes basados en gestos, controles de carrusel y mapas de imagen— son las fuentes de fallo más comunes. Cualquier componente que vincule lógica irreversible a un listener de evento de pulsación sin proporcionar cancelación o reversión incumple este criterio.
Por Qué Importa
La Cancelación de Puntero es principalmente un criterio diseñado para proteger a las personas usuarias con discapacidades motoras, pero sus beneficios se extienden a una amplia gama de usuarios, incluidas aquellas con temblores, espasticidad, control motor fino limitado o discapacidades cognitivas que afectan la atención y la precisión.
Considere a una persona usuaria con enfermedad de Parkinson que navega por una página de pago de comercio electrónico en una pantalla táctil. Su temblor de mano puede hacer que su dedo caiga sobre un botón de “Confirmar compra” que no tenía intención de tocar. Si la compra se activa en el momento en que el dedo toca la pantalla —en el evento touchstart— la transacción se procesa inmediatamente sin oportunidad de cancelación. Si la activación se hubiera vinculado al evento touchend, la persona usuaria podría deslizar el dedo fuera del botón antes de levantarlo, cancelando la acción. Esta simple diferencia entre vincular a un evento de liberación o a uno de pulsación puede significar la diferencia entre una experiencia frustrante y una experiencia accesible para millones de personas usuarias.
Según la Organización Mundial de la Salud, aproximadamente 1.3 mil millones de personas en todo el mundo viven con algún tipo de discapacidad, y las discapacidades motoras representan una parte significativa de esa población. Más allá de la discapacidad, las activaciones accidentales son una frustración común para cualquier persona usuaria en un dispositivo de pantalla táctil pequeño, lo que hace que este criterio también sea relevante para la usabilidad general.
La discapacidad cognitiva es otra consideración importante. Las personas usuarias que procesan la información más lentamente pueden presionar un botón y luego darse cuenta de que seleccionaron la opción equivocada. Si la acción es irreversible —activada en el evento de pulsación— no tienen recurso alguno. Un mecanismo de deshacer o la activación en el evento de liberación les da a estas personas el tiempo que necesitan para confirmar su intención.
Desde una perspectiva empresarial, reducir los envíos accidentales de formularios, compras y eliminaciones mejora la satisfacción de las personas usuarias, reduce las solicitudes de soporte y disminuye las tasas de abandono de transacciones. Un modelo de interacción con puntero accesible también reduce el riesgo de responsabilidad legal bajo las regulaciones de accesibilidad en Turquía e internacionalmente.
Reglas Relacionadas de Axe-core
WCAG 2.5.2 requiere pruebas manuales y no puede evaluarse de forma fiable solo mediante escáneres automáticos de accesibilidad. Ninguna regla automatizada específica de axe-core se asigna directamente a este criterio. He aquí por qué la detección automatizada es insuficiente:
- Por qué la automatización falla para la cancelación de puntero: Las herramientas automatizadas como axe-core pueden analizar HTML y detectar ciertos problemas de ARIA o estructurales, pero no pueden determinar de forma fiable la intención semántica y la reversibilidad de los manejadores de eventos de JavaScript. Una herramienta podría detectar que existe un listener de evento
mousedownen un elemento, pero no puede determinar si ese listener activa una acción irreversible, si hay un mecanismo de deshacer presente en otra parte de la aplicación o si el momento del evento de pulsación es realmente esencial para la funcionalidad. La combinación de comportamiento en tiempo de ejecución, estado de la aplicación y contexto de la persona usuaria que se requiere para evaluar este criterio está más allá del alcance del análisis automatizado estático o basado en el DOM. - Qué deben buscar las personas probadoras manuales: Las personas probadoras deben interactuar con cada control interactivo usando un dispositivo apuntador y observar con precisión cuándo se dispara la acción: al presionar o al soltar. También deben verificar si deslizar el puntero fuera del elemento antes de soltar cancela la acción y si existe algún mecanismo de deshacer o abortar accesible después de la activación.
- Señales parciales de la automatización: Algunas herramientas de linting o reglas personalizadas de axe pueden marcar elementos con atributos
onmousedown,ontouchstartuonpointerdowncomo que requieren revisión, pero estas marcas requieren juicio humano para determinar la conformidad o la no conformidad. Trate cualquier marca automatizada de este tipo como un aviso para una investigación manual, no como un informe de fallo definitivo.
Cómo Probar
- Escaneo automatizado (revisión inicial): Ejecute axe DevTools o Lighthouse en la página para identificar elementos interactivos y cualquier enlace de eventos personalizados marcados para revisión manual. En Chrome DevTools, use el panel Elements para inspeccionar los listeners de eventos adjuntos a botones, enlaces y controles personalizados; busque manejadores
mousedown,touchstartopointerdownen elementos que activan acciones irreversibles. - Prueba con puntero de ratón — cancelación con clic y arrastre: Para cada botón, enlace y control personalizado interactivo en la página, presione y mantenga presionado el botón del ratón sobre el elemento, luego arrastre el puntero fuera del límite del elemento antes de soltar. Si la acción se dispara mientras el botón está presionado (antes de soltar), esto es un fallo. Si arrastrar hacia afuera evita que la acción se dispare al soltar, esto es un cumplimiento de las condiciones de reversión en el evento de liberación o de ausencia de evento de pulsación.
- Prueba en dispositivo táctil: En un dispositivo con pantalla táctil o emulador de navegador (modo dispositivo de Chrome DevTools), toque y mantenga presionado cada elemento interactivo, luego deslice el dedo hacia afuera antes de levantarlo. Si la acción se dispara inmediatamente al tocar (antes de levantar el dedo), esto es un fallo a menos que el momento del evento de pulsación sea esencial. Verifique que levantar el dedo fuera del elemento no active la acción.
- Verificación de control por teclado: Aunque este criterio se refiere específicamente a interacciones con puntero, verifique que todos los elementos interactivos también se puedan operar con el teclado. Presione
Tabpara enfocar cada elemento yEnteroSpacepara activarlo, confirmando que el elemento es alcanzable y funcional sin un puntero; esto respalda el panorama de accesibilidad más amplio. - Verificación del mecanismo de deshacer/abortar: Para acciones vinculadas a eventos de pulsación (donde puede aplicarse la excepción esencial), confirme que existe un mecanismo claro de deshacer o abortar y que es accesible para todas las personas usuarias, incluidas aquellas que usan tecnologías de asistencia. Por ejemplo, después de una acción de arrastrar y soltar, ¿hay un botón de “deshacer” accesible mediante teclado y lector de pantalla?
- Prueba combinada de lector de pantalla y puntero (NVDA + Firefox, JAWS + Chrome, VoiceOver + Safari): Active elementos interactivos usando tanto el puntero como el cursor virtual del lector de pantalla. Confirme que las acciones activadas por el puntero son coherentes con las activadas por el lector de pantalla y que no se disparan acciones inmediatas e irreversibles de forma inesperada.
- Revisión de código: Busque en la base de código enlaces de listeners de eventos:
addEventListener('mousedown',addEventListener('touchstart',addEventListener('pointerdown'y atributos en líneaonmousedown,ontouchstart. Para cada aparición, evalúe si el manejador activa una acción irreversible y si se cumple alguna de las cuatro condiciones de WCAG.
Cómo Corregir
Acción irreversible en mousedown — Incorrecto
<!-- FAIL: Delete fires immediately on mousedown, no cancellation possible -->
<button onmousedown='deleteRecord(recordId)'>Delete Record</button>
<script>
function deleteRecord(id) {
// Record is deleted immediately on button press, before the user releases
fetch('/api/records/' + id, { method: 'DELETE' });
}
</script>
Acción irreversible en mousedown — Correcto
<!-- PASS: Delete fires on click (up-event), native button behavior -->
<button onclick='deleteRecord(recordId)'>Delete Record</button>
<!-- Even better: provide confirmation dialog as an additional abort mechanism -->
<button onclick='confirmDelete(recordId)'>Delete Record</button>
<script>
function confirmDelete(id) {
// User can cancel via the dialog — satisfies the Abort or Undo condition
if (confirm('Are you sure you want to delete this record? This cannot be undone.')) {
fetch('/api/records/' + id, { method: 'DELETE' });
}
}
</script>
Gesto táctil se dispara en touchstart — Incorrecto
<!-- FAIL: Action fires immediately on touchstart, no opportunity to abort -->
<div id='buy-btn'>Buy Now</div>
<script>
document.getElementById('buy-btn').addEventListener('touchstart', function() {
// Purchase initiated immediately when finger touches the element
initiatePurchase();
});
</script>
Gesto táctil se dispara en touchstart — Correcto
<!-- PASS: Use a native button and bind to click, which fires on touchend -->
<button id='buy-btn'>Buy Now</button>
<script>
// The 'click' event on a native button fires on the up-event (touchend/mouseup)
// giving users the ability to cancel by sliding their finger away before releasing
document.getElementById('buy-btn').addEventListener('click', function() {
initiatePurchase();
});
</script>
Arrastrar y soltar personalizado sin reversión en el evento de liberación — Incorrecto
<!-- FAIL: Item is moved to new position on pointerdown, not on pointerup -->
<div class='draggable' onpointerdown='moveItemToTarget(this)'>
Drag me
</div>
Arrastrar y soltar personalizado con reversión en el evento de liberación — Correcto
<!-- PASS: Item moves to target only when pointer is released over the drop zone -->
<!-- If user drags away before releasing, item returns to original position -->
<div
class='draggable'
draggable='true'
ondragstart='handleDragStart(event)'
>
Drag me
</div>
<div
class='drop-zone'
ondragover='event.preventDefault()'
ondrop='handleDrop(event)'
aria-label='Drop zone'
>
Drop here
</div>
<script>
function handleDragStart(event) {
// Only records intent; does not move the item yet
event.dataTransfer.setData('text/plain', event.target.id);
}
function handleDrop(event) {
event.preventDefault();
// Item is moved only on drop (up-event equivalent)
// If user releases outside drop zone, item returns to origin — up-reversal satisfied
const id = event.dataTransfer.getData('text/plain');
event.currentTarget.appendChild(document.getElementById(id));
}
</script>
Errores Comunes
- Vincular acciones irreversibles como el envío de formularios, la eliminación de registros o la navegación a eventos
mousedownopointerdownen lugar declick, que se dispara en el evento de liberación y permite la cancelación arrastrando hacia afuera de forma predeterminada. - Usar
touchstartpara activar compras, confirmaciones o modificaciones de datos en interfaces de comercio electrónico o banca, donde un contacto momentáneo del dedo no debería tratarse como intención confirmada de la persona usuaria. - Asumir que, porque un botón usa un elemento nativo
<button>, todo el JavaScript adjunto a él es automáticamente conforme; un listenermousedownañadido medianteaddEventListenersigue incumpliendo este criterio si activa una acción irreversible. - Invocar diálogos modales, superposiciones u otros cambios de navegación de página completa en el evento de pulsación de un puntero, lo que desorienta a las personas usuarias que no tenían intención de activar el control y no tienen forma de revertir el curso.
- Implementar controles deslizantes o de rango personalizados que confirman un valor en el servidor en
pointerdownen lugar de esperar apointerupo a una acción de confirmación separada. - Confiar en el diálogo
confirm()predeterminado del navegador como único mecanismo de deshacer para una acción de evento de pulsación sin probar si las tecnologías de asistencia pueden acceder y operar de forma fiable el diálogo antes de que se complete la acción destructiva. - No proporcionar ningún feedback visual o programático de que una acción de evento de pulsación está pendiente, lo que hace imposible que las personas usuarias entiendan que podrían abortar moviendo el puntero fuera antes de soltar.
- Tratar la excepción esencial de forma demasiado amplia; por ejemplo, afirmar que un botón de “compra rápida” necesita activarse en
mousedownpor motivos de velocidad, cuando no existe ninguna restricción de tiempo genuina y la afirmación es una conveniencia de producto más que una necesidad funcional. - No realizar pruebas tanto en dispositivos de entrada de ratón como táctiles; una interfaz puede usar correctamente eventos de liberación para interacciones con ratón pero seguir vinculando acciones irreversibles a
touchstarten una ruta de código específica para móviles. - Implementar funcionalidad de deshacer que solo es accesible mediante atajo de teclado (por ejemplo, Ctrl+Z) sin proporcionar un control equivalente en pantalla, dejando a las personas usuarias que solo usan puntero sin un mecanismo de cancelación después de una activación en evento de pulsación.
Relación con las Regulaciones de Accesibilidad de Turquía
La Circular Presidencial 2025/10 de Turquía, publicada en el Boletín Oficial n.º 32933 el 21 de junio de 2025, establece requisitos obligatorios de accesibilidad web alineados con los estándares WCAG 2.2. En virtud de esta circular, el cumplimiento de los criterios de Nivel A —incluido WCAG 2.5.2 Cancelación de Puntero— es legalmente obligatorio para una amplia gama de entidades públicas y privadas que operan servicios digitales en Turquía.
La circular abarca un amplio espectro de organizaciones. Las instituciones públicas y los organismos gubernamentales deben lograr el cumplimiento total de Nivel A en el plazo de un año a partir de la fecha de publicación de la circular. Las entidades del sector privado cubiertas por la regulación —incluidas plataformas de comercio electrónico, bancos e instituciones financieras, hospitales y proveedores de atención sanitaria, empresas de telecomunicaciones con 200,000 o más suscriptores, agencias de viajes, empresas de transporte privado y escuelas privadas autorizadas por el Ministerio de Educación Nacional (MoNE)— disponen de un plazo de dos años para cumplir.
Para estas entidades cubiertas, no implementar correctamente la Cancelación de Puntero conlleva un riesgo regulatorio real. Considere una plataforma turca de comercio electrónico cuya página de pago móvil active la confirmación de pago en touchstart; tal implementación constituiría una violación directa de WCAG 2.5.2 y, por extensión, de la Circular Presidencial. Las personas usuarias que inicien accidentalmente una compra en esa plataforma debido a un temblor, una discapacidad motora o un simple toque erróneo tendrían base legal para afirmar que la plataforma incumplió sus obligaciones de accesibilidad.
Más allá del cumplimiento normativo, las organizaciones turcas deberían reconocer que la Cancelación de Puntero no es simplemente una casilla técnica que marcar, sino un principio de diseño fundamental que protege la capacidad de las personas usuarias para interactuar de forma segura e intencional con los servicios digitales. Implementar la activación en el evento de liberación y mecanismos de deshacer en todos los componentes interactivos —desde carritos de compra y sistemas de reserva de citas hasta herramientas de gestión de documentos— demuestra un compromiso con el diseño inclusivo que beneficia a todas las personas usuarias, no solo a aquellas con discapacidad.
Las organizaciones sujetas a la circular deberían realizar auditorías sistemáticas de sus patrones de manejo de eventos de JavaScript, especialmente en páginas optimizadas para móviles y componentes interactivos personalizados, para identificar y remediar cualquier activación en eventos de pulsación que carezca de mecanismos de cancelación o reversión. Documentar estos esfuerzos de remediación también respaldará las obligaciones de reporte de conformidad que puedan requerirse en virtud de las disposiciones de aplicación de la circular.
Fuentes y referencias
- W3C Understanding 2.5.2 Pointer Cancellation
- W3C Techniques for 2.5.2 Pointer Cancellation
- W3C Technique G212: Using native controls to ensure functionality is triggered on the up-event
- MDN: Pointer events
- MDN: Element: click event
- WebAIM: Motor Disabilities and Pointer Accessibility
- Deque University: Pointer Cancellation Overview
