WCAG-succescriteria · Level AA

WCAG 4.1.3: Statusberichten

WCAG 4.1.3 vereist dat statusberichten — zoals bevestigingen van formulierverzendingen, foutmeldingen en winkelwagenupdates — programmatisch bepaalbaar zijn via rol of eigenschap, zodat ondersteunende technologieën ze kunnen aankondigen zonder dat de gebruiker de focus hoeft te verplaatsen. Dit zorgt ervoor dat gebruikers die afhankelijk zijn van schermlezers belangrijke feedback ontvangen, zelfs wanneer de focus niet naar het bericht verschuift.

Wat Deze Regel Betekent

WCAG Succescriterium 4.1.3 Statusberichten (niveau AA, geïntroduceerd in WCAG 2.1 en overgenomen in WCAG 2.2) stelt: "In content die is geïmplementeerd met behulp van opmaak­talen, kunnen statusberichten programmatisch worden bepaald via role of properties, zodat ze aan de gebruiker kunnen worden gepresenteerd door ondersteunende technologieën zonder focus te ontvangen."

In praktische termen betekent dit dat wanneer je interface een bericht toont om de gebruiker te informeren over een resultaat — een zoekopdracht die resultaten oplevert, een formulier dat succesvol is verzonden, een item dat aan een winkelwagen is toegevoegd, een fout na validatie, of een proces dat is voltooid — dat bericht moet worden blootgesteld aan ondersteunende technologie (AT) op een manier die niet vereist dat de gebruiker ernaartoe navigeert. De belangrijkste beperking is dat het bericht niet afhankelijk mag zijn van het ontvangen van toetsenbord- of programmatische focus om te worden aangekondigd.

Het criterium is van toepassing op alle content die in een opmaaktaal is geschreven (HTML, SVG, enz.) en bestrijkt vier brede categorieën statusberichten die door WCAG worden erkend:

  • Succesberichten: bevestigingen zoals "Your order has been placed" of "Settings saved successfully."
  • Fout- of waarschuwingsberichten: validatiefeedback zoals "Email address is not valid" of "Please complete all required fields."
  • Voortgangs- of statusupdates: berichten zoals "Loading… please wait" of "Upload 60% complete."
  • Contextwijzigingsberichten: dynamische updates zoals "5 results found" of "3 items in your cart."

Een bericht voldoet aan dit criterium wanneer het een passende ARIA live region-role of -property krijgt — meestal role="status", role="alert", aria-live="polite" of aria-live="assertive" — zodat schermlezers het automatisch aankondigen wanneer het verschijnt of verandert, zonder dat de gebruiker ernaartoe hoeft te tabben.

Een bericht voldoet niet wanneer het dynamisch in de DOM wordt geïnjecteerd (via JavaScript) maar geen live-regionsemantiek heeft, waardoor schermlezergebruikers zich er niet van bewust zijn dat er iets op de pagina is veranderd.

Een belangrijke uitzondering die door WCAG wordt gedefinieerd: als een statusbericht wordt afgeleverd door de focus naar het bericht­element te verplaatsen (bijvoorbeeld een dialoog die focus krijgt, of een alert()-dialoog), dan is het criterium niet van toepassing op die interactie — de focusverplaatsing zelf voldoet aan de behoefte. Het criterium gaat specifiek over berichten die verschijnen zonder een focuswijziging.

Waarom Het Belangrijk Is

Schermlezergebruikers navigeren pagina’s lineair of door te springen tussen landmarks, koppen en interactieve bedieningselementen. Wanneer een pagina stilletjes een "Your message has been sent"-banner in de DOM injecteert zonder die aan te kondigen, heeft een blinde gebruiker geen manier om te weten dat de actie is geslaagd. Ze kunnen het formulier opnieuw verzenden, eindeloos wachten of de taak simpelweg in verwarring verlaten. Hetzelfde probleem treft gebruikers met een beperkt gezichtsvermogen die vertrouwen op zoom en vergroting — een statusbericht dat buiten hun huidige viewport verschijnt, blijft onopgemerkt tenzij het hoorbaar wordt aangekondigd.

Motorisch beperkte gebruikers die vertrouwen op switch access of eye-trackingtechnologie worden evenzeer getroffen. Deze gebruikers kunnen vaak niet snel een pagina scannen op nieuwe content; ze zijn afhankelijk van AT om relevante informatie naar hen toe te brengen. Zonder live-regionaankondigingen wordt elke statusupdate een speld-in-een-hooibergprobleem.

