2.1.4Poziom A

Skróty klawiaturowe ze znaków

Character Key Shortcuts

Skrót ze znaków można wyłączyć, przemapować z klawiszem niedrukowalnym albo ograniczyć do właściwego komponentu z fokusem.

Komu pomaga
Ograniczenia ruchowe
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.1
Stan researchu
Draft AI. Bez przeglądu człowieka.
Redakcja artykułu
· wersja robocza
Na tej stronie

Co oznacza to kryterium

Gdy litera, cyfra lub symbol uruchamia funkcję, trzeba zapewnić co najmniej jedną ochronę: wyłączenie skrótu, przemapowanie z dodatkowym klawiszem niedrukowalnym albo działanie wyłącznie przy fokusie właściwego komponentu. Sama instrukcja nie chroni przed przypadkowym wywołaniem. Po wyłączeniu funkcja powinna nadal mieć dostępną drogę obsługi.

To pomaga osobom sterującym głosem i osobom z ograniczoną precyzją ruchów: znaki rozpoznanej wypowiedzi lub przypadkowe naciśnięcie mogą wywołać polecenie. Przemapowanie może też ograniczyć mylenie skrótów między aplikacjami, ale kryterium nie żąda pełnego edytora skrótów. Test czytnika nie zastępuje wejścia, którego dotyczy ta bariera.

Przykłady błędów i poprawek

Globalne s przy innym przycisku

Własna „Pracownia” używa zamówienia #1042, adresu ul. Przykładowa 10 i początkowo pustej notatki. Wszystkie skutki są lokalne i syntetyczne. Materiały: Flutter/Cupertino, iPhone 17 Simulator / iOS 26.5, 2026-10-02.

Problem
Skrót s lub S ujawnia adres również przy fokusie Wyczyść wynik. Wyłączenie jest nieaktywne, nie ma przemapowania.
Skutek
Znak może niezamierzenie uruchomić inną funkcję. Pomijanie pola notatki nie chroni pozostałych kontrolek.
Poprawka
Udostępnij działające wyłączenie obu wielkości znaku albo inną z dwóch dróg spełnienia wymagania.
  1. W bad wpisane s przy fokusie notatki staje się tekstem bez aktywacji. To rzeczywiste pole, bez dyktowania.
  2. Tab prowadzi do „Pokaż adres”; s pokazuje adres. Space na „Wyczyść wynik” go ukrywa.
  3. Przy fokusie „Wyczyść wynik” ponowne s i Shift+s są odebrane, lecz ujawniają adres. Wyłączenie pozostaje niedostępne.
Pracownia bad przed s: fokus Wyczyść wynik, adres ukryty i wyłączenie skrótu nieaktywne.

Notatka zawiera wcześniej wpisane s. Jest to stan przed kolejnym rzeczywistym klawiszem.

Ta sama Pracownia po s przy Wyczyść wynik: adres ul. Przykładowa 10 widoczny.

Globalny skutek przy innym komponencie z fokusem. Dowód odbioru pochodzi z obserwacji klawiszy.

Wyłączenie zachowuje standardową akcję

Good ma ten sam globalny skrót poza notatką, ale działającą kontrolę.

  1. Tab osiąga „Wyłącz skrót”, a Space wyłącza s i S.
  2. Ponowne s oraz Shift+s są odebrane bez ujawnienia adresu i bez zwiększenia licznika aktywacji.
  3. Shift+Tab wraca do „Pokaż adres”. Litera nadal nie działa, ale Space wykonuje funkcję.
Pracownia good po wyłączeniu: adres ukryty, fokus Włącz skrót, notatka s.

Skrót wyłączony po rzeczywistej akcji. Sam napis nie dowodzi skuteczności; źródło potwierdza ponowne odebrane s i S.

Good po Space na Pokaż adres: adres widoczny mimo wyłączonego skrótu.

Standardowa aktywacja pozostaje dostępna. To końcowy stan sekwencji.

