4.1.3Poziom AA

Komunikaty o stanie

Status Messages

Udostępnij komunikat o wyniku, oczekiwaniu, postępie lub błędzie programowo, aby technologia asystująca mogła przedstawić go bez nadawania fokusu.

Komu pomaga
NiewidzenieSł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
Solidność / 4.1
Stan researchu
Draft AI. Bez przeglądu człowieka.
Redakcja artykułu
· wersja robocza
Na tej stronie

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.

iOS good po Szukaj: dwa wyniki i kursor w polu Nazwa produktu.

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.

iOS bad po tym samym wyszukaniu: te same dwa wyniki i komunikat.

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.

Web control: dialog Wynik wyszukiwania z przyciskiem Zamknij.

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ć

  1. Ustal, czy zmiana spełnia definicję statusu; zanotuj kontekst i dane przed akcją. Oddziel listę wyników, stan kontrolki i dialog.
  2. Sprawdź obecność mechanizmu przed aktualizacją: stały region, rola/właściwość lub właściwe API. Odczytaj cały komunikat i kontekst.
  3. Wpisz notes, naciśnij klawisz Szukaj/Enter i zapisz zmianę statusu oraz faktyczny fokus przed/po. Zastąp zapytanie zzz, ponów działanie. Good/bad mają tę samą funkcję.
  4. Uruchom kontrolę: po wyszukaniu dialog przejmuje fokus, zamknięcie go przywraca. Sprawdź cykl, reset i fallback.
  5. 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.

Powiązane kryteria