2.5.2Poziom A

Anulowanie operacji wskaźnika

Pointer Cancellation

Funkcja jednego wskaźnika spełnia co najmniej jedną z czterech alternatyw dotyczących naciśnięcia, zakończenia, odzyskania stanu lub niezbędności.

Komu pomaga
Ograniczenia ruchoweSłabowidzeniePamięć i koncentracja
Zastosowanie
WWWAplikacje mobilneAplikacje desktopoweDokumenty cyfroweInne urządzenia

Warunki i wyjątki opisano w artykule.

Wersja
WCAG 2.2, wprowadzone w 2.1
Zasada / wytyczna
Funkcjonalność / 2.5
Stan researchu
Draft AI. Bez przeglądu człowieka.
Redakcja artykułu
· wersja robocza
Na tej stronie

Co oznacza to kryterium

Przypadkowe dotknięcie przycisku nie powinno od razu wywoływać trwałego skutku. Zwykła akcja może czekać na zwolnienie, a rozpoczęte przenoszenie można anulować lub cofnąć po jego zakończeniu na zwolnieniu. Chwilowy podgląd może działać już podczas naciśnięcia, jeśli zwolnienie odwraca wszystkie jego skutki; wykonanie wymagające samego momentu naciśnięcia ma odrębny wyjątek niezbędności.

ID / etykieta Uzasadnienie doboru
motor — Ograniczenia ruchowe Drżenie lub trudność trafienia powoduje niezamierzone naciśnięcie; wyjście przed zwolnieniem daje możliwość rezygnacji.
low-vision — Słabowidzenie Po dotknięciu łatwiej zauważyć, że wybrano inny cel, i poprawić pomyłkę.
cognitive — Pamięć i koncentracja Ograniczenie nagłych, niezamierzonych zmian i odzyskanie poprzedniego stanu pomaga przy rozproszeniu uwagi.

Przykłady błędów i poprawek

Pracownia, zamówienie #1042, ul. Przykładowa 10. „Potwierdź odbiór” zwiększa lokalny licznik. Good używa CupertinoButton.onPressed: przyłożenie i przytrzymanie nie potwierdzają; odsunięcie o 120 pt i zwolnienie poza celem pozostawiają licznik 0. Naciśnięcie i zwolnienie w środku potwierdza jeden raz, po odebranym up.

iPhone 17 Simulator iOS 26.5: good po naciśnięciu, odsunięciu i zwolnieniu poza Potwierdź odbiór; licznik potwierdzeń pozostaje 0.

Good po przytrzymaniu, odsunięciu o 120 pt i zwolnieniu poza celem zachowuje licznik 0. Surowy XCUIScreen z 2026-10-03; ruch i brak wykonania na down potwierdza ledger.

iPhone 17 Simulator iOS 26.5: good po przytrzymaniu i zwolnieniu w celu; licznik potwierdzeń wynosi 1.

Good po przytrzymaniu i zwolnieniu w celu ma licznik 1, po wcześniejszym resecie. Kadr iOS Simulator z 2026-10-03 pokazuje wynik; zapis zdarzeń umieszcza commit po up.

Potwierdzenie już przy kontakcie

Bad różni się od good tylko momentem podpięcia _confirmed++: wykona go Listener.onPointerDown, a onPressed pozostaje bez skutku. Wygląd, cel i dane są wspólne. Po wyjściu z celu licznik już wynosi 1; up go nie odwraca. Potwierdzenie nie jest emulacją klawisza ani funkcją wymagającą momentu kontaktu; brak abort/undo w badanym przepływie. To własne odtworzenie bariery F101, zamierzony FAIL badanego warunku, przy PASS testu odtworzenia.

iPhone 17 Simulator iOS 26.5: bad po tym samym odsunięciu i zwolnieniu poza cel; licznik potwierdzeń wynosi 1.

Bad po tym samym odsunięciu i zwolnieniu ma już licznik 1. Surowy kadr z 2026-10-03; ledger umieszcza trwały commit między down i up.

