Requires that pointer actions are not executed on the down-event, or can be aborted, undone or reversed, so mistakes can be cancelled.
People with tremors, limited dexterity or low vision often touch the wrong thing. If the action fires the instant the finger lands, there is no chance to take it back. If it fires when the finger lifts, they can slide away and cancel.
This criterion requires that for functionality that can be operated with a single pointer, at least one of four things is true: the down-event does not execute any part of the function, completion happens on the up-event and can be aborted or undone, the up-event reverses the down-event, or completing the function on the down-event is essential.
People with tremors or limited dexterity, who often press the wrong control. People with low vision or cognitive disabilities who press a control by mistake. People using touch screens, trackballs or head pointers, where accidental contact is common. Anyone who touches a control and then realises it was the wrong one.
The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. Protection against accidental activation is part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.5.2 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.5.2 | Web pages | Web content must satisfy WCAG success criterion 2.5.2. |
| 10.2.5.2 | Non-web documents (PDF, Office files) | Documents must meet the same rule where the standard applies the criterion to them. |
| 11.2.5.2 | Non-web software (native mobile apps) | Software must let users cancel a pointer action before it is completed. |
Whether and how the criterion applies to non-web documents is stated in clause 10 of the standard. Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality. Check the exact numbers in the standard when you cite them.
Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 2.5.2 is the same in WCAG 2.1 and 2.2.
A note on EAA scope: Article 2(4) of the Directive excludes certain content from the requirements, for example office file formats published before 28 June 2025 and archives that are not updated after that date. Content you publish or change after that date is not covered by these exclusions.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
click fires on the up-event and also works with keyboard and touch. It is the simplest way to comply.
<div onmousedown="buy()">Buy now</div><button type="button" onclick="buy()">Buy now</button>Running the action on the down-event leaves no chance to cancel.
btn.addEventListener("pointerdown", submitOrder);btn.addEventListener("click", submitOrder); // fires on releaseLet users abort a drag, for example by pressing Escape or by dropping the item back in its original place (G210).
document.addEventListener("pointerup", dropItem); // no way to cancellet dragging = false;
document.addEventListener("keydown", e => {
if (e.key === "Escape" && dragging) { cancelDrag(); dragging = false; }
});
document.addEventListener("pointerup", () => {
if (dragging) { dropItem(); dragging = false; }
});If the action completes on the up-event, an undo option is an acceptable safety net.
deleteBtn.addEventListener("click", () => remove(item)); // gone for gooddeleteBtn.addEventListener("click", () => {
remove(item);
showToast("Item deleted", { action: "Undo", onAction: () => restore(item) });
});If something happens on the down-event, make the up-event reverse it. For example a preview shown while the button is held, hidden on release.
btn.addEventListener("pointerdown", () => openPreview()); // stays openbtn.addEventListener("pointerdown", () => showPreview());
btn.addEventListener("pointerup", () => hidePreview());A virtual keyboard key may act on the down-event, because it emulates a key press, which is essential.
/* Using the down-event for an ordinary button */key.addEventListener("pointerdown", () => typeCharacter(key.dataset.char));
// Emulates a key press, so the down-event is acceptable hereOn mobile, standard buttons fire when the finger lifts inside the control, so a user can slide off to cancel. Custom touch handlers that fire on touch-down break this.
import SwiftUI
struct BuyButton: View {
var body: some View {
// Button fires on touch-up inside, so sliding the finger away cancels it
Button("Buy now") { buy() }
// Avoid: acting on the first touch
// Text("Buy now").gesture(DragGesture(minimumDistance: 0).onChanged { _ in buy() })
}
}import androidx.compose.foundation.clickable
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@Composable
fun BuyButton() {
// Button and clickable fire on release, so sliding off cancels the action
Button(onClick = { buy() }) { Text("Buy now") }
// Avoid: pointerInput { detectTapGestures(onPress = { buy() }) }
// onPress runs on the down-event.
}mousedown, pointerdown, touchstart and onPress handlers that execute a function.mousedown or touchstart for buttons: The classic failure (F101).button: You lose the native up-event behaviour.