Kryteria sukcesu WCAG · Level A

WCAG 2.5.2: Anulowanie wskaźnika

WCAG 2.5.2 wymaga, aby funkcjonalność wywoływana pojedynczym wskaźnikiem (myszą, dotykiem lub rysikiem) mogła zostać anulowana lub odwrócona, zapobiegając przypadkowym aktywacjom. Chroni to użytkowników z niepełnosprawnościami ruchowymi, którzy mogą przypadkowo stuknąć lub kliknąć.

Co oznacza ta zasada

WCAG 2.5.2 Pointer Cancellation ma zastosowanie do całej funkcjonalności obsługiwanej za pomocą pojedynczego wskaźnika — obejmuje to kliknięcia myszą, stuknięcia na ekranie dotykowym, naciski rysikiem oraz każde inne urządzenie wejściowe, które aktywuje punkt na ekranie. Kryterium to istnieje po to, aby zapewnić możliwość cofnięcia przypadkowych aktywacji spowodowanych niezamierzonym naciśnięciem lub stuknięciem, zanim odniosą skutek.

Aby interakcja z użyciem pojedynczego wskaźnika spełniała to kryterium, musi spełniać co najmniej jeden z czterech warunków zdefiniowanych w specyfikacji WCAG:

  • Brak zdarzenia „down”: Funkcjonalność nie jest wyzwalana w momencie zdarzenia „down” (np. mousedown, touchstart lub pointerdown). Aktywacja następuje wyłącznie przy zdarzeniu „up” (mouseup, touchend lub pointerup).
  • Przerwanie lub cofnięcie: Dostępny jest mechanizm umożliwiający przerwanie działania przed jego zakończeniem lub cofnięcie działania po jego zakończeniu.
  • Odwrócenie przy zdarzeniu „up”: Zdarzenie „up” odwraca każdy skutek wywołany przez zdarzenie „down” — na przykład przeciągnięcie, które wraca na miejsce, jeśli wskaźnik zostanie zwolniony poza celem.
  • Wyjątek „istotne”: Wyzwalanie przy zdarzeniu „down” jest istotne dla funkcjonalności — na przykład klawiatura pianina na ekranie, gdzie dźwięk musi rozpocząć się w momencie naciśnięcia klawisza. Ten wyjątek jest jednak bardzo wąski i ma zastosowanie tylko wtedy, gdy moment zdarzenia „down” jest fundamentalnie konieczny.

W praktycznych kategoriach HTML i JavaScript oznacza to, że programiści muszą uważać, gdzie podpinają nasłuchiwacze zdarzeń. Używanie mousedown, touchstart lub pointerdown do natychmiastowego i nieodwracalnego wykonania działania — takiego jak wysłanie formularza, usunięcie rekordu czy przejście na inną stronę — bez zapewnienia możliwości anulowania lub cofnięcia tego działania jest wyraźnym naruszeniem tego kryterium. Standardowe zachowanie przeglądarki dla natywnych elementów <button> i <a> domyślnie wyzwala aktywację przy zdarzeniu „up”, co oznacza, że poprawnie zaimplementowane natywne kontrolki zazwyczaj spełniają to kryterium bez dodatkowego wysiłku.

Najczęstszym źródłem naruszeń są niestandardowe komponenty interaktywne zbudowane w JavaScript — takie jak interfejsy „przeciągnij i upuść”, suwaki oparte na gestach, kontrolki karuzeli i mapy obrazkowe. Każdy komponent, który wiąże nieodwracalną logikę z nasłuchiwaczem zdarzenia „down” bez zapewnienia mechanizmu anulowania lub odwrócenia, nie spełnia tego kryterium.

Dlaczego to ma znaczenie

Pointer Cancellation jest przede wszystkim kryterium zaprojektowanym w celu ochrony użytkowników z niepełnosprawnościami ruchowymi, ale jego korzyści obejmują szeroką grupę użytkowników, w tym osoby z drżeniem, spastycznością, ograniczoną precyzją ruchów lub niepełnosprawnościami poznawczymi wpływającymi na uwagę i precyzję.

