Technique F101:Failure of Success Criterion 2.5.2 due to activating a control on the down-event
Applicability
All technologies that include interactive controls that can be triggered using a pointer.
This technique relates to 2.5.2: Pointer Cancellation (Failure).
Description
The objective of this Failure is to describe situations where:
- Controls are set to activate functionality on the down-event of a pointer;
- No further mechanism to abort or undo is available;
- The up-event does not reverse the outcome of the activation;
- It is not essential for the functionality to execute and complete on the down-event.
Rather than taking advantage of the click
event, authors may use down-events such as mousedown
, touchstart
or pointerdown
. As a result, functionality will be executed as soon as a mouse button is pressed
(but not released yet), or a finger or stylus makes contact with a touchscreen.
It is possible to use the down event and mitigate potential issues to avoid failing the Success Criterion. For example, provide a method to easily undo or abort the functionality, or reverse the outcome on the up-event (when the mouse button is released, or when the finger or stylus are lifted from the touchscreen). And note that some uses of the down-event are essential for the functionality (e.g., where the control simulates the operation of a musical instrument like a set of piano keys, or when the control is used as an on-screen control for a game where a fast and immediate response is required), in which case they would not fail this Success Criterion.
The test procedure outlined below could be supplemented with automated or semi-automated
tests to scan for JavaScript that registers event listeners such as mousedown
, touchstart
, or pointerdown
. The automated test would not be sufficient to make a pass/fail determination, but
it can help narrow down the number of potentially problematic controls.
Examples
Example 1: A close button that triggers on down-events
A modal dialog contains a lengthy form that a user needs to complete. The modal provides
a simple "Close" control that closes the dialog and loses all information the user
may already have entered in the form. However, instead of simply listening to the
click
event - which in most user agents is triggered on the up-event - the author decided
to close the dialog on the down-event. This may lead to the user accidentally closing
the dialog and losing all the data they entered into the form up to that point.
...
<button id="close">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);
Tests
Procedure
Open the content on a device with pointer inputs (mouse, touchscreen, stylus) and for all available controls (buttons, links, complex widgets):
- Trigger down-events (e.g. by pressing but not releasing the mouse button, or placing a finger or stylus on the touchscreen) and check if functionality is executed prior to the up-event (e.g. releasing the mouse button or lifting the finger/stylus)
- If functionality was executed on the down-event, check if triggering the up-event (releasing the pressed mouse button, or lifing the finger or stylus from the touchscreen) reverses the outcome
- Evaluate if it could be deemed essential for the controls to execute and complete functionality on the down-event
Expected Results
- If #1 is true, and #2 and #3 are false then the content fails the Success Criterion.