Surowy screenshot bad z finalnego XCTest. Para good/bad przedstawia ten sam przebieg wejścia; ledger bad zapisuje commit pomiędzy down i up. „Przywróć dane przykładu” jest narzędziem odtwarzania poza badaną funkcją, bez odpowiednika w rzeczywistym odbiorze; nie zaliczać go jako produkcyjnego undo. Bad nie usuwa i nie wysyła rzeczywistych danych. Ocena wariantu fixture nie jest oceną zgodności całego harnessu z jego ustawieniami.

Rozpoczęcie przeciągania z możliwością cofnięcia — opisowy przypadek

Na down podnosisz kartę odbioru, ruch pokazuje proponowaną kolejność, up zatwierdza położenie. Jeśli up poza dozwolonym obszarem odtwarza poprzednią kolejność, masz abort; alternatywnie przycisk „Cofnij zmianę” po drop odtwarza stan. Sama dekoracja cofnięcia bez przywrócenia danych nie wystarcza. To edukacyjny przykład drugiej alternatywy, NOT-RUN; test przycisku nie sprawdza mechanizmu drag-and-drop ani historii undo.

Kontrola: podgląd na down z odwróceniem na up

Control pokazuje syntetyczny kod 4821 podczas przytrzymania i ukrywa go na każdym up, także poza celem. Nie zwiększa licznika ani nie zapisuje innych danych. Ledger pokazuje down → preview-open (true) → up → preview-close (false). Spełniona jest alternatywa Up Reversal, choć używa down; to nie jest „nie dotyczy kryterium”. Na systemowe cancel również ukrywa kod — ta ostatnia droga ma tylko hostowy test syntetyczny.

iPhone 17 Simulator iOS 26.5: control po zwolnieniu przytrzymanego podglądu, kod ponownie ukryty.

Control po zwolnieniu ponownie ukrywa kod, bez potwierdzenia odbioru. Kadr iOS Simulator z 2026-10-03 jest stanem końcowym; otwarcie podczas down zachowuje ledger.

Kiedy obowiązuje i gdzie są wyjątki

Jeden wskaźnik oznacza jednoczesne wskazywanie jednego punktu: mysz, pojedynczy palec lub pióro. Obejmuje także podwójne kliknięcie, przeciąganie i swipe jednym palcem; nie sprowadza się do pojedynczego tap. Down to rozpoczęcie naciśnięcia/kontaktu, up to jego zwolnienie. Systemowe cancel jest odrębnym zdarzeniem przerwania, nie synonimem up.

Alternatywa wymagania Co trzeba ustalić Czego z niej nie wywnioskować
No Down-Event Down nie wykonuje żadnej części funkcji. Zwykłe sprzężenie wizualne przycisku należy odróżnić od skutku biznesowego. Sam brak undo nie oznacza błędu, jeśli spełniono tę alternatywę. Normatywny punkt nie nakazuje dodatkowo abort/undo każdej akcji wyłącznie na up.
Abort or Undo Zakończenie funkcji następuje na up i istnieje rezygnacja przed zakończeniem lub cofnięcie po zakończeniu. Down może rozpocząć złożoną operację. Nie wymaga obu mechanizmów naraz. Samo undo po trwałym zakończeniu na down nie potwierdza dosłownego warunku tej alternatywy.
Up Reversal Up odwraca wszystkie skutki poprzedniego down, np. chwilowy podgląd wraca do stanu ukrytego. Schowanie komunikatu po zapisaniu danych nie odwraca zapisu, wysłanej wiadomości ani rozliczenia.
Essential Zakończenie na down jest niezbędne: usunięcie go zasadniczo zmienia cel, którego nie da się osiągnąć inaczej w zgodny sposób. Preferencja „szybszego UI”, istniejący kod lub wybór frameworka nie są uzasadnieniem.

Emulacja klawisza klawiatury lub klawiatury numerycznej jest uznana za niezbędną w uwadze kryterium. Instrument wymagający precyzyjnego momentu nacisku ilustruje możliwe uzasadnienie; nie każde urządzenie z cyframi jest automatycznie emulacją klawiatury. Wyjątek nie nakłada undo, choć cofanie bywa dobrą praktyką. Tych przypadków nie uruchamiano.

W przypadku długiego naciśnięcia sprawdź rzeczywisty skutek, zakończenie i drogę odzyskania stanu. Samo opóźnienie nie daje automatycznego wyjątku. Wskazówka „przesuń poza cel przed zwolnieniem” jest prostą i przewidywalną implementacją anulowania zwykłego przycisku; nie zastępuje rozpatrzenia wszystkich czterech alternatyw.