Cognitief diverse gebruikers profiteren ook: duidelijke, directe feedback bevestigt dat een actie is voltooid en vermindert de cognitieve belasting van onzekerheid. Wanneer AT "Item added to cart" aankondigt, hoeft een gebruiker met een cognitieve beperking niet visueel naar bevestiging te zoeken voordat hij verdergaat.

Een concreet scenario uit de echte wereld: een blinde gebruiker vult een meerledig verzekeringsaanvraagformulier in op de website van een Turkse bank. Ze verzenden het formulier, maar client-side validatie wordt geactiveerd en toont vijf rode foutmeldingen bij de velden. Omdat er geen live region aanwezig is, blijft de schermlezer van de gebruiker (JAWS of NVDA) stil. De gebruiker gaat ervan uit dat het formulier succesvol is verzonden en sluit het browsertabblad — en verliest de volledige aanvraag. Met een correct geïmplementeerde role="alert" of een samenvattende live region zou de AT onmiddellijk "3 errors found. Please review the highlighted fields" hebben aangekondigd, zodat de gebruiker de problemen kon corrigeren.

Vanuit zakelijk perspectief schaadt ontoegankelijke statusfeedback de conversieratio’s direct. Ongeveer 1,3 miljard mensen wereldwijd leven met een of andere vorm van beperking, en ervoor zorgen dat statusberichten toegankelijk zijn, vermindert het aantal afgebroken formulieren, het volume aan supporttickets en het juridische risico dat gepaard gaat met niet-naleving. Voor Turkse organisaties kan ontoegankelijkheid ook een schending vormen van de Disability Law No. 5378 en de nieuwere verplichtingen uit de Presidentiële Circulaire die later in dit artikel worden beschreven.

Gerelateerde Axe-core-regels

  • aria-live (geautomatiseerd): De axe-core-regel aria-live controleert of elementen die het attribuut aria-live gebruiken, een van de geldige waarden hebben: off, polite of assertive. De regel markeert elementen waarbij aria-live is ingesteld op een ongeldige of verkeerd gespelde waarde (bijv. aria-live="true" of aria-live="yes"), wat ertoe zou leiden dat de live region stilletjes wordt genegeerd door ondersteunende technologie. Deze regel zorgt ervoor dat wanneer ontwikkelaars een live region willen maken, het attribuut correct is gevormd zodat schermlezers het daadwerkelijk respecteren.
  • Handmatig testen (vereist voor volledige dekking): Geautomatiseerde tools kunnen WCAG 4.1.3 niet volledig auditen omdat de kernfoutmodus een ontbrekende live region is op een dynamisch gegenereerd bericht — een afwezigheid die statische code-analyse moeilijk betrouwbaar kan detecteren. Een tool die de DOM scant vóór een gebruikersinteractie kan niet weten welke elementen later statusberichten zullen worden. Axe-core markeert mogelijk geen <div> die na een klik op een knop geïnjecteerde tekst zal ontvangen, omdat de div op scantijd leeg is of nog niet bestaat. Handmatig testen met een live schermlezer is daarom essentieel: een tester moet het statusbericht activeren en luisteren naar een aankondiging. Als er niets wordt aangekondigd en de focus niet is verplaatst, voldoet het criterium niet, ongeacht wat geautomatiseerde tools rapporteren.

