2.1.2Poziom A

Brak pułapki na klawiaturę

No Keyboard Trap

Z części interfejsu osiągalnej klawiaturą musi dać się wyjść klawiaturą; niestandardową metodę wyjścia trzeba wyjaśnić.

Komu pomaga
Ograniczenia ruchoweNiewidzenieSłabowidzenie
Zastosowanie
WWWAplikacje mobilneAplikacje desktopoweDokumenty cyfroweInne urządzenia

Warunki i wyjątki opisano w artykule.

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

Co oznacza to kryterium

Osoba, która weszła klawiaturą do okna lub osadzonego obszaru, musi móc opuścić go tą samą metodą obsługi. Modal może zatrzymywać Tab wewnątrz, jeżeli pozwala zakończyć interakcję klawiaturą. Gdy jedynym wyjściem jest własny skrót, użytkownik musi otrzymać dostępną instrukcję.

To pomaga osobom korzystającym z klawiatury lub wejścia, które ją zastępuje, w tym osobom z ograniczeniami ruchowymi, niewidomym i słabowidzącym. Widoczny przycisk zamknięcia nie dowodzi, że można do niego dotrzeć klawiaturą.

Przykłady błędów i poprawek

Poprawny modal: wejście, działanie i wyjście

Własna „Pracownia” pokazuje adres ul. Przykładowa 10 dla syntetycznego zamówienia #1042. Obie wersje zawierają te same dane i godziny 10:00–18:00. Poniższe kadry pochodzą z rzeczywistego Flutter/Cupertino na iPhone 17 Simulator, iOS 26.5, z 2026-10-02. Są kontekstem sekwencji klawiszy, a nie samodzielnym testem wyjścia.

  1. Wejście: Tab dociera do „Otwórz adres”, Space otwiera okno i przenosi fokus do „Pokaż godziny”.
  2. Działanie: Space ujawnia godziny. Tab i Shift+Tab krążą między pokazaniem godzin a zamknięciem, bez przejścia do zasłoniętej treści.
  3. Wyjście: Space na „Zamknij adres” zamyka okno. Fokus wraca do wyzwalacza, a kolejny Tab dociera do „Wyczyść wynik” poza modalem.
Pracownia: otwarty modal, fokus na Pokaż godziny po Tab i Space.

Wejście do good. Odczyt źródłowy potwierdził odbiór klawiszy i fokus Fluttera.

Ten sam modal z godzinami 10:00–18:00; fokus na Zamknij adres.

Zamknięcie jest osiągalne po nawigacji w obu kierunkach.

Pracownia po zamknięciu modalu przez Space; fokus na Otwórz adres.

Powrót do wyzwalacza. Dalszy Tab poza okno potwierdzała osobna obserwacja wejścia.

Pułapka: widoczne zamknięcie poza nawigacją

Problem
Zamknij adres nie może dostać fokusu. Tab i Shift+Tab pozostają na Pokaż godziny, a Space tylko ujawnia godziny.
Skutek
Użytkownik wszedł klawiaturą, lecz bez dotyku lub przerwania programu nie może wrócić do zamówienia.
Poprawka
Przywróć możliwość osiągnięcia i aktywacji zamknięcia klawiaturą. Zachowaj modalny zakres fokusu podczas pracy w oknie.
Celowo błędna Pracownia: po próbach wyjścia okno nadal otwarte, godziny widoczne, fokus Pokaż godziny.

Uzbrojony wariant bad pozostał otwarty po odebranych Tab, Shift+Tab, Space i Shift+Space. Dotyk lub zakończenie procesu służyły odzyskaniu środowiska; nie były klawiaturowym wyjściem.

Błąd występował wyłącznie w świadomie uruchomionym debugowym wariancie bad z parametrem fixture=trap. Bez parametru podgląd miał osiągalne zamknięcie i nie odtwarzał pułapki. Ten artykuł opisuje istniejący materiał; nie uruchamia pułapki w witrynie.

Kontrola granicy: objaśnione Shift+Space

W control jedna kontrolka pozostaje w pętli, ale widoczna instrukcja przed wejściem i w oknie podaje Shift+Spację. Ta kombinacja zamknęła okno i przywróciła fokus. To sprawdzenie granicy wymagania, bez rekomendacji zastępowania prostego zamknięcia własnym skrótem.

Pracownia control: modal z instrukcją zamknięcia przez Shift plus Spacja.

Instrukcja jest widoczna w otwartym oknie. Działanie skrótu potwierdzał zapis klawiszy i stanu, nie ten kadr.

Kiedy obowiązuje i gdzie są wyjątki

Droga wyjścia i standard platformy

Interfejs klawiatury przekazuje naciśnięcia do oprogramowania, także z urządzenia zastępującego klawiaturę. MouseKeys sterujące wskaźnikiem, gest, dotyk, restart lub zamknięcie programu nie zastępują wyjścia klawiaturą z treści. Krążenie po kilku kontrolkach obszaru również nie wystarcza.