Jawny reset przywraca stan początkowy z włączonym skrótem. Nie ma timeoutu samoczynnie cofającego ustawienie. Wybór wariantu i reset są narzędziami demonstracji, poza wejściem oceny.

Skrót właściwego komponentu

Control reaguje na s/S tylko przy primary focus dokładnie „Pokaż adres”. Przy notatce wpisuje tekst, a przy „Wyczyść wynik” nie ujawnia adresu. Kontrola może wyglądać podobnie do błędnego skrótu, ale ma inną granicę fokusu. Nie wystarczy fokus całego ekranu.

Pracownia control po s przy Wyczyść wynik: adres nadal ukryty.

Brak akcji potwierdziło nowe odebrane zdarzenie. Identyczny obraz przed i po nie pozwala odróżnić braku wejścia od skutecznego ograniczenia.

We wszystkich wariantach Ctrl/Alt/Meta nie uruchamiają akcji. Odrzucenie Ctrl+s jest kontrolą handlera, a nie testem przemapowania. Space na przycisku zachowuje standardową aktywację.

Kiedy obowiązuje i gdzie są wyjątki

Znak, modyfikator i sekwencja

Liczy się wynikowy znak, nie liczba fizycznych klawiszy. Wielkie S, znak zapytania uzyskany Shiftem lub znak przez AltGr nadal wymagają oceny. Sekwencja samych znaków, np. g potem a, też jest w zakresie. Zmiana s na x lub S nie spełnia przemapowania: trzeba umożliwić dodanie klawisza niedrukowalnego.

Ctrl, Command lub Alt użyte jako klawisz polecenia mogą usunąć zależność od samych znaków. AltGr i kombinacji potrzebnej do wpisania znaku nie uznawaj automatycznie za taką ochronę. Jeśli autor od początku używa tylko kombinacji polecenia, warunek skrótu z samych znaków nie powstaje.

Fokus i dostępność mechanizmu

Skrót ograniczony fokusem ma działać w komponencie, którego dotyczy. Fokus dowolnego elementu, panelu lub okna nie wystarcza. Pisanie w polu nie jest samo w sobie skrótem polecenia; wybór pozycji listy literami przy jej fokusie jest dopuszczalnym kontekstem. Pomijanie edytorów pomaga, ale nie rozwiązuje globalnego skrótu przy innych kontrolkach.

Tab, strzałki, Escape oraz standardowa aktywacja przycisku Space/Enter nie są tu skrótami autora z liter, cyfr, interpunkcji lub symboli. Pomocnicza F99 pomija też Space, natomiast proponowana reguła ACT ma szerszy zbiór drukowalnych znaków Unicode. Jej status proposed i zakres HTML/DOM nie oznaczają uruchomionego walidatora mobilnego. Źródło wskazuje odwróconą zależność w ostatnim zdaniu Expected Results F99; ocenę oparto na wymaganiu i działaniu, bez mechanicznego powielania tego zdania.

Mechanizm musi być dostępny i skuteczny. Nieaktywny „Wyłącz skrót”, globalne odcięcie klawiatury lub utrata jedynej drogi do funkcji nie potwierdzają poprawki. G217 opisuje wyłączenie i przemapowanie jako technikę pomocniczą; nie wymaga obu.

Platformy

Interpretacja AI: 2026-10-02. Dla WWW obowiązuje WCAG 2.2; poza WWW źródło stosuje informacyjne WCAG2ICT bez zmiany wymagania. Draft nie podaje daty wydania użytej noty; nie jest to ustalenie prawne.

Środowisko Warunek i granica Wykonanie źródłowe
WWW, także telefon Skrót implementowany przez treść. Skróty przeglądarki ocenia się osobno. Niewykonane.
Mobile Oprogramowanie ze skrótem; wejście może pochodzić z klawiatury zewnętrznej lub innego oprogramowania. Flutter/iOS Simulator; bez Androida.
Desktop Własne skróty ze znaków. Niewykonane.
Dokumenty Skrót samego dokumentu; skrót czytnika nie staje się skrótem dokumentu. Niewykonane.
Kiosk Taki skrót w treści lub oprogramowaniu; zamknięta funkcjonalność wymaga dodatkowej oceny. Niewykonane.

