Co oznacza to kryterium
Wynik działania może pojawić się obok pola bez przeniesienia użytkownika do tego tekstu. Jeśli jest komunikatem o stanie w treści zapisanej w znacznikach, udostępnij jego pełne znaczenie przez rolę lub właściwości, aby technologia asystująca mogła je przedstawić bez nadawania fokusu. Widoczność komunikatu i możliwość późniejszego znalezienia go w drzewie nie potwierdzają powiadomienia o zmianie.
Tagi z design systemu służą prezentacji, nie wyznaczają zamkniętej listy odbiorców.
| ID / potrzeba | Bariera i korzyść |
|---|---|
blindness — Niewidzenie |
Widoczna obok pola liczba wyników może pozostać niezauważona podczas pracy czytnikiem lub brajlem. Programowy status pozwala przekazać wynik bez ręcznego poszukiwania. |
low-vision — Słabowidzenie |
Status poza powiększonym fragmentem ekranu może zostać pominięty. Dostępna informacja może być przedstawiona przez funkcję odczytu. |
cognitive — Pamięć i koncentracja |
AT może dostosować, opóźnić lub ograniczyć statusy do preferencji odbiorcy. To dodatkowa korzyść, bez obietnicy, że każda technologia tak działa. |
Przykłady błędów i poprawek
Pracownia wyszukuje syntetyczne produkty. Po notes i Szukaj/Enter pokazuje Notes lniany oraz Notes w kropki, z „Wyszukiwanie: 2 wyniki.”. Po zastąpieniu zapytania przez zzz pokazuje brak wyników. Nie ma serwera, zakupów ani kont.
Problem: bad ma tę samą funkcję, tekst i wyniki, lecz bez liveRegion lub ARIA status. Skutek przewidywany: informacja o zmianie może pozostać niezauważona przez AT. Poprawka: good zachowuje istniejący węzeł statusu i pełny kontekst, bez zabierania fokusu pola. Potwierdzono różnicę właściwości, a nie mowę lub ciszę VoiceOver i nie pełny FAIL F103.

XCTest v3, 2026-10-04, iPhone 17 / iOS 26.5 Simulator. Renderer odczytał liveRegion=true i zachowany fokus wejścia; sam obraz tego nie dowodzi.

Celowo identyczny wygląd; renderer odczytał liveRegion=false. To nie dowód ciszy VoiceOver ani pełnego FAIL procedury F103.
Kontrola zmiany kontekstu
Control po tym samym wyszukaniu otwiera dialog, przenosi fokus wejścia do Zamknij i przywraca go po zamknięciu. To zmiana kontekstu poza definicją statusu; nie rekomendacja zastępowania każdego powiadomienia modalem.