Osiągalne „Zamknij” lub „Anuluj”, standardowe wyjście platformy albo objaśniony działający skrót mogą zakończyć modal. Escape jest typowy w wielu środowiskach, ale trzeba sprawdzić jego znaczenie i dostępność w danej konfiguracji. Sama instrukcja niedziałającego skrótu i nieznany użytkownikowi własny skrót pozostawiają barierę.

W badaniu warto sprawdzić oba kierunki nawigacji. Nie oznacza to dopisania do kryterium wymogu wyjścia każdym klawiszem w obu kierunkach. Przywrócenie fokusu wyzwalacza pomaga zachować ciągłość pracy; nie jest osobnym zdaniem 2.1.2.

Granice zastosowania

Brak wejścia klawiaturą nie potwierdza dostępności — może być problemem 2.1.1. Wyjątku toru ruchu z 2.1.1 nie przenosi się na pułapkę 2.1.2. Reguła braku zakłócania obejmuje całą treść strony: równoważna funkcja gdzie indziej nie uwalnia osoby już uwięzionej w osadzonym obszarze.

Oprogramowanie, które mapuje klawisze bezpośrednio na funkcje i nie ma mechanizmu fokusu, nie tworzy pułapki fokusu w rozumieniu tej adaptacji WCAG2ICT. To nie ocena pozostałych wymagań klawiatury.

Platformy

Interpretacja AI w źródle pochodzi z 2026-10-02. WWW stosuje WCAG 2.2; dokumenty i oprogramowanie poza WWW korzystają z informacyjnej interpretacji WCAG2ICT. Zastosowanie nie oznacza wykonania testu ani ustalenia obowiązku prawnego.

Środowisko Warunek i adaptacja Wykonanie źródłowe
WWW, także przeglądarka telefonu Osiągalny klawiaturą obszar; także granice iframe i WebView. Bez uruchomienia przeglądarki.
Aplikacje mobilne „Stronę” zastępuje oprogramowanie. Brak fizycznej klawiatury nie usuwa warunku. Flutter/iOS Simulator; Android, fizyczny iPhone i FKA niewykonane.
Desktop Ten sam warunek, także własne terminale i WebView. Niewykonane.
Dokumenty Osiągalny formularz lub obiekt musi umożliwić powrót do pozostałej treści. Statyczna treść bez takiego obiektu nie tworzy pułapki. Odbiornik dokumentu niewykonany.
Kiosk lub telewizor Ustal mechanizm fokusu oraz interfejs klawiatury, keypadu lub kontrolera. Funkcjonalność zamknięta wymaga osobnej oceny. Niewykonane.

W hybrydzie sprawdź część webową i natywną oraz przejście między nimi.

Rozwiązania w technologiach

Preferuj standardowy modal z osiągalną akcją zamknięcia. Nie przechwytuj wszystkich klawiszy kontenera i nie wymuszaj powrotu na element bez wyjścia. Fragmenty są edukacyjne i wymagają sprawdzenia rzeczywistego wejścia w docelowej aplikacji.

Flutter

import 'package:flutter/cupertino.dart';

Future<void> showAddress(BuildContext context, FocusNode opener) async {
  await showCupertinoDialog<void>(
    context: context,
    builder: (dialogContext) => CupertinoAlertDialog(
      title: const Text('Adres punktu'),
      content: const Text('Pracownia, ul. Przykładowa 10'),
      actions: [CupertinoDialogAction(
        onPressed: () => Navigator.of(dialogContext).pop(),
        child: const Text('Zamknij adres'),
      )],
    ),
  );
  if (context.mounted && opener.context != null) opener.requestFocus();
}

Opener to utrzymywany FocusNode wyzwalacza. Nie usuwaj zamknięcia z nawigacji. Przy własnym zakresie closedLoop ustaw na FocusScopeNode przekazanym do FocusScope; użyty Flutter nie przyjmuje tego argumentu na samym widżecie. Demonstracja good miała dodatkowy Escape; control obsługiwał tylko opisaną kombinację. Obserwator klawiszy nie wykonywał akcji.

Dokumentacja, analiza, testy hostowe, build i przebieg iOS: PASS, Flutter 3.44.9 / Dart 3.12.2. Skrócony fragment nie jest osobno uruchomioną aplikacją.

iOS / SwiftUI

import SwiftUI

struct AddressModal: View {
    @State private var shown = false
    @FocusState private var openerFocused: Bool
    var body: some View {
        Button("Otwórz adres") { shown = true }
            .focused($openerFocused)
            .sheet(isPresented: $shown, onDismiss: { openerFocused = true }) {
                VStack {
                    Text("Pracownia, ul. Przykładowa 10")
                    Button("Zamknij adres") { shown = false }
                        .keyboardShortcut(.escape, modifiers: [])
                }
            }
    }
}

Button zamyka sheet, a Escape jest dodatkową drogą. FocusState nie potwierdza fokusu VoiceOver ani FKA; sprawdź powrót, także po usunięciu wyzwalacza. Dokumentacja 2026-10-02 i typecheck: PASS, Xcode 27.0 / SDK Simulator 27.0, arm64 target iOS 17.0. Działanie osobnej aplikacji SwiftUI: niewykonane.