Wyobraźmy sobie użytkownika z chorobą Parkinsona, który porusza się po stronie z procesem zakupowym e-commerce na ekranie dotykowym. Drżenie ręki może spowodować, że jego palec wyląduje na przycisku „Potwierdź zakup”, którego nie zamierzał stuknąć. Jeśli zakup jest wyzwalany w momencie, gdy palec dotknie ekranu — przy zdarzeniu touchstart — transakcja jest natychmiast przetwarzana bez możliwości anulowania. Gdyby aktywacja była powiązana ze zdarzeniem touchend, użytkownik mógłby przesunąć palec poza przycisk przed jego podniesieniem, anulując działanie. Ta prosta różnica między powiązaniem ze zdarzeniem „up” a „down” może oznaczać różnicę między frustrującym a dostępnym doświadczeniem dla milionów użytkowników.

Zgodnie z danymi Światowej Organizacji Zdrowia około 1,3 miliarda ludzi na całym świecie żyje z jakąś formą niepełnosprawności, a niepełnosprawności ruchowe stanowią znaczną część tej populacji. Poza niepełnosprawnością, przypadkowe aktywacje są częstym źródłem frustracji dla każdego użytkownika małego urządzenia z ekranem dotykowym, co sprawia, że to kryterium jest istotne także dla ogólnej użyteczności.

Niepełnosprawność poznawcza to kolejny ważny aspekt. Użytkownicy, którzy przetwarzają informacje wolniej, mogą nacisnąć przycisk, a następnie zdać sobie sprawę, że wybrali niewłaściwą opcję. Jeśli działanie jest nieodwracalne — wyzwalane przy zdarzeniu „down” — nie mają żadnej możliwości reakcji. Mechanizm cofania lub aktywacja przy zdarzeniu „up” daje tym użytkownikom czas potrzebny na potwierdzenie zamiaru.

Z perspektywy biznesowej ograniczenie przypadkowego wysyłania formularzy, zakupów i usunięć poprawia satysfakcję użytkowników, zmniejsza liczbę zgłoszeń do działu wsparcia i obniża wskaźniki porzucania transakcji. Dostępny model interakcji wskaźnikiem zmniejsza również ryzyko odpowiedzialności prawnej wynikającej z przepisów dotyczących dostępności w Turcji i na arenie międzynarodowej.

Powiązane reguły Axe-core

WCAG 2.5.2 wymaga testów manualnych i nie może być wiarygodnie ocenione wyłącznie przez automatyczne skanery dostępności. Żadna konkretna zautomatyzowana reguła axe-core nie odwzorowuje bezpośrednio tego kryterium. Oto dlaczego automatyczne wykrywanie jest niewystarczające:

  • Dlaczego automatyzacja zawodzi w przypadku pointer cancellation: Narzędzia automatyczne, takie jak axe-core, potrafią analizować HTML i wykrywać określone problemy związane z ARIA lub strukturą, ale nie są w stanie wiarygodnie określić intencji semantycznej i odwracalności obsługi zdarzeń JavaScript. Narzędzie może wykryć, że na elemencie istnieje nasłuchiwacz zdarzenia mousedown, ale nie jest w stanie ustalić, czy ten nasłuchiwacz wyzwala nieodwracalne działanie, czy mechanizm cofania jest dostępny w innym miejscu aplikacji, ani czy moment zdarzenia „down” jest rzeczywiście istotny dla funkcjonalności. Połączenie zachowania w czasie wykonywania, stanu aplikacji i kontekstu użytkownika wymaganego do oceny tego kryterium wykracza poza zakres statycznej lub opartej na DOM analizy automatycznej.
  • Na co muszą zwracać uwagę testerzy manualni: Testerzy muszą wchodzić w interakcję z każdą kontrolką interaktywną za pomocą urządzenia wskazującego i dokładnie obserwować, kiedy działanie jest wyzwalane — przy naciśnięciu czy przy zwolnieniu. Muszą również sprawdzić, czy przesunięcie wskaźnika poza element przed zwolnieniem anuluje działanie oraz czy po aktywacji dostępny jest mechanizm cofania lub przerwania.
  • Częściowe sygnały z automatyzacji: Niektóre narzędzia lintujące lub niestandardowe reguły axe mogą oznaczać elementy z atrybutami onmousedown, ontouchstart lub onpointerdown jako wymagające przeglądu, ale te oznaczenia wymagają oceny przez człowieka, aby określić zgodność lub jej brak. Traktuj każde takie automatyczne oznaczenie jako sygnał do manualnego zbadania, a nie jako ostateczny raport o błędzie.