WCAG2ICT wyłącza z definicji skrótu platformowe funkcje dostępności, w tym przytrzymanie przez co najmniej 2 s. Nie pozwala to autorowi opakować zwykłego skrótu w opóźnienie. Brak testu nie oznacza wyłączenia platformy.

Rozwiązania w technologiach

Oficjalne API sprawdzono w źródle 2026-10-02. Zachowaj dostępną drogę do tej samej funkcji i sprawdź kolizje z pisaniem oraz skrótami systemu.

Flutter

import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';

Focus(
  canRequestFocus: false,
  onKeyEvent: (_, event) {
    final keyboard = HardwareKeyboard.instance;
    if (showNode.hasPrimaryFocus && event is KeyDownEvent &&
        event.character?.toLowerCase() == 's' &&
        !keyboard.isControlPressed && !keyboard.isAltPressed &&
        !keyboard.isMetaPressed) {
      showAddress();
      return KeyEventResult.handled;
    }
    return KeyEventResult.ignored;
  },
  child: CupertinoButton(
    focusNode: showNode,
    onPressed: showAddress,
    child: const Text('Pokaż adres'),
  ),
)

Osadź w StatefulWidget z istniejącymi showNode i showAddress. FocusNode utwórz raz w State i zwolnij w dispose. character oznacza wynikowy znak; logical/physical key go nie potwierdzają. W pełnym ekranie pole notatki jawnie omija handler, a HardwareKeyboard tylko obserwuje, zwracając false. Flutter 3.44.9 / Dart 3.12.2: analiza, host i iOS pełnego pliku PASS; skrócony fragment nie był osobno kompilowany.

iOS / SwiftUI

import SwiftUI
struct AddressShortcuts: View {
    @State private var command = true
    @State private var shown = false
    var body: some View {
        VStack {
            Toggle("Używaj Command+s", isOn: $command)
            Button("Pokaż adres") { shown = true }
                .keyboardShortcut("s", modifiers: command ? .command : [])
            if shown { Text("Adres: ul. Przykładowa 10.") }
        }
    }
}

Toggle umożliwia wymaganie Command. Domyślny modifier SwiftUI to command, a pusta lista świadomie go usuwa. Przypisanie skrótu do Button nie ogranicza go automatycznie do fokusu przycisku: może działać w aktywnym oknie/scenie. Sprawdź wolną kombinację i edytory. Typecheck Xcode 27.0 / SDK Simulator 27.0, arm64/iOS 17: PASS; runtime niewykonany.

Android / Compose

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

@Composable
fun ShowAddress(showAddress: () -> Unit) {
    Button(onClick = showAddress) { Text("Pokaż adres") }
}

Usuń niepotrzebny globalny onPreviewKeyEvent dla Key.S, zachowując Button. Jeśli skrót pozostaje, uzależnij onKeyEvent/onPreviewKeyEvent od ustawienia lub właściwego fokusu. Handler rodzica widzi zdarzenia potomków. Dokumentacja sprawdzona; fragment i Android nie były budowane ani uruchamiane.

React Native

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

export function ShowAddress({ showAddress }: { showAddress: () => void }) {
  return (
    <Pressable accessibilityRole="button" onPress={showAddress}>
      <Text>Pokaż adres</Text>
    </Pressable>
  );
}

Usuń listener globalnego s w warstwie, która go dodaje. TextInput.onKeyPress jest callbackiem pola; na Androidzie dokumentacja ogranicza go do klawiatury ekranowej. disableKeyboardShortcuts iOS dotyczy undo/redo oraz kontrolek kopiowania TextInput, a nie wszystkich skrótów autora. Ustawienie i fokus muszą działać także w użytym adapterze natywnym lub warstwie webowej. Dokumentacja sprawdzona; kompilacja, klawiatura i semantyka Pressable niewykonane.