Hoe te Testen

  1. Geautomatiseerde scan met axe DevTools of Lighthouse: Installeer de browserextensie axe DevTools (Chrome of Firefox) en voer een volledige paginascan uit. Zoek naar eventuele overtredingen onder de regel aria-live. Controleer ook op problemen die zijn gemarkeerd als verkeerd gebruik van aria-roledescription of aria-atomic. Onthoud dat een schone geautomatiseerde scan niet betekent dat 4.1.3 wordt gehaald — het betekent alleen dat er geen onjuist gevormde live-regionattributen zijn gevonden. Noteer alle gemarkeerde elementen en los ze op voordat je doorgaat naar de handmatige stappen.
  2. Identificeer alle dynamische statusberichten: Bekijk de pagina en de JavaScript om elke gebruikersinteractie te inventariseren die een statusbericht oplevert zonder paginavernieuwing of focuswijziging. Veelvoorkomende voorbeelden zijn: feedback bij het verzenden van formulieren, badges met winkelwagenhoeveelheden, aantallen zoekresultaten, voortgang van bestandsuploads, bevestigingen van nieuwsbriefinschrijvingen, updates van filterresultaten en waarschuwingen voor sessieverloop.
  3. Handmatige test met NVDA + Firefox: Open de pagina met NVDA actief. Activeer elk geïnventariseerd statusbericht (verzend een formulier, voeg een item toe aan een winkelwagen, voer een zoekopdracht uit). Luister aandachtig — NVDA moet de berichttekst automatisch binnen een seconde of twee aankondigen. Als je niets hoort en de focus niet is verplaatst, voldoet het criterium niet. Gebruik NVDA’s Speech Viewer (Tools > Speech Viewer) om een tekstlog van alle aankondigingen te zien voor nauwkeurigheid.
  4. Handmatige test met JAWS + Chrome: Herhaal dezelfde interacties met JAWS. Bevestig dat berichten met role="status" met een beleefde onderbreking worden aangekondigd en dat berichten met role="alert" onmiddellijk onderbreken. Controleer dat JAWS hetzelfde bericht niet meerdere keren aankondigt door onjuiste instellingen van aria-atomic of aria-relevant.
  5. Handmatige test met VoiceOver + Safari (macOS/iOS): Gebruik VoiceOver op macOS met Safari en herhaal dezelfde interacties. Merk op dat VoiceOver’s behandeling van aria-live enigszins kan verschillen van schermlezers op Windows — bevestig dat aankondigingen plaatsvinden en zinvol zijn geformuleerd.
  6. Inspecteer de DOM na interactie: Gebruik de DevTools van de browser, activeer het statusbericht en inspecteer vervolgens het element dat is verschenen. Bevestig dat het role="status", role="alert" of een geldig aria-live-attribuut heeft. Als het bericht als platte tekst wordt geïnjecteerd in een ongemarkeerde container, voldoet het niet. Controleer ook dat de live-regioncontainer in de DOM bestond voordat het bericht werd geïnjecteerd — schermlezers kondigen alleen wijzigingen aan in reeds bestaande live regions, niet elementen die vers in de DOM worden ingevoegd.

Hoe te Herstellen

Samenvatting Formuliervalidatie — Onjuist

<!-- Error summary injected after failed submission -->
<div id='error-summary' class='error-box'>
  <p>Please fix the following errors before submitting:</p>
  <ul>
    <li>Email address is required.</li>
    <li>Password must be at least 8 characters.</li>
  </ul>
</div>
<!-- Problem: no role or aria-live attribute; screen readers will not announce this -->

Samenvatting Formuliervalidatie — Juist

<!-- role="alert" causes immediate announcement when content is injected -->
<div id='error-summary' role='alert' class='error-box'>
  <p>Please fix the following errors before submitting:</p>
  <ul>
    <li>Email address is required.</li>
    <li>Password must be at least 8 characters.</li>
  </ul>
</div>
<!-- The container must be present in the DOM before JavaScript injects content into it -->

Aantal Items in Winkelwagen — Onjuist

<!-- Cart badge updated via JavaScript after user clicks "Add to cart" -->
<button id='add-to-cart'>Add to Cart</button>
<span id='cart-count' class='badge'>0</span>
<!-- Problem: cart-count has no live region; update from 0 to 1 is silent to screen readers -->

Aantal Items in Winkelwagen — Juist

<!-- Separate polite live region announces cart update without interrupting the user -->
<button id='add-to-cart'>Add to Cart</button>
<span id='cart-count' class='badge' aria-hidden='true'>1</span>

<!-- Visually hidden live region provides the announcement -->
<div
  id='cart-status'
  role='status'
  aria-live='polite'
  aria-atomic='true'
  class='visually-hidden'
>
  <!-- JavaScript updates this text: "1 item in your cart" -->
</div>
<!-- aria-atomic="true" ensures the full sentence is read, not just the changed number -->

Aantal Zoekresultaten — Onjuist

<!-- Results count rendered after AJAX search -->
<p id='results-info'>Showing 24 of 140 results for "laptop"</p>
<!-- Problem: element is replaced entirely via innerHTML; no live region present -->

Aantal Zoekresultaten — Juist

<!-- Live region pre-exists in the DOM; JavaScript updates its content after search -->
<p
  id='results-info'
  role='status'
  aria-live='polite'
  aria-atomic='true'
>
  Showing 24 of 140 results for "laptop"
</p>
<!-- role="status" implies polite + atomic; explicit attributes added for clarity and compatibility -->