Jak testować

  1. Skan automatyczny (wstępny przegląd): Uruchom axe DevTools lub Lighthouse na stronie, aby zidentyfikować elementy interaktywne i wszelkie niestandardowe powiązania zdarzeń oznaczone do manualnego przeglądu. W Chrome DevTools użyj panelu Elements, aby sprawdzić nasłuchiwacze zdarzeń podpięte do przycisków, linków i niestandardowych kontrolek — szukaj obsługi mousedown, touchstart lub pointerdown na elementach, które wyzwalają nieodwracalne działania.
  2. Test wskaźnika myszy — anulowanie przez kliknięcie i przeciągnięcie: Dla każdego interaktywnego przycisku, linku i niestandardowej kontrolki na stronie naciśnij i przytrzymaj przycisk myszy na elemencie, a następnie przeciągnij wskaźnik poza granice elementu przed zwolnieniem. Jeśli działanie jest wyzwalane, gdy przycisk jest wciśnięty (przed zwolnieniem), jest to błąd. Jeśli przeciągnięcie na zewnątrz zapobiega wyzwoleniu działania przy zwolnieniu, jest to wynik pozytywny dla warunków „up-reversal” lub „no-down-event”.
  3. Test na urządzeniu dotykowym: Na urządzeniu z ekranem dotykowym lub w emulatorze przeglądarki (tryb urządzenia w Chrome DevTools) stuknij i przytrzymaj każdy element interaktywny, a następnie przesuń palec na zewnątrz przed jego podniesieniem. Jeśli działanie jest wyzwalane natychmiast po dotknięciu (zanim podniesiesz palec), jest to błąd, chyba że moment zdarzenia „down” jest istotny. Sprawdź, czy podniesienie palca poza elementem nie wyzwala działania.
  4. Sprawdzenie obsługi klawiatury: Chociaż to kryterium dotyczy konkretnie interakcji wskaźnikiem, upewnij się, że wszystkie elementy interaktywne są również obsługiwalne z klawiatury. Naciśnij Tab, aby ustawić fokus na każdym elemencie, oraz Enter lub Space, aby go aktywować, potwierdzając, że element jest osiągalny i funkcjonalny bez wskaźnika — wspiera to szerszy obraz dostępności.
  5. Weryfikacja mechanizmu cofania/przerwania: Dla działań powiązanych ze zdarzeniami „down” (gdzie może mieć zastosowanie wyjątek „istotne”) potwierdź, że istnieje wyraźny mechanizm cofania lub przerwania i że jest on dostępny dla wszystkich użytkowników, w tym korzystających z technologii asystujących. Na przykład po akcji „przeciągnij i upuść” czy istnieje przycisk „cofnij” osiągalny z klawiatury i przez czytnik ekranu?
  6. Test kombinacji czytnika ekranu i wskaźnika (NVDA + Firefox, JAWS + Chrome, VoiceOver + Safari): Aktywuj elementy interaktywne zarówno za pomocą wskaźnika, jak i wirtualnego kursora czytnika ekranu. Potwierdź, że działania wyzwalane wskaźnikiem są spójne z działaniami wyzwalanymi przez czytnik ekranu i że żadne natychmiastowe, nieodwracalne działania nie są uruchamiane niespodziewanie.
  7. Przegląd kodu: Przeszukaj bazę kodu pod kątem powiązań nasłuchiwaczy zdarzeń: addEventListener('mousedown', addEventListener('touchstart', addEventListener('pointerdown' oraz atrybutów inline onmousedown, ontouchstart. Dla każdego wystąpienia oceń, czy obsługa zdarzenia wyzwala nieodwracalne działanie i czy spełniony jest którykolwiek z czterech warunków WCAG.

Jak naprawić

Nieodwracalne działanie przy mousedown — niepoprawne

<!-- 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>

Nieodwracalne działanie przy mousedown — poprawne

<!-- 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>

Gest dotykowy wyzwalany przy touchstart — niepoprawne

<!-- 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>

Gest dotykowy wyzwalany przy touchstart — poprawne

<!-- 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>

Niestandardowe przeciągnij-i-upuść bez odwrócenia przy „up” — niepoprawne

<!-- FAIL: Item is moved to new position on pointerdown, not on pointerup -->
<div class='draggable' onpointerdown='moveItemToTarget(this)'>
  Drag me
</div>

Niestandardowe przeciągnij-i-upuść z odwróceniem przy „up” — poprawne

<!-- 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>

Typowe błędy

  • Wiązanie nieodwracalnych działań, takich jak wysyłanie formularza, usuwanie rekordu czy nawigacja, ze zdarzeniami mousedown lub pointerdown zamiast click, które wyzwala się przy zdarzeniu „up” i domyślnie umożliwia anulowanie przez przeciągnięcie wskaźnika poza element.
  • Używanie touchstart do wyzwalania zakupów, potwierdzeń lub modyfikacji danych w interfejsach e-commerce lub bankowych, gdzie chwilowy kontakt palca nie powinien być traktowany jako potwierdzony zamiar użytkownika.
  • Zakładanie, że skoro przycisk używa natywnego elementu <button>, to cały JavaScript do niego podpięty jest automatycznie zgodny — nasłuchiwacz mousedown dodany przez addEventListener nadal narusza to kryterium, jeśli wyzwala nieodwracalne działanie.
  • Wywoływanie okien modalnych, nakładek lub zmian nawigacji na pełnoekranowej stronie przy zdarzeniu „down” wskaźnika, co dezorientuje użytkowników, którzy nie zamierzali aktywować kontrolki i nie mają możliwości wycofania się.
  • Implementowanie niestandardowych suwaków lub kontrolek zakresu, które zatwierdzają wartość na serwerze przy pointerdown, zamiast czekać na pointerup lub osobne działanie potwierdzające.
  • Poleganie na domyślnym oknie dialogowym przeglądarki confirm() jako jedynym mechanizmie cofania dla działania wyzwalanego przy zdarzeniu „down” bez przetestowania, czy technologie asystujące mogą wiarygodnie uzyskać dostęp do tego okna i je obsłużyć, zanim destrukcyjne działanie zostanie zakończone.
  • Brak zapewnienia jakiejkolwiek wizualnej lub programistycznej informacji zwrotnej, że działanie wyzwolone przy zdarzeniu „down” jest w toku, co uniemożliwia użytkownikom zrozumienie, że mogliby je przerwać, przesuwając wskaźnik poza element przed zwolnieniem.
  • Zbyt szerokie traktowanie wyjątku „istotne” — na przykład twierdzenie, że przycisk „szybki zakup” musi wyzwalać działanie przy mousedown ze względu na szybkość, podczas gdy nie istnieje żadne rzeczywiste ograniczenie czasowe, a argument dotyczy wygody produktu, a nie konieczności funkcjonalnej.
  • Brak testów zarówno na urządzeniach z myszą, jak i dotykowych — interfejs może poprawnie używać zdarzeń „up” dla interakcji z myszą, ale nadal wiązać nieodwracalne działania z touchstart w osobnej, mobilnej ścieżce kodu.
  • Implementowanie funkcji cofania dostępnej wyłącznie przez skrót klawiaturowy (np. Ctrl+Z) bez zapewnienia równoważnej kontrolki na ekranie, co pozostawia użytkowników korzystających wyłącznie ze wskaźnika bez mechanizmu anulowania po aktywacji przy zdarzeniu „down”.

Związek z tureckimi regulacjami dotyczącymi dostępności

Prezydencki okólnik Turcji 2025/10, opublikowany w Dzienniku Urzędowym nr 32933 w dniu 21 czerwca 2025 r., ustanawia obowiązkowe wymagania dotyczące dostępności stron internetowych, zgodne ze standardami WCAG 2.2. Zgodnie z tym okólnikiem spełnienie kryteriów na poziomie A — w tym WCAG 2.5.2 Pointer Cancellation — jest prawnie wymagane dla szerokiego zakresu podmiotów publicznych i prywatnych świadczących usługi cyfrowe w Turcji.

Okólnik obejmuje szerokie spektrum organizacji. Instytucje publiczne i organy rządowe muszą osiągnąć pełną zgodność z poziomem A w ciągu jednego roku od daty publikacji okólnika. Podmioty sektora prywatnego objęte regulacją — w tym platformy e-commerce, banki i instytucje finansowe, szpitale i świadczeniodawcy opieki zdrowotnej, firmy telekomunikacyjne z 200,000 lub większą liczbą abonentów, biura podróży, prywatne firmy transportowe oraz szkoły prywatne upoważnione przez Ministerstwo Edukacji Narodowej (MoNE) — otrzymują dwuletnie okno na dostosowanie się.

Dla tych podmiotów brak prawidłowego wdrożenia Pointer Cancellation wiąże się z realnym ryzykiem regulacyjnym. Rozważmy turecką platformę e-commerce, której mobilna strona finalizacji zakupu wyzwala potwierdzenie płatności przy touchstart — taka implementacja stanowiłaby bezpośrednie naruszenie WCAG 2.5.2, a co za tym idzie, także Prezydenckiego okólnika. Użytkownicy, którzy przypadkowo zainicjują zakup na tej platformie z powodu drżenia, niepełnosprawności ruchowej lub zwykłego błędnego stuknięcia, mieliby podstawy prawne, by twierdzić, że platforma nie wywiązała się ze swoich obowiązków w zakresie dostępności.

Poza zgodnością regulacyjną tureckie organizacje powinny dostrzec, że Pointer Cancellation nie jest jedynie technicznym punktem do odhaczenia, lecz fundamentalną zasadą projektową, która chroni możliwość bezpiecznej i zamierzonej interakcji użytkowników z usługami cyfrowymi. Wdrożenie aktywacji przy zdarzeniu „up” i mechanizmów cofania we wszystkich komponentach interaktywnych — od koszyków zakupowych i systemów rezerwacji wizyt po narzędzia do zarządzania dokumentami — pokazuje zaangażowanie w projektowanie inkluzywne, które przynosi korzyści wszystkim użytkownikom, nie tylko osobom z niepełnosprawnościami.

Organizacje objęte okólnikiem powinny przeprowadzić systematyczne audyty wzorców obsługi zdarzeń JavaScript, szczególnie na stronach zoptymalizowanych pod kątem urządzeń mobilnych i w niestandardowych komponentach interaktywnych, aby zidentyfikować i naprawić wszelkie aktywacje przy zdarzeniach „down”, które nie mają mechanizmów anulowania lub odwrócenia. Dokumentowanie tych działań naprawczych wesprze również obowiązki sprawozdawcze dotyczące zgodności, które mogą być wymagane w ramach przepisów wykonawczych okólnika.