Jak sprawdzić

  1. Zinwentaryzuj skróty autora z kodu lub wiarygodnego opisu. Uwzględnij wielkość liter, symbole, sekwencje i miejsca poza edytorem.
  2. Potwierdź znak, odbiór i skutek przy różnych komponentach z fokusem. Callback lub nazwa kontrolki nie wystarczy.
  3. Sprawdź tekst w notatce bez akcji, działanie przy właściwej kontrolce i reakcję przy innych kontrolkach.
  4. W wybranej drodze sprawdź rzeczywiste wyłączenie, przemapowanie lub ograniczenie fokusem. Po wyłączeniu ponów znak i zachowaj standardową akcję.
  5. Oddziel układ, Caps Lock, dead keys, AltGr, IME, dyktowanie i emulację klawiszy. Jeden znak s nie potwierdza tych ścieżek.

Weryfikacja i ograniczenia

Historyczne wyniki z 2026-10-02: Flutter 3.44.9 / Dart 3.12.2, iPhone 17 Simulator / iOS 26.5 (23F77), Xcode 27.0 / SDK Simulator 27.0, 402 × 874 pt i 1206 × 2622 px.

Sprawdzenie Wynik źródła
Analiza, host i build PASS; 15 hostowych testów, build iOS 9,1 s. Host nie potwierdza systemowego IME.
XCTest PASS, 2 testy, 0 failures, 269,025 s; bez tap i bez wywołania callbacku w natywnej próbie.
Wejście znaków 18 żądań S obejmujących s/Shift+s/Ctrl+s; każde z nowym KeyDownEvent HID 458774. 15 bez Ctrl miało character s lub S.
Good/bad/control Good wyłącza oba znaki i zachowuje Space; bad odtwarza FAIL; control reaguje tylko przy show. Ctrl+s odrzucono, bez testu przemapowania.
Sekwencja i materiały 50 żądań, 25 snapshotów, 11 PNG i drzew; pokazano pięć PNG. AI obejrzała materiały.
SwiftUI Typecheck PASS, runtime niewykonany. Początkowe błędy drivera poprawiono przed końcowym buildem.
FKA, fizyczny iPhone/klawiatura, VoiceOver, głos, człowiek i inne platformy Każde osobno niewykonane. Return/Enter nie powtarzano.

Fokus mierzy primary focus Fluttera, bez potwierdzenia FKA lub VoiceOver. Zegar XCTest i timestamp KeyEvent są różnymi źródłami; nie odejmowano ich od siebie. Nie nagrywano filmu/audio. Brak reakcji bez dowodu odbioru może oznaczać niewłaściwy stan lub wejście, a nie wyłączenie. Drzewo nie ujawnia wszystkich listenerów i IME. Oczekiwania, raporty i węzeł shortcut-observation trzeba wyłączyć z wejścia niezależnego walidatora; takiego walidatora nie uruchomiono.

Jak sprawdza Clearship

Metoda z 2026-10-07 wskazuje na Androidzie litery a, j, k, s, które zmieniają treść poza komponentem z fokusem. Pomiar kontrolny: 6/6 usterek i 2 fałszywe alarmy na 80 poprawnych ekranach, próg spełniony. To ograniczony detektor kandydatów, z ręczną oceną drogi spełnienia.

Działający przełącznik wyłączenia może nadal dać znalezisko, bo analizator nie używa go ani nie sprawdza przemapowania. Zmiana przy właściwym komponencie, nieustalony skutek lub pominięte litery wymagają dalszej oceny. Cyfry, interpunkcja, wielkie litery, sekwencje, inne komponenty z fokusem, osobna treść webowa i iOS pozostają poza metodą. Wynik bez kandydatów dotyczy tylko wykonanych liter i osiągniętych stanów.

Powiązane kryteria