IAB/macOS, 1280×720 CSS px, DPR 1. document.activeElement=close-dialog potwierdza zmianę kontekstu; kontrola zakresu, bez zalecenia zastępowania statusów modalem.
Dodatkowe scenariusze są NOT-RUN: koniec oczekiwania po zniknięciu spinnera, etapowy postęp, pilny lub powtórzony błąd po submit i dopisywany log. Dobierz status końca pracy, właściwe okresowe powiadomienia, istniejący region błędu albo log nowych wpisów. Cykl, reset i fallback odtwarzają fixture, bez potwierdzenia AT.
Kiedy obowiązuje i gdzie są wyjątki
Status jest zmianą treści, która informuje o powodzeniu lub wyniku działania, oczekiwaniu, postępie procesu albo istnieniu błędu, bez zmiany kontekstu. Lista znalezionych produktów sama nie jest statusem; jej liczba i informacja o braku wyników są statusami. Wymaganie nie nakazuje autorowi tworzenia nowego komunikatu, którego nie udostępnia. Obejmuje także modyfikację istniejącego tekstu, informujące usunięcie „Trwa praca”, ikonę lub dźwięk statusu; alternatywa musi przekazać równoważne znaczenie i zakończenie oczekiwania.
Dialog przejmujący fokus jest zmianą kontekstu. Rozwinięcie sekcji, ujawnienie menu, wybór zakładki oraz stan kontrolki mają inny zakres; nie należy dopisywać live region do każdego takiego zdarzenia. Ich nazwa, rola, wartość i dostępność zmiany stanu należą m.in. do 4.1.2. Dodanie pytań formularza również nie staje się statusem tylko dlatego, że jest dynamiczne.
Nie każdy status wymaga role="status" i nie każdy komunikat wymaga assertive. Dobierz mechanizm do znaczenia i pilności. Dla liczby w koszyku przekazuj pełne „Koszyk: 3 produkty”, gdy samo „3” pozbawiłoby użytkownika kontekstu. Ustawienia, opóźnienie, kolejka lub decyzja AT o niewypowiadaniu komunikatu nie są automatycznie błędem autora; badaj wsparcie mechanizmu, jego właściwe użycie i doświadczenie odbiorcy.
Techniki i granice ich procedur
Techniki W3C są pomocniczymi sposobami spełnienia wymagania, nie dodatkową normą ani obowiązkiem zastosowania wszystkich przykładów.
| Technika / zakres | Co sprawdzono w researchu i co wynika z procedury |
|---|---|
| ARIA22 — wynik i stan aplikacji | Kontener status istnieje przed zmianą, wiadomość i konieczny kontekst znajdują się wewnątrz. Implicit polite i atomic=true; jawne atomic jest zaleceniem zgodności implementacji, nie osobnym wymogiem normy. Procedura: trzy kontrole kontenera, wiadomości i równoważnego kontekstu. Własny WWW sprawdza te warunki dla wyszukiwania. |
| ARIA19 — błędy | Aktualizacja istniejącego live region; przykład alert/assertive i atomic uwzględnia wielokrotne błędne wysłanie na iOS. 500 ms w przykładzie nie jest wymaganym czasem. Procedura sprawdza obecność regionu przy ładowaniu i wstawienie błędu do niego; własna wyszukiwarka nie jest pełnym wykonaniem przykładu formularza ARIA19. |
| G83/G84/G85/G177/G194 | Tekst brakujących pól, wartości spoza listy lub formatu, sugestie poprawy i sprawdzanie pisowni uzupełniają ARIA19 w odpowiedniej sytuacji. Część przykładów zmienia kontekst, więc sama technika ogólna nie dowodzi statusu 4.1.3. |
| ARIA23 — sekwencyjny log | role=log, implicit polite i atomic=false, dla dopisywanych wpisów historii, np. rozmowy. Procedura bada rolę kontenera. Nie oznaczaj całej listy wyników jako log tylko dlatego, że zmienia się dynamicznie. Własny log nie był uruchamiany. |
| ARIA25 — postęp | progressbar oraz aria-valuenow udostępniają wartość, ale nie tworzą live region. Technika dodaje odrębny status aktualizowany z postępem; nie musi to być akurat ARIA progressbar. Procedura obejmuje dynamiczny pasek i rzeczywisty czytnik bez przenoszenia fokusu. Oba kroki własnego przykładu postępu NOT-RUN. |
| ARIA27 — eksperymentalne API | Na stan dokumentu z 2026-05-11 ariaNotify pozostaje eksperymentalne; wyłącznie progressive enhancement wraz z pewniejszą techniką, np. ARIA25. Nie jest jedynym rozwiązaniem naszej demonstracji. Procedura z czytnikiem NOT-RUN. |
| G199 / G193 | Jawne potwierdzenie udanego wysłania połączone z ARIA22; pomoc asystenta połączona z ARIA22 w odpowiedniej sytuacji postępu. Przegląd dokumentacji, bez wykonania asystenta czy formularza tych technik. |
| F103 — przewidywany i potwierdzony błąd | Najpierw definicja statusu i brak fokusu, potem brak istniejącej roli/właściwości albo późne jej dodanie. To przewiduje barierę. Końcowy krok sprawdza, że AT nie przekazała statusu; sam DOM nie daje pełnego FAIL procedury F103. Native label/value oraz samo wywołanie API również nie dowodzą głosu. |
| ACT | Aktualny indeks nie zawiera reguły dla 4.1.3. Kontrole ARIA lub nazwy elementu powiązane z innymi wymaganiami nie dowodzą całego 4.1.3. Własny checker nie jest ACT. |
Platformy
Weryfikacja podstaw: AI 2026-10-04. WCAG jest podstawą dla WWW; WCAG2ICT 2.2 z 2025-12-11 jest informacyjną interpretacją, nie normą nakładającą obowiązek prawny. EN 301 549 nie jest podstawą tej karty; nie przenosimy tu jej klauzul ani wyłączeń.
| ID / środowisko | Podstawa / kryterium / stan | Warunek, adaptacja i uzasadnienie | Wykonanie |
|---|---|---|---|
web — WWW i aplikacje webowe, także w telefonie |
WCAG 2.2, 4.1.3; dotyczy warunkowo | Bez zmiany wymagania: komunikat spełnia definicję statusu w treści zapisanej w znacznikach. Role, właściwości lub odpowiednie API muszą umożliwiać prezentację bez fokusu. | Minimalny HTML/CSS/JS: właściwości i interakcje wykonane; czytnik NOT-RUN. |
mobile — Aplikacje mobilne |
WCAG2ICT 2.2, 4.1.3; dotyczy warunkowo | Note stosuje brzmienie bez zmiany. Dla niemarkupowego UI nadal istnieje potrzeba przekazania statusu przez usługi dostępności platformy; sam brak HTML nie jest normatywnym FAIL. W hybrydzie rozdzielić WWW i natywny UI. | Flutter/Cupertino na iOS Simulator; granice wyniku poniżej. Fizyczny iPhone i Android NOT-RUN. |
desktop — Aplikacje desktopowe |
WCAG2ICT 2.2, 4.1.3; dotyczy warunkowo | Dynamiczny status, np. zakończenie eksportu bez zmiany kontekstu. To samo brzmienie i uwaga o API niemarkupowego oprogramowania; odpowiedniki platformowe dobiera się do odbiornika. | Native desktop NOT-RUN; macOS host przeglądarki należy do treści webowej. |
document — Dokumenty cyfrowe poza WWW |
WCAG2ICT 2.2, 4.1.3; dotyczy warunkowo | Dynamiczny status w interaktywnym dokumencie. Dla niemarkupowej treści Note zachowuje potrzebę programowego przekazania przez odbiornik/API. Statyczny PDF bez zmian statusu: nie dotyczy tego scenariusza, nie wyłącza kategorii dokumentów. | Dokument/odbiornik NOT-RUN. |
other — Oprogramowanie kiosku z ekranem |
WCAG2ICT 2.2, 4.1.3 dla oprogramowania; dotyczy warunkowo | Część webowa jak WWW; dla części natywnej uwaga o usługach platformy. Zamknięta funkcjonalność wymaga osobnej analizy możliwości dostępu i własnych mechanizmów; nie jest automatycznym wyłączeniem potrzeby. Nie oceniono sprzętu, telewizorów ani „wszystkich innych” urządzeń. | Kiosk i zamknięta funkcjonalność NOT-RUN. |
Rozwiązania w technologiach
Dokumentacja oficjalnych API sprawdzona 2026-10-04. Wszystkie fragmenty są własnymi przykładami edukacyjnymi. Budowa Fluttera nie potwierdza SwiftUI, Compose lub React Native. Mechanizm zawsze należy sprawdzić w docelowym zestawie OS/AT; nie dublować automatycznego live region z dodatkowym announcement tej samej wiadomości.
Flutter / Dart
import 'package:flutter/cupertino.dart';
// W istniejącym State: message aktualizuje zwykła akcja wyszukiwania.
Semantics(
container: true,
excludeSemantics: true,
label: message, // pełne „Wyszukiwanie: 2 wyniki.”
liveRegion: true,
child: Text(message),
)Zachowaj węzeł przy aktualizacji i nie przenoś fokusu do statusu. W demonstracji onEditingComplete: () {} utrzymuje fokus pola po klawiszu Szukaj, a onSubmitted wykonuje prawdziwą funkcję. Observer odczytuje SemanticsData.flagsCollection.isLiveRegion, istniejącą etykietę i FocusManager.primaryFocus z renderera; nie kopiuje oczekiwanego liveRegion z wariantu. Flutter opisuje możliwe pominięcie uprzejmego komunikatu podczas innych wypowiedzi systemu. Dowody z XCTest zawierają osobny natywny odczyt label/value/type/ramki; nie jest to odsłuch VoiceOver.
iOS / SwiftUI
import SwiftUI
import Accessibility
@available(iOS 17.0, *)
struct SearchStatus: View {
@State private var message = "Wyszukiwanie: gotowe."
var body: some View {
VStack {
Button("Szukaj") {
message = "Wyszukiwanie: 2 wyniki."
AccessibilityNotification.Announcement(message).post()
}
Text(message)
}
}
}Powiadomienie odpowiedniego API przekazuje pełną wiadomość bez zmiany fokusu. To minimalny kontekst osadzenia w UI; normalna aplikacja tworzy message z faktycznego wyniku, nie ze stałej liczby. Nie używaj screenChanged do zwykłego wyniku i nie traktuj post() jako dowodu odczytu. Dla wcześniejszego targetu dobierz oficjalne API platformy z właściwą obsługą kolejki; ten fragment wymaga iOS 17.0 według deklaracji dostępności, nie oznacza wykonanego targetu projektu.
Android / Jetpack Compose
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.LiveRegionMode
import androidx.compose.ui.semantics.liveRegion
import androidx.compose.ui.semantics.semantics
@Composable
fun SearchStatus(message: String) {
Text(message, Modifier.semantics {
liveRegion = LiveRegionMode.Polite
})
}message pochodzi ze stanu normalnej funkcji wyszukiwania. Polite nadaje się do zwykłego wyniku; Assertive dobierać tylko do pilnych sytuacji. Częste tykanie timera lub każda minimalna zmiana postępu może przeciążyć odbiorcę. Bez uruchomienia Androida i TalkBack.
React Native / TypeScript
import React, { useEffect, useRef } from 'react';
import { AccessibilityInfo, Platform, Text } from 'react-native';
export function SearchStatus({ message }: { message: string }) {
const previous = useRef(message);
useEffect(() => {
if (previous.current !== message && Platform.OS === 'ios') {
AccessibilityInfo.announceForAccessibilityWithOptions(message, {
queue: true,
});
}
previous.current = message;
}, [message]);
return (
<Text
accessibilityLiveRegion={Platform.OS === 'android' ? 'polite' : undefined}
>
{message}
</Text>
);
}accessibilityLiveRegion dotyczy Androida. Na iOS announcement z queue=true pozwala kolejce zachować wcześniejszą wypowiedź; samo zlecenie nie potwierdza jej odsłuchu. Przykład nie ogłasza początkowego statycznego tekstu i nie zmienia fokusu. Gdy ten sam tekst ma oznaczać nowy, powtórzony wynik, modeluj kolejne wykonanie i przetestuj powiadomienie; równość message nie wykrywa nowej akcji. Nie kompilowano fragmentu.
HTML / CSS / JavaScript
<form id="search-form">
<label for="query">Nazwa produktu</label><input id="query" />
<button>Szukaj</button>
</form>
<p id="status" role="status" aria-atomic="true">Wyszukiwanie: gotowe.</p>
<script>
const form = document.getElementById('search-form');
form.addEventListener('submit', (event) => {
event.preventDefault();
// Tutaj wynik normalnej funkcji; nie dodawaj roli dopiero po zmianie.
document.getElementById('status').textContent = 'Wyszukiwanie: 2 wyniki.';
});
</script>Kontener jest obecny przed wynikiem, pełny kontekst pozostaje wewnątrz. CSS zmienia wygląd, nie zastępuje semantyki. Dla paska postępu pozostaw nazwę i wartość paska oraz osobny uprzejmy status aktualizowany w sensownych etapach. Dla sekwencji używaj logu; dla pilnego błędu można dobrać alert, po sprawdzeniu potrzeby przerwania. Nasza działająca strona oblicza wynik z syntetycznego zapytania i ma good/bad/control, zamiast stałego wyniku z tego krótkiego fragmentu.
| Technologia | Dokumentacja | Kompilacja / analiza | Rzeczywiste działanie |
|---|---|---|---|
| Flutter/Dart | PASS: przegląd oficjalnych API | PASS: Flutter 3.44.9 / Dart 3.12.2, analiza i build iOS | Wykonanie iOS opisane poniżej; VoiceOver i zdarzenia platformy NOT-RUN |
| SwiftUI | PASS: przegląd API Announcement/post i dostępności | NOT-RUN | NOT-RUN |
| Compose/Kotlin | PASS: przegląd semantics/liveRegion | NOT-RUN | NOT-RUN; Android nie był uruchamiany |
| React Native/TS | PASS: przegląd LiveRegion oraz AnnouncementWithOptions | NOT-RUN | NOT-RUN |
| HTML/CSS/JS | PASS: przegląd WAI-ARIA i dialog | Nie ma osobnego builda/typecheck; NOT-RUN | PASS w zakresie 16 DOM/AX, 15 działań, 68 trusted zdarzeń i 8 surowych JPEG; AT NOT-RUN |
Jak sprawdzić
- Ustal, czy zmiana spełnia definicję statusu; zanotuj kontekst i dane przed akcją. Oddziel listę wyników, stan kontrolki i dialog.
- Sprawdź obecność mechanizmu przed aktualizacją: stały region, rola/właściwość lub właściwe API. Odczytaj cały komunikat i kontekst.
- Wpisz
notes, naciśnij klawisz Szukaj/Enter i zapisz zmianę statusu oraz faktyczny fokus przed/po. Zastąp zapytaniezzz, ponów działanie. Good/bad mają tę samą funkcję. - Uruchom kontrolę: po wyszukaniu dialog przejmuje fokus, zamknięcie go przywraca. Sprawdź cykl, reset i fallback.
- Plan AT, NOT-RUN: użyj rzeczywistego VoiceOver/czytnika WWW; sprawdź ogłoszenie pełnego wyniku bez ręcznego szukania komunikatu, brak niepotrzebnego przerwania, brak wyników i powtórzenie po kolejnej akcji. Zapisz kolejkę, preferencje AT, OS/przeglądarkę, rzeczywiste wypowiedzi i rezultat. Wynik odróżnij od samej właściwości i zdarzenia API.
Rzeczywiste wykonanie źródła
Wyniki z 2026-10-04, bez ponowienia badań w migracji.
| Kontrola | Wynik i granice |
|---|---|
| Flutter / build | Analiza, końcowe 67 hostowych testów i build iOS PASS, Flutter 3.44.9 / Dart 3.12.2. |
| iOS XCTest v3 | PASS, 100,537 s / 107,355 s orkiestracji; 30 STATE/TREE, 16 INPUT, 13 końcowych PNG. |
| iOS zakres | Good/bad mają tę samą funkcję, liveRegion=true/false i rzeczywisty FocusManager search-query-focus po Szukaj. W dialogu dialogHasFocus=true, queryHasFocus=false, po Zamknij powrót pola. To fokus wejścia klawiaturowego, bez testu fokusu VoiceOver. |
| Web IAB/macOS | 16 DOM/AX, 15 działań, 68/68 trusted zdarzeń dziennika i osiem JPEG. Fokus query po Enter, close-dialog w kontroli, potem query. To nie deklaracja o wszystkich działaniach CUA ani schowku; schowka nie testowano. |
| Media / integralność | AI obejrzała 13 końcowych PNG, osiem JPEG i 11 historycznych PNG v2; razem 32 obrazy. Bez filmu/audio. Checker własnej fixture bada dowody i hashe, bez ACT lub niezależnego benchmarku. |
Środowisko: iPhone 17 / iOS 26.5 Simulator, Xcode 27.0 / SDK 27.0, 402×874 pt i PNG 1206×2622. Odczyt light/content size large, bez zmiany OS. Kadry i odczyty są sekwencyjne. Właściwość renderera, natywny label, zdarzenie powiadomienia platformy i odsłuch są osobnymi dowodami; dwóch ostatnich nie zebrano.
Zachowana historia nieudanych prób
- Pierwsza analiza FAIL: zbędny import i focusNode/autofocus nieobsługiwane przez CupertinoDialogAction; przed buildem poprawiono przez Focus wokół akcji.
- Driver v1 FAIL kompilacji: XCUIElementType zmieniono na XCUIElement.ElementType; install/runtime v1 NOT-RUN.
- Runtime iOS v2 FAIL: 94,123 s / 102,317 s orkiestracji, zachowane 25 STATE/TREE, 13 INPUT i 11 PNG. Observer z tła był niedostępny po modalu, choć komunikat istniał. Ten sam pasywny observer przeniesiono także do dialogu przed v3. Osobne historyczne SHA i manifests zachowano; pełnej historycznej kopii Dart nie zapisano.
- Przygotowanie z błędnego cwd FAIL; poprawiono z root. Późniejszy formatter exit 1: surowy log i dokładny powód NOT-RECORDED, bo log nadpisano kolejnym formatowaniem. Nie oznaczono tej próby PASS lub NOT-RUN.
Weryfikacja i ograniczenia
Drzewo i renderer pokazują właściwości, odczyty fokusu oraz zwykłe działania potwierdzają funkcję. Nie dowodzą zdarzenia powiadomienia platformy lub wypowiedzi czytnika. AI kwalifikuje zmianę jako status z kontekstu; statyczny screenshot nie pokazuje semantyki. Checker zna własną fixture, nie jest zaślepiony ani niezależnym audytem. Brak danych lub znalezisk nie oznacza zgodności.
Jak sprawdza Clearship
Deterministyczny status-messages-1 analizuje P0: nowe teksty po wysłaniu formularza lub dotknięciu, zmianę kontekstu i fokus. Status rozpoznaje po zmianie tekstu tego samego węzła albo słowniku wyniku, postępu i błędu. Na Androidzie szuka w oknie akcji zdarzeń live-region, announcement, error lub pane. Wskazuje rozpoznany status bez fokusu i zdarzenia, gdy kanał jest obsługiwany i nie utracił zdarzeń.
Kontrolny Android z 8 października 2026 r.: 6/6 usterek, 0/20 fałszywych alarmów, próg spełniony. Wynik „nie znaleziono w zbadanym zakresie” dotyczy wyłącznie osiągniętych akcji bez pominięć. Na iOS zdarzenia są unsupported, więc statusy idą do człowieka: zestaw rozwojowy z 9 października 0/6 i 0/20; kontrolny NOT-RUN, katalog not-measured.
Zdarzenie nie wskazuje węzła i może należeć do innego regionu w tym samym oknie. Metoda nie ocenia czytnika, kolejki, pilności, powtórzeń, statusów po czasie lub wpisywaniu, Toast poza drzewem ani treści webowej. Nieklasyfikowana zmiana, brak obserwacji i utracone zdarzenia wymagają człowieka. Ani zdarzenie Androida, ani liveRegion z edukacyjnej fixture nie potwierdzają wypowiedzi VoiceOver/TalkBack.