G212 wspiera użycie standardowej aktywacji kontrolek zamiast dodawania skutku do down. G210 dotyczy anulowania drag-and-drop. F101 opisuje naciśnięcie wywołujące akcję bez odpowiednich mechanizmów i niezbędności; wykrycie samego handlera down jest jedynie kandydatem do inspekcji. Materiały pomocnicze nie zmieniają koniunkcji „zakończenie na up i abort lub undo” w normatywnym punkcie ani nie dowodzą częstości błędów.

Platformy

Ocena AI z 2026-10-03, do przeglądu człowieka. WCAG 2.2 Recommendation z 2024-12-12 jest podstawą kontekstu webowego; WCAG2ICT Group Note z 2025-12-11 jest informacyjną interpretacją poza WWW, nie nową normą. Wszystkie poniższe wiersze wskazują 2.5.2.

ID / środowisko Podstawa, stan Warunek, adaptacja i uzasadnienie
web — WWW WCAG 2.2; dotyczy warunkowo Funkcja treści obsługiwana jednym punktem; bez zmiany wymagania. WWW w telefonie nadal należy tutaj.
mobile — Aplikacje mobilne WCAG 2.2 + WCAG2ICT 2025; dotyczy warunkowo Natychmiastowe naciśnięcie, tap, przeciąganie lub pojedynczy swipe aplikacji. Cztery alternatywy bez zmiany; uwagi dotyczą oprogramowania i platformy bazowej.
desktop — Aplikacje desktopowe WCAG 2.2 + WCAG2ICT 2025; dotyczy warunkowo Mysz, pióro lub dotyk. Adaptacja uwag jak w mobile; sama możliwość obsługi klawiaturą nie wyłącza wejścia wskaźnikowego.
document — Dokumenty cyfrowe WCAG 2.2 + WCAG2ICT 2025; dotyczy warunkowo Dokument sam interpretuje działania i wybiera zdarzenie wykonania, np. interaktywny prototyp; uwagi odnoszą się do treści. Statyczny tekst bez takich funkcji: nie dotyczy badanego scenariusza.
other — Oprogramowanie kiosku z ekranem dotykowym WCAG 2.2 + WCAG2ICT 2025; dotyczy warunkowo Funkcje jednego punktu w oprogramowaniu. Adaptacja software; nie jest oceną fizycznych przycisków i wszystkich wymagań sprzętu.

WCAG2ICT odróżnia działania aplikacji od sterowania platformą bazową/technologią asystującą. Oprogramowanie platformowe także odpowiada za własne akcje, lecz nie za akcje warstwy poniżej. Uwagi dopuszczają niezbędne funkcje wybudzenia ze stanu oszczędzania energii. Nie przenosić tego wyjątku na zwykłe „Potwierdź odbiór”. Hybrydę rozpatrywać oddzielnie jako WWW i część natywną.

Osobna, sprawdzona podstawa EN 301 549 V3.2.1 (2021-03): web — 9.2.5.2, document — 10.2.5.2 / tabela 10.10, mobile i desktop oraz software kiosku — 11.2.5.2 / tabela 11.9. Stan: dotyczy warunkowo, przy funkcjach jednego wskaźnika w odpowiednim zakresie WWW/dokumentu/UI software; adaptacja uwag w tabelach. Odpowiednik istnieje także dla dokumentów. Załącznik C.11.2.5.2 wymienia dodatkowo wsparcie co najmniej jednej technologii asystującej jako warunek procedury badania; nie kopiujemy go do WCAG2ICT ani do ogólnego wyłączenia całej platformy. Nie oceniano innej wersji EN ani obowiązku prawnego.

Wykonanie: tylko Flutter/Cupertino na iOS Simulator i hostowe zdarzenia syntetyczne. Pozostałe środowiska mają przegląd zastosowania/API, bez uruchomienia. Brak testu nie oznacza braku zastosowania.

Rozwiązania w technologiach

Najmniejsza poprawka zwykłego przycisku: użyj standardowej aktywacji i usuń trwały skutek z początku naciśnięcia. Sprawdź przerwanie i zwolnienie poza celem w użytym frameworku/wersji; nazwa callbacku nie jest samodzielnym dowodem.

Android / Compose

import androidx.compose.runtime.Composable
import androidx.compose.material3.Button
import androidx.compose.material3.Text

@Composable
fun ConfirmPickup(confirm: () -> Unit) {
    Button(onClick = confirm) { Text("Potwierdź odbiór") }
}

confirm obsługuje właściwy efekt. Nie wykonuj go w onPress lub na początku własnego pointerInput; onPress i ukończony tap to inne etapy. Oficjalne API Button/onClick i tap-and-press sprawdzono 2026-10-03. Kompilacja i działanie NOT-RUN; Androida nie uruchamiano, nie przypisano nieużytej wersji Compose.

iOS / SwiftUI

import SwiftUI

struct ConfirmPickup: View {
    let confirm: () -> Void
    var body: some View {
        Button("Potwierdź odbiór", action: confirm)
    }
}

Pozostaw standardową interakcję Button. Własny PrimitiveButtonStyle może zmienić zachowanie, więc wymaga osobnego sprawdzenia; pressed do zmiany wyglądu nie musi oznaczać wykonania. Oficjalne API Apple odczytano również przez JSON dokumentacji 2026-10-03. Kompilacja i działanie fragmentu NOT-RUN. XCTest w Swifcie jest driverem Fluttera, nie testem tego fragmentu.

Flutter

import 'package:flutter/cupertino.dart';

Widget confirmPickup(VoidCallback confirm) => CupertinoButton(
  onPressed: confirm,
  child: const Text('Potwierdź odbiór'),
);

Efekt umieść w onPressed, nie w onPointerDown/onTapDown. Pełna demonstracja używa tego wzorca; kontrola ma świadomie inne zachowanie. Dokumentację oraz źródło zainstalowanego CupertinoButton sprawdzono: _handleTapUp sprawdza położenie z tolerancją tapMoveSlop, a anulowanie nie woła akcji. Nie zakładamy idealnej granicy pikselowej, dlatego próba wychodzi o 120 pt. Użyto Flutter 3.44.9, Dart 3.12.2; analiza, kompilacja i działanie mają wyniki poniżej.

React Native

import { Pressable, Text } from 'react-native';

export function ConfirmPickup({ confirm }: { confirm: () => void }) {
  return (
    <Pressable
      accessibilityRole="button"
      onPress={confirm}
      style={{ padding: 16, backgroundColor: '#15201C' }}
    >
      <Text style={{ color: '#F4F1E8' }}>Potwierdź odbiór</Text>
    </Pressable>
  );
}

onPressIn rozpoczyna kontakt; onPress jest aktywacją po zwolnieniu, a onPressOut obsługuje wyjście ze stanu naciśnięcia. Własne skutki i onLongPress mogą zmienić tę logikę. hitSlop rozszerza cel, pressRetentionOffset obszar utrzymania naciśnięcia: test anulowania powinien wyjść poza rzeczywisty obszar, nie tylko napis. Oficjalne API sprawdzono 2026-10-03; typecheck/kompilacja i działanie NOT-RUN, bez deklaracji użytej wersji RN.

Jak sprawdzić

  1. Dla każdej funkcji pojedynczego punktu ustal skutek, moment jego rozpoczęcia/zakończenia i właściwą alternatywę. Rozróżnij feedback, podgląd, zapis danych i efekt zewnętrzny.
  2. Przyłóż wskaźnik i bez up obserwuj stan. Potem zwolnij w celu. W good oczekuj 0 podczas down i 1 dopiero po up; w bad już po down będzie 1. Porządek ledgeru ma potwierdzać tę różnicę.
  3. Po resecie przyłóż do celu, przytrzymaj, odsuń o 120 pt, zwolnij. Good: 0; bad: 1. Sprawdź odebrany punkt i lokalne położenie up poza kontrolką oraz rzeczywisty stan, nie samą animację przycisku.
  4. W control przytrzymanie ma otworzyć podgląd, up zarówno w środku, jak poza celem ma go ukryć; wszystkie trwałe skutki mają pozostać zerowe. Systemowe przerwanie zbadaj osobno. Cancel hosta nie potwierdza obsługi przerwania na fizycznym iPhonie.
  5. Dla drag-and-drop sprawdź zakończenie na up oraz co najmniej jedną faktyczną drogę abort/undo. Dla wyjątku essential zapisz uzasadnienie i oceń alternatywy; nie przyznawaj go na podstawie nazwy kontrolki.
  6. W produkcyjnej aplikacji sprawdź wszystkie funkcje i rzeczywisty stan danych/backendu. Zwykły przycisk na up nie dowodzi zachowania innych kontrolek, nie gwarantuje także dostępności klawiaturą lub czytnikiem.

Weryfikacja i ograniczenia

Materiał źródłowy zachowuje wyniki finalnej próby, środowisko, czasy i hashe. Adekwatnym dowodem są żądania XCTest i odebrane zdarzenia z zapisanym stanem funkcji; PNG daje kontekst. Film/audio nie powstały: nie są potrzebne do ustalenia kolejności zdarzeń i skutków. Nie deklarujemy pomiaru ruchu lub czasu kontaktu na podstawie ekranów.

Finalna próba 2026-10-03 01:42:44–01:44:32 CEST (próbki UTC 2026-10-02 23:42:44–23:44:32). Dedykowany iPhone 17 Simulator, iOS 26.5, UDID 1EBF874A-4981-4C31-A744-72A53238C827, 402 × 874 pt / 1206 × 2622 px, jasny wygląd i content size large. Xcode 27.0 (27A266a), SDK iOS Simulator 27.0. Flutter 3.44.9 / Dart 3.12.2; widoczne 09:41 jest ustawieniem paska, nie czasem wykonania.

Sprawdzenie Wynik i faktyczny zakres
Analiza i build iOS PASS; brak problemów, analiza 1,6 s, Xcode build 9,8 s; instalacja nowego Runner.app przed testem.
Hostowy zestaw na adapterze iOS 20 PASS; nowy test czyta przytrzymany down przed up, sprawdza up w celu/poza, cancel, reversal, reset/cykl/fallback. Syntetyczne zdarzenia widgetu, bez Androida.
Driver / natywny XCTest Kompilacja PASS, 1 test PASS / 0 błędów, 122,679 s. 20 żądań, 14 próbek, osiem interakcji celu: good 3, bad 3, control 2.
Good — abort oraz moment Po hold i odsunięciu przed up 0, bez commit. Up odebrany lokalnie przy y=152 pt, poza celem o wysokości 64 pt. Po hold/up w środku i po tap: 1, commit dopiero po odebranym up, wszystkie wcześniejsze rekordy mają confirmed=0.
Bad — odtworzenie bariery Hold/outside, hold/inside i tap dają 1. W każdym ledgerze down → commit → up; odebrany up nadal ma confirmed=1. Test odtworzenia PASS, warunek fixture FAIL.
Control — odwrócenie W środku i poza: down → preview-open (true), up → preview-close (false), confirmed=0. Jeden odebrany pointer touch na interakcję; systemowy cancel sprawdzony tylko hostowo.
Reset/cykl i regresja Reset zeruje stan i ledger oraz wraca do trasy, cykl wybiera good/bad/control. Dodatkowy smoke 2.5.1 tap zoom do 125% PASS; nie jest pełnym testem pinch.
Media i integralność 4 PNG i cztery snapshoty drzewa w TXT, wszystkie obrazy obejrzane przez AI: aktualny ekran, bez splash/pustki. Check ledgeru/haszy/linków PASS, zachowano 285 wcześniejszych plików dowodów i testów bajtowo.
Pozostałe testy Fizyczny iPhone, VoiceOver i człowiek NOT-RUN; Compose/SwiftUI/RN: dokumentacja przejrzana, kompilacja i działanie NOT-RUN.

Pierwszy build drivera ujawnił nieobsługiwaną nazwę funkcji zapisu CGRect; zastąpiono ją tablicą liczb i powtórzono build oraz pełny XCTest. Wstępne logi błędu zachowano w materiale źródłowym; assety pochodzą wyłącznie z finalnego wykonania. Wspólne main/keyboard mają nową trasę; wcześniejsze metadane nadal identyfikują historyczne buildy. Nie zmieniono starszych mediów ani testów.

Odczyty state, tree i PNG są sekwencyjne. UTC zapisano przed pobraniem stanu; to nie moment ekspozycji obrazu. receivedUs jest monotonicznym zegarem obserwatora aplikacji, eventUs zegarem wejścia, a ProcessInfo.systemUptime otacza żądanie w procesie XCTest. Nie synchronizowano tych zegarów; porządek seq i stany przed/po dowodzą momentu wykonania w aplikacji, nie opóźnienia fizycznego dotyku.

Listener obserwuje wyłącznie badaną kontrolkę. W good loguje wejście bez wywołania akcji, commit pochodzi ze standardowego onPressed; w bad oraz control te same handlery wykonują celowo odrębne funkcje i jawnie zapisują efekt. Snapshoty po akcji nie są niezależnym odczytem backendu, bo własna fixture nie ma backendu. XCTest wysyła wejście systemową automatyzacją do uruchomionej aplikacji; nie wywołuje callbacku bezpośrednio. To syntetyzowane wejście Simulatora, a nie fizyczny palec. Próba hostowa jest inną symulacją.

Granice oceny

Metoda Wniosek i granica
Reguła deterministyczna Ledger fixture wykazuje moment commit i stan podglądu względem odebranych down/up. Check sprawdza zachowane dowody, nie wszystkie funkcje dowolnej aplikacji.
Przybliżenie z drzewa Nazwa, rola i licznik pomagają ustalić efekt, lecz samo drzewo nie podaje handlera ani momentu wykonania.
Obraz / AI Ten sam wygląd może mieć przeciwne zachowanie; obraz końcowy 0 lub 1 nie wyjaśnia przebiegu i nie dowodzi mechanizmu cofania. AI może wskazać kandydata, nie rozstrzygnąć niezbędności na podstawie etykiety.
Człowiek Ocena pełnych skutków, realnej drogi odzyskania stanu, uzasadnienia essential i kompletności zakresu; tutaj NOT-RUN.

Brak wykrycia down nie dowodzi jego nieużywania. Sam handler down nie oznacza FAIL: może służyć obserwacji, chwilowemu podglądowi, rozpoczęciu odwracalnej operacji albo niezbędnej funkcji. Etykiety good/bad/control, manifest oczekiwań i JSON obserwatora mają pozostać poza wejściem niezależnego walidatora. To materiał edukacyjny/regresyjny, nie niezależny benchmark.

Fizyczny iPhone/dotyk, mysz, pióro, VoiceOver, Switch Control, FKA i klawiatura tego ekranu NOT-RUN. Przerwanie PointerCancelEvent jest sprawdzone tylko hostowo; nie odtworzono systemowego przerwania aktywnego kontaktu na iOS Simulatorze. Drag-and-drop z undo i emulacja klawiatury/essential to przypadki opisowe NOT-RUN, poza wykonaną demonstracją. Fragmentów Compose/SwiftUI/RN nie kompilowano ani nie uruchamiano; to jawny zakres edukacyjny, nie obowiązek rozszerzenia tej sesji. Nie wymaga się testu czytnika do dowodu momentu wykonania tej bezpośredniej funkcji wskaźnikowej.

Jak sprawdza Clearship

Clearship naciska kontrolkę, wychodzi poza rzeczywisty obszar celu i zwalnia wskaźnik. Porównuje drzewo i przejście ekranu przed oraz po wejściu. Android sprawdza także anulowanie kontaktu, co pomaga odróżnić trwały skutek naciśnięcia od zakończenia po zwolnieniu. Sama kontrolka „Cofnij” nie dowodzi przywrócenia danych.

Metoda spełniła próg Androida w pomiarach 8 października 2026 r.; iOS w pomiarze 9 października pozostaje poniżej progu i wymaga człowieka. Przebieg bada najwyżej trzy kontrolki z akcją od góry widocznego ekranu, bez przewijania i bez odczytu podczas przytrzymania. iOS nie zapewnia anulowania kontaktu; cofnięcie, odwrócenie i niezbędność wymagają dodatkowej oceny. Skutki backendu lub dźwięku bez zmiany drzewa, przeciąganie i niezbadane cele nie są potwierdzone. Osobnej treści webowej nie oceniamy pełnym modelem tego kryterium.

Powiązane kryteria