- Poziom
- A
- Od wersji
- WCAG 2.0
- Pozycje
- 66 / 193
4.1.1 Poprawność kodu
Kod strony musi być poprawnie zbudowany (zamknięte znaczniki, prawidłowo zagnieżdżone elementy, żadnego atrybutu ani id użytego dwa razy), żeby oprogramowanie, które go czyta, nie musiało zgadywać.
/ Czego wymaga
To kryterium pochodzi z czasów, gdy czytniki ekranu same analizowały HTML i potykały się o błędny kod. Od treści zapisanej w języku znaczników wymaga czterech rzeczy: elementy mają pełne znaczniki początkowe i końcowe, są zagnieżdżone zgodnie ze swoją specyfikacją, żaden element nie ma dwa razy tego samego atrybutu, a każde id jest unikalne, chyba że specyfikacja dopuszcza inaczej. Gdy kod był błędny, każde narzędzie naprawiało go po swojemu i etykieta albo tabela mogła zostać przypisana nie temu elementowi.
Dziś przeglądarka naprawia kod według ustalonego algorytmu i przekazuje technologii wspomagającej gotowe drzewo, dlatego W3C usunęło 4.1.1 z WCAG 2.2. Dla WCAG 2.0 i 2.1 opublikowało uwagę, że kryterium należy uznawać za zawsze spełnione dla treści w HTML lub XML. Znaczenie ma nadal skutek: zduplikowane id, przez które etykieta albo odwołanie aria-labelledby wskazuje niewłaściwy element, zgłasza się teraz w ramach kryterium 1.3.1 lub 4.1.2.
W3C usunęło to kryterium w WCAG 2.2 jako nieaktualne; pozostaje ono częścią WCAG 2.0 i 2.1, gdzie według W3C należy je traktować jako zawsze spełnione dla treści w HTML i XML.
/ Jak strony go nie spełniają
- Ta sama wartość id występuje na dwóch lub więcej elementach jednej strony.
- Komponent, na przykład formularz albo okno dialogowe, jest wstawiony dwa razy i każde id w jego wnętrzu się powtarza.
- Element został otwarty i nigdy nie został zamknięty albo dwa elementy zamknięto w złej kolejności.
- Element znajduje się tam, gdzie specyfikacja na to nie pozwala, na przykład div wewnątrz p albo link wewnątrz linku.
- Element ma dwa razy ten sam atrybut, na przykład dwa atrybuty class.
/ Jak sprawdzić samodzielnie
- Sprawdź stronę w darmowym walidatorze W3C Nu Html Checker, podając adres albo wklejając źródło.
- Przefiltruj wyniki pod kątem czterech rodzajów komunikatów: zduplikowane ID, niezamknięty element, element niedozwolony jako dziecko oraz zduplikowany atrybut.
- W konsoli przeglądarki wypisz wartości id, które na wyrenderowanej stronie występują więcej niż raz. Treść dodana skryptem nigdy nie pojawia się w surowym źródle.
- Dla każdego zduplikowanego id wyszukaj na stronie atrybuty for, aria-labelledby, aria-describedby i aria-controls, które używają tej wartości. To te duplikaty zmieniają to, co słyszy użytkownik.
/ Jak to naprawić
- Nadaj każdemu id wartość unikalną na stronie, zaczynając od tych, na które wskazują atrybuty for, aria-labelledby, aria-describedby i aria-controls.
- Tam, gdzie komponent jest renderowany więcej niż raz, buduj jego id z klucza danej instancji albo z generowanego przyrostka, a nie ze stałego napisu.
- Zamknij każdy element, który wymaga znacznika końcowego, i popraw kolejność zachodzących na siebie znaczników końcowych.
- Przenieś treść blokową poza elementy p i nigdy nie umieszczaj jednego elementu a ani jednego przycisku wewnątrz drugiego.
- Usuń powtórzone atrybuty, tak żeby każdy element miał jeden atrybut class, id lub style.
/ Co sprawdza nasz skaner
Dwa testy patrzą wyłącznie na id. Test duplicate-id czyta wyrenderowaną stronę i zgłasza id użyte więcej niż raz w tym samym drzewie, licząc osobno dokument i każdy shadow root. F77 z HTML_CodeSniffer zgłasza każdą wartość id powtórzoną w dokumencie. Żaden nie bada znaczników końcowych, zagnieżdżenia ani powtórzonych atrybutów i żaden nie powie, czy duplikat faktycznie psuje etykietę albo odwołanie ARIA.
/ Kto je łamie, według naszych pomiarów
| Podmiot | Sektor | Wystąpienia | Wynik |
|---|---|---|---|
| Poznań | city · PL | 154 | 1 |
| Stuttgart | city · DE | 88 | 6 |
| Gdańsk | city · PL | 74 | 2 |
| Bundesrat | government · DE | 70 | 14 |
| Phoenix | city · US | 67 | 1 |
| Seattle | city · US | 66 | 12 |
| Wrocław | city · PL | 40 | 2 |
| Baltimore | city · US | 32 | 7 |
| Radom | city · PL | 26 | 2 |
| State of Texas | government · US | 26 | 22 |
| Internal Revenue Service | government · US | 22 | 20 |
| Amtrak | transport · US | 20 | 4 |
| Centrum e-Zdrowia | health · PL | 14 | 60 |
| Politechnika Łódzka | education · PL | 12 | 5 |
| Szczecin | city · PL | 12 | 2 |
| Robert Koch-Institut | health · DE | 11 | 10 |
| Cook County | government · US | 10 | 13 |
| Politechnika Śląska | education · PL | 10 | 2 |
| Rzeszów | city · PL | 10 | 8 |
| Freie Universität Berlin | education · DE | 8 | 7 |
| State of Washington | government · US | 7 | 9 |
| Bundesregierung | government · DE | 6 | 4 |
| Statistisches Bundesamt | government · DE | 6 | 9 |
| Uniwersytet Gdański | education · PL | 6 | 18 |
| Uniwersytet Wrocławski | education · PL | 6 | 15 |
| Uniwersytet Łódzki | education · PL | 6 | 9 |
| New York City | city · US | 5 | 37 |
| Bundesministerium der Finanzen | government · DE | 4 | 13 |
| Hannover | city · DE | 4 | 10 |
| Krajowa Administracja Skarbowa | government · PL | 4 | 5 |
| Nashville | city · US | 4 | 12 |
| Nürnberg | city · DE | 4 | 2 |
| Politechnika Poznańska | education · PL | 4 | 4 |
| Szkoła Główna Handlowa | education · PL | 4 | 12 |
| Warszawski Uniwersytet Medyczny | education · PL | 4 | 13 |
| Berliner Verkehrsbetriebe | transport · DE | 3 | 21 |
| Bundesverfassungsgericht | government · DE | 3 | 18 |
| Senat RP | government · PL | 3 | 24 |
| Austin | city · US | 2 | 20 |
| Białystok | city · PL | 2 | 37 |
| Boston | city · US | 2 | 6 |
| Bundesministerium des Innern | government · DE | 2 | 10 |
| Bydgoszcz | city · PL | 2 | 7 |
| Centers for Disease Control | health · US | 2 | 8 |
| Department of Labor | government · US | 2 | 46 |
| Deutsche Bahn | transport · DE | 2 | 5 |
| Gdynia | city · PL | 2 | 7 |
| Hamburg | city · DE | 2 | 23 |
| Katowice | city · PL | 2 | 10 |
| Köln | city · DE | 2 | 16 |
| Lublin | city · PL | 2 | 17 |
| Opole | city · PL | 2 | 8 |
| Pacjent.gov.pl | health · PL | 2 | 9 |
| Philadelphia | city · US | 2 | 8 |
| Polski Instytut Sztuki Filmowej | culture · PL | 2 | 7 |
| State of Florida | government · US | 2 | 8 |
| Toruń | city · PL | 2 | 11 |
| Uniwersytet Jagielloński | education · PL | 2 | 1 |
| Uniwersytet Warszawski | education · PL | 2 | 4 |
| Uniwersytet im. Adama Mickiewicza | education · PL | 2 | 12 |
| Urząd Ochrony Danych Osobowych | government · PL | 2 | 6 |
| Düsseldorf | city · DE | 1 | 9 |
| Generalna Dyrekcja Dróg Krajowych i Autostrad | transport · PL | 1 | 34 |
| Instytut Pamięci Narodowej | government · PL | 1 | 43 |
| Politechnika Warszawska | education · PL | 1 | 12 |
| Portland | city · US | 1 | 87 |
Jedna strona na podmiot, mierzona automatycznie w tygodniowym cyklu. Jeśli podmiot coś naprawił od ostatniego pomiaru, zmiana będzie widoczna przy następnym, a każdy podmiot może odpowiedzieć na swojej stronie.
/ Pytania o to kryterium
Czy kryterium 4.1.1 jest nadal wymagane?
Nie w WCAG 2.2, skąd zostało usunięte jako nieaktualne. Nadal figuruje w WCAG 2.0 i 2.1, a także w normach opartych na wersji 2.1, takich jak EN 301 549 w wersji 3.2.1. Dla tych wersji W3C stwierdziło, że kryterium należy uznawać za zawsze spełnione dla treści w HTML lub XML, więc sam błąd walidacji nie jest już niezgodnością.
Dlaczego kryterium 4.1.1 usunięto z WCAG 2.2?
Napisano je po to, żeby chronić technologie wspomagające, które analizowały HTML bezpośrednio i mogły się pogubić w błędnym kodzie. Dziś technologia wspomagająca czyta drzewo dostępności zbudowane przez przeglądarkę, a przeglądarki naprawiają kod w ustandaryzowany sposób. W3C uznało, że te problemy już nie istnieją albo obejmują je inne kryteria, głównie 1.3.1 i 4.1.2.
Czy zduplikowane id to nadal problem z dostępnością?
Bywa. Gdy dwa elementy mają to samo id, etykieta z atrybutem for albo odwołanie aria-labelledby lub aria-describedby trafia w pierwszy z nich. Pole może wtedy zostać zapowiedziane nazwą innego pola. W WCAG 2.2 zgłasza się to jako niespełnienie kryterium 1.3.1 lub 4.1.2. Zduplikowane id, do którego nic się nie odwołuje, nikomu nie szkodzi.