Android / Compose

import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.*

@Composable
fun AddressModal() {
    var shown by remember { mutableStateOf(false) }
    TextButton(onClick = { shown = true }) { Text("Otwórz adres") }
    if (shown) AlertDialog(
        onDismissRequest = { shown = false },
        title = { Text("Adres punktu") },
        text = { Text("Pracownia, ul. Przykładowa 10") },
        confirmButton = {
            TextButton(onClick = { shown = false }) { Text("Zamknij adres") }
        }
    )
}

Samo onDismissRequest nie dowodzi osiągalności zamknięcia. FocusRequester może przywrócić fokus po prezentacji. Gdy własny kod go przechwytuje, zwolnij captureFocus przez freeFocus i sprawdź pozostałe handlery. Dokumentacja 2026-10-02: sprawdzona; kompilacja i działanie: niewykonane.

React Native

import { Button, Modal, Text, View } from 'react-native';

type Props = { visible: boolean; close: () => void };
export function AddressModal({ visible, close }: Props) {
  return (
    <Modal visible={visible} onRequestClose={close}>
      <View>
        <Text>Pracownia, ul. Przykładowa 10</Text>
        <Button title="Zamknij adres" onPress={close} />
      </View>
    </Modal>
  );
}

onRequestClose ma znaczenie zależne od platformy i nie gwarantuje Escape na iOS. accessibilityViewIsModal dotyczy VoiceOver; setAccessibilityFocus nie jest dowodem fokusu klawiatury. Sprawdź natywny komponent oraz powrót właściwą metodą platformy. Dokumentacja 2026-10-02: sprawdzona; kompilacja i działanie: niewykonane.

Jak sprawdzić

  1. Ustal obszary osiągalne klawiaturą oraz standardowe wyjścia platformy. Zacznij przed komponentem, bez ustawiania fokusu callbackiem testowym.
  2. Wejdź rzeczywistymi klawiszami; zapisz odebrane zdarzenia i fokus przed oraz po wejściu.
  3. Sprawdź granice przez Tab i Shift+Tab, osiągnij zamknięcie i aktywuj je. Powtarzający się fokus wymaga sprawdzenia drogi wyjścia.
  4. Dla własnego skrótu odczytaj dostępną instrukcję i wykonaj podaną kombinację. Potwierdź wyjście oraz dalszą nawigację poza obszarem.
  5. Zbadaj występujące stany, np. po ujawnieniu godzin, błędzie lub ładowaniu. Przy celowym błędzie odzyskanie dotykiem lub restartem zapisz osobno.

Weryfikacja i ograniczenia

Sprawdzenie źródłowe 2026-10-02 Wynik i granica
Dokumentacja / analiza Fluttera Sprawdzone / PASS, bez problemów.
Testy hostowe 14 PASS, m.in. good/bad/control, reset, bezpieczny podgląd, oba kierunki i odzyskanie. To nie Android.
Build iOS Simulator PASS, debug, Xcode 27.0 / SDK Simulator 27.0.
Natywne wejście i wyjście PASS opisanego scenariusza Tab, Shift+Tab, Space i Shift+Space; bad potwierdził oczekiwaną barierę. Fokus pochodzi z Flutter FocusManager.
Materiały 8 PNG, 8 drzew, 47 żądań klawiszy oraz 42 próbki stanu; bez filmu i audio.
Escape i Enter na iOS, FKA, VoiceOver, fizyczna klawiatura/urządzenie Niewykonane. Escape miał test hostowy, bez potwierdzenia natywnego wejścia.
Człowiek / pozostałe platformy Niewykonane.

W historycznej regresji selektor szukał StaticText zamiast Other; po poprawieniu selektora powtórzono tylko ten test i uzyskano PASS. Nie zmieniono aktywacji produktu. PASS bad oznacza poprawne odtworzenie bariery, nie spełnienie WCAG.

Screenshot, closedLoop lub kilka powtórzeń fokusu nie rozstrzygają pułapki. Odebrane klawisze potwierdzają konkretne próby, bez wykluczenia wszystkich innych wyjść. Brak odbioru klawisza nie pozwala przypisać winy komponentowi. Własny działający skrót wymaga oceny instrukcji i standardu platformy. Drzewo i tap nie zastępują testu klawiatury ani czytnika.

Jak sprawdza Clearship

Katalog metody z 2026-10-07 zachowuje ocenę ręczną. Android ma detektor kandydatów oparty na sekwencji fokusu i próbach wyjścia, z pomiarem na fixture. Osiągalne klawiaturą zamknięcie i wyjście w jednym kierunku zapobiegają fałszywemu alarmowi. Nieobjaśnione wyjście tylko Escape lub literą, brak powtórzeń albo brak obserwowalnego fokusu wymagają dalszej oceny. iOS nie ma tego przejścia klawiaturowego ani pomiaru. Wynik dotyczy osiągniętych obszarów i zbadanych metod wyjścia; niewykonany test nie jest wynikiem pozytywnym.

Powiązane kryteria