Voortgang Bestandsupload — Onjuist

<!-- Progress percentage injected into DOM during upload -->
<div class='progress-container'>
  <div class='progress-bar' style='width: 60%'></div>
  <span id='progress-text'>60%</span>
</div>
<!-- Problem: percentage updates are visual only; no announcement to AT -->

Voortgang Bestandsupload — Juist

<!-- Use aria-valuenow on a progressbar role, plus a separate polite status for milestones -->
<div class='progress-container'>
  <div
    role='progressbar'
    aria-valuenow='60'
    aria-valuemin='0'
    aria-valuemax='100'
    aria-label='File upload progress'
    class='progress-bar'
    style='width: 60%'
  >
  </div>
</div>
<div
  id='upload-status'
  role='status'
  aria-live='polite'
  aria-atomic='true'
  class='visually-hidden'
>
  Upload complete. Your file has been saved.
</div>
<!-- Only announce key milestones (25%, 50%, 75%, complete) to avoid over-announcement -->

Veelvoorkomende Fouten

  • Het live-regionelement aanmaken op hetzelfde moment als het bericht: Het toevoegen van role="alert" aan een zojuist gemaakt DOM-element en het direct vullen ervan zal vaak mislukken omdat schermlezers de nieuwe node nog niet als live region hebben geregistreerd. Render de lege container altijd bij het laden van de pagina en werk de tekstinhoud pas bij wanneer het statusbericht klaar is.
  • aria-live="assertive" gebruiken voor niet-dringende berichten: Assertieve live regions onderbreken wat de schermlezer op dat moment leest. Het gebruik van assertive voor routinematige berichten zoals "Item added to cart" zal gebruikers frustreren doordat hun leesflow voortdurend wordt onderbroken. Reserveer assertive (of role="alert") voor echt tijdkritieke fouten of waarschuwingen; gebruik polite voor alles daarbuiten.
  • aria-live instellen op een ongeldige waarde zoals "true" of "1": Alleen "off", "polite" en "assertive" zijn geldige waarden. Ongeldige waarden schakelen de live region stilletjes uit zonder browserwaarschuwing, waardoor de axe-core-regel aria-live het element markeert.
  • Alleen vertrouwen op kleur of iconen om status te communiceren: Een groen vinkje of een rode rand die in de pagina wordt geïnjecteerd, is een puur visueel signaal. Zonder begeleidende tekst in een live region ontvangen schermlezergebruikers geen informatie. Combineer visuele indicatoren altijd met een tekstgebaseerde live-regionaankondiging.
  • aria-atomic="true" weglaten bij het bijwerken van een deel van een zin: Als JavaScript alleen een getal in een zin bijwerkt (bijv. het veranderen van "3" naar "4" in "4 items in cart"), zullen sommige schermlezers alleen de gewijzigde node aankondigen en "4" zonder context zeggen. aria-atomic="true" instellen op de container vertelt AT dat de volledige region als een geheel moet worden voorgelezen.
  • Elk incrementeel voortgangs­update aankondigen: Elke seconde een nieuw statusbericht injecteren tijdens een bestandsupload ("10%", "11%", "12%"…) overspoelt de gebruiker met aankondigingen en maakt de schermlezer onbruikbaar. Kondig alleen betekenisvolle mijlpalen of de uiteindelijke voltooiingsstatus aan.
  • De live-regioncontainer plaatsen in elementen die voorwaardelijk verborgen zijn met display:none of visibility:hidden: Een live region binnen een verborgen ouder is inert en zal niets aankondigen, zelfs als het live-regionelement zelf zichtbaar is. Zorg ervoor dat de ancestor chain van de live region niet verborgen is op het moment van de aankondiging.
  • role="alert" gebruiken voor succesberichten die na navigatie verschijnen: Wanneer een statusbericht een paginavernieuwing overleeft (bijv. een flashbericht dat server-side wordt gerenderd na een redirect), kan het gebruik van role="alert" leiden tot dubbele of te agressieve aankondigingen. Overweeg role="status" of verplaats de focus naar de berichtregio, zodat de aankondiging zich op een natuurlijke manier in de navigatie van de gebruiker voegt.
  • Aannemen dat tooltip- of toastbibliotheken live regions automatisch afhandelen: Veel populaire UI-componentbibliotheken (bijv. Bootstrap Toasts, aangepaste tooltipsystemen) voegen standaard geen ARIA live-regionattributen toe. Inspecteer altijd de gerenderde HTML van componenten van derden en voeg role="status" of aria-live toe waar dit ontbreekt.
  • Niet testen met echte schermlezers vóór release: Geautomatiseerde tools zoals axe kunnen een ontbrekende live region op een dynamisch statusbericht niet detecteren. Alleen vertrouwen op geautomatiseerde audits zal 4.1.3-fouten onopgemerkt laten. Maak handmatig testen met schermlezers — met NVDA, JAWS en VoiceOver — tot een standaardonderdeel van je QA-proces voor elke feature die dynamische feedback genereert.

Relatie met de Toegankelijkheidsregelgeving van Turkije

De Turkse Presidentiële Circulaire nr. 2025/10, gepubliceerd in het Staatsblad nr. 32933 op 21 June 2025, stelt bindende digitale toegankelijkheidsverplichtingen vast voor een brede reeks organisaties die in Turkije actief zijn. De Circulaire verwijst naar WCAG 2.1 en WCAG 2.2 als de technische standaard voor naleving en vereist specifiek conformiteit op niveau AA als basislijn voor de meeste betrokken entiteiten.

WCAG 4.1.3 Status Messages is een criterium op niveau AA, wat betekent dat het rechtstreeks binnen de verplichte reikwijdte van de Circulaire valt voor alle betrokken entiteiten. De volgende typen organisaties worden expliciet genoemd:

  • Publieke instellingen en agentschappen — alle centrale en lokale overheidsorganen, ministeries, gemeenten en staatsbedrijven moeten AA-conformiteit behalen voor hun digitale diensten.
  • Banken en financiële instellingen — gereguleerd door de Banking Regulation and Supervision Agency (BDDK), bieden deze entiteiten kritieke online diensten (internetbankieren, leningsaanvragen, kaartbeheer) waar dynamische statusfeedback — zoals transactiebevestigingen, foutmeldingen en saldo-updates — zeer gebruikelijk is. Fouten in 4.1.3 belemmeren direct de financiële onafhankelijkheid van gebruikers met een beperking.
  • E-commerceplatforms — online retail is een primaire usecase voor statusberichten (winkelwagenupdates, bestelbevestigingen, voorraadmeldingen). E-commerce-exploitanten moeten ervoor zorgen dat deze dynamische meldingen voor alle gebruikers toegankelijk zijn.
  • Ziekenhuizen en zorginstellingen — systemen voor het boeken van afspraken, portalen voor testresultaten en patiëntdashboards gebruiken vaak statusberichten. Ontoegankelijke gezondheidsinformatie kan ernstige gevolgen hebben voor patiënten met een beperking.
  • Telecombedrijven met 200,000 of meer abonnees — portalen voor accountbeheer, factureringsmeldingen en service­statusupdates moeten allemaal voldoen aan niveau AA, inclusief 4.1.3.
  • Reisbureaus en particuliere vervoersbedrijven — boekingsbevestigingen, feedback bij stoelkeuze en berichten over reiswijzigingen zijn kernonderdelen van de gebruikerservaring en moeten programmatisch bepaalbaar zijn.
  • Particuliere scholen en onderwijsinstellingen die zijn gemachtigd door het Ministry of National Education (MoNE) — leeromgevingen, cijferportalen en inschrijfplatforms moeten statusberichten op een toegankelijke manier blootleggen om alle studenten en ouders te bedienen.

Het Accessibility Logo (Erişilebilirlik Logosu), uitgegeven door het Ministry of Family and Social Services, is het officiële certificeringsmerk voor digitaal toegankelijke Turkse websites en applicaties. Om in aanmerking te komen voor het Logo moet een organisatie volledige conformiteit op niveau AA aantonen — waaronder 4.1.3. Aangezien statusberichten alomtegenwoordig zijn in moderne webinterfaces, moet elke organisatie die de Erişilebilirlik Logosu wil verkrijgen 4.1.3 behandelen als een verplicht audititem en live-regionpatronen consequent implementeren in alle gebieden met dynamische content.

Organisaties die niet voldoen, lopen het risico op bestuurlijke maatregelen onder de Circulaire, verlies van de geschiktheid voor het Accessibility Logo en reputatieschade in een markt die steeds meer aandacht heeft voor toegankelijkheid. Het correct implementeren van WCAG 4.1.3 is niet slechts een technische afvink­oefening — het is een concrete investering in gelijke digitale toegang voor de ongeveer 8,5 miljoen Turkse burgers die met een beperking leven.