Criteri di successo WCAG · Level AA
WCAG 4.1.3: Messaggi di stato
WCAG 4.1.3 richiede che i messaggi di stato — come le conferme di invio dei moduli, le notifiche di errore e gli aggiornamenti del carrello — siano determinabili a livello di programmazione tramite ruolo o proprietà, in modo che le tecnologie assistive possano annunciarli senza richiedere all’utente di spostare il focus. Questo garantisce che gli utenti che si affidano ai lettori di schermo ricevano feedback importanti anche quando il focus non si sposta sul messaggio.
Cosa Significa Questa Regola
Il Criterio di Successo WCAG 4.1.3 Status Messages (Livello AA, introdotto in WCAG 2.1 e mantenuto in WCAG 2.2) afferma: "In contenuti implementati usando linguaggi di markup, i messaggi di stato possono essere determinati in modo programmato tramite ruolo o proprietà, in modo che possano essere presentati all'utente dalle tecnologie assistive senza ricevere il focus."
In termini pratici, questo significa che ogni volta che la tua interfaccia produce un messaggio per informare l'utente di un risultato — una ricerca che restituisce risultati, l'invio riuscito di un form, un elemento aggiunto a un carrello, un errore che si verifica dopo la validazione o il completamento di un processo — quel messaggio deve essere esposto alla tecnologia assistiva (AT) in modo che l'utente non debba navigare fino ad esso. Il vincolo chiave è che il messaggio non deve dipendere dal ricevere il focus da tastiera o programmatico per essere annunciato.
Il criterio si applica a qualsiasi contenuto scritto in un linguaggio di markup (HTML, SVG, ecc.) e copre quattro ampie categorie di messaggi di stato riconosciute da WCAG:
- Messaggi di successo: conferme come "Il tuo ordine è stato effettuato" o "Impostazioni salvate correttamente."
- Messaggi di errore o avviso: feedback di validazione come "L'indirizzo email non è valido" o "Completa tutti i campi obbligatori."
- Aggiornamenti di avanzamento o di stato: messaggi come "Caricamento in corso… attendere prego" o "Caricamento completato al 60%."
- Messaggi di cambio di contesto: aggiornamenti dinamici come "Trovati 5 risultati" o "3 articoli nel tuo carrello."
Un messaggio rispetta questo criterio quando gli viene assegnato un ruolo o una proprietà ARIA di live region appropriati — più comunemente role="status", role="alert", aria-live="polite" o aria-live="assertive" — in modo che i lettori di schermo lo annuncino automaticamente quando appare o cambia, senza che l'utente debba spostarsi su di esso con il tasto Tab.
Un messaggio non rispetta il criterio quando viene iniettato dinamicamente nel DOM (tramite JavaScript) ma non ha alcuna semantica di live region, lasciando gli utenti di lettori di schermo ignari del fatto che qualcosa sia cambiato nella pagina.
Un'importante eccezione definita da WCAG: se un messaggio di stato viene fornito spostando il focus sull'elemento del messaggio (per esempio, una finestra di dialogo che riceve il focus o una finestra di dialogo alert()), il criterio non si applica a tale interazione — lo spostamento del focus soddisfa di per sé l'esigenza. Il criterio riguarda specificamente i messaggi che compaiono senza un cambio di focus.
Perché È Importante
Gli utenti di lettori di schermo navigano le pagine in modo lineare o saltando tra landmark, intestazioni e controlli interattivi. Quando una pagina inietta silenziosamente un banner "Il tuo messaggio è stato inviato" nel DOM senza annunciarlo, un utente cieco non ha modo di sapere che l'azione è riuscita. Potrebbe inviare di nuovo il form, aspettare indefinitamente o semplicemente abbandonare l'attività confuso. Lo stesso problema riguarda gli utenti ipovedenti che si affidano a zoom e ingrandimento — un messaggio di stato che appare al di fuori della loro viewport corrente passa inosservato a meno che non venga annunciato vocalmente.
Gli utenti con disabilità motorie che si affidano a sistemi di accesso a scansione o a tecnologie di eye-tracking sono ugualmente interessati. Spesso questi utenti non possono scansionare rapidamente una pagina alla ricerca di nuovi contenuti; dipendono dall'AT perché porti loro le informazioni rilevanti. Senza annunci tramite live region, ogni aggiornamento di stato diventa un ago in un pagliaio.
Anche gli utenti con diversità cognitive ne traggono beneficio: un feedback chiaro e immediato conferma che un'azione è stata completata e riduce il carico cognitivo dell'incertezza. Quando l'AT annuncia "Articolo aggiunto al carrello", un utente con disabilità cognitiva non deve cercare visivamente una conferma prima di procedere.
Uno scenario concreto nel mondo reale: un utente cieco sta compilando una domanda di assicurazione con più campi sul sito web di una banca turca. Invia il form, ma la validazione lato client si attiva e visualizza cinque messaggi di errore in rosso vicino ai campi. Poiché non è presente alcuna live region, il lettore di schermo dell'utente (JAWS o NVDA) rimane in silenzio. L'utente presume che il form sia stato inviato correttamente e chiude la scheda del browser — perdendo l'intera domanda. Con un role="alert" implementato correttamente o una live region di riepilogo, l'AT avrebbe annunciato immediatamente "Sono stati trovati 3 errori. Controlla i campi evidenziati", permettendo all'utente di correggere i problemi.
Da una prospettiva di business, un feedback di stato inaccessibile danneggia direttamente i tassi di conversione. Circa 1,3 miliardi di persone nel mondo vivono con qualche forma di disabilità, e garantire che i messaggi di stato siano accessibili riduce l'abbandono dei form, il volume dei ticket di supporto e il rischio legale associato alla non conformità. Per le organizzazioni turche, l'inaccessibilità può anche costituire una violazione della Legge sulla Disabilità n. 5378 e delle più recenti obbligazioni della Circolare Presidenziale descritte più avanti in questo articolo.
Regole Axe-core Correlate
- aria-live (automatizzata): La regola
aria-livedi axe-core verifica che gli elementi che usano l'attributoaria-liveabbiano uno dei valori validi:off,politeoassertive. Segnala gli elementi in cuiaria-liveè impostato su un valore non valido o scritto in modo errato (ad esempio,aria-live="true"oaria-live="yes"), che porterebbe la live region a essere ignorata silenziosamente dalle tecnologie assistive. Questa regola assicura che, quando gli sviluppatori intendono creare una live region, l'attributo sia formato correttamente in modo che i lettori di schermo lo rispettino effettivamente. - Test manuale (necessario per una copertura completa): Gli strumenti automatizzati non possono verificare completamente WCAG 4.1.3 perché la modalità principale di fallimento è una live region mancante su un messaggio generato dinamicamente — un'assenza che l'analisi statica del codice fatica a rilevare in modo affidabile. Uno strumento che analizza il DOM prima di un'interazione dell'utente non può sapere quali elementi diventeranno in seguito messaggi di stato. Axe-core potrebbe non segnalare un
<div>che riceverà testo iniettato dopo un clic su un pulsante, perché al momento della scansione il div è vuoto o non esiste ancora. Il test manuale con un lettore di schermo reale è quindi essenziale: un tester deve attivare il messaggio di stato e ascoltare un annuncio. Se non viene annunciato nulla e il focus non si è spostato, il criterio non è rispettato indipendentemente da ciò che riportano gli strumenti automatizzati.
Come Eseguire i Test
- Scansione automatizzata con axe DevTools o Lighthouse: Installa l'estensione del browser axe DevTools (Chrome o Firefox) ed esegui una scansione dell'intera pagina. Cerca eventuali violazioni sotto la regola
aria-live. Controlla anche i problemi segnalati relativi a uso scorretto diaria-roledescriptionoaria-atomic. Ricorda che una scansione automatizzata pulita non significa che il criterio 4.1.3 sia rispettato — significa solo che non sono stati trovati attributi di live region malformati. Prendi nota di tutti gli elementi segnalati e risolvili prima di procedere ai passaggi manuali. - Identifica tutti i messaggi di stato dinamici: Esamina la pagina e il suo JavaScript per catalogare ogni interazione utente che produce un messaggio di stato senza ricaricare la pagina o cambiare il focus. Esempi comuni includono: feedback sull'invio di form, badge di quantità del carrello, conteggi dei risultati di ricerca, avanzamento del caricamento di file, conferme di iscrizione a newsletter, aggiornamenti dei risultati dei filtri e avvisi di scadenza della sessione.
- Test manuale con NVDA + Firefox: Apri la pagina con NVDA in esecuzione. Attiva ciascun messaggio di stato catalogato (invia un form, aggiungi un articolo a un carrello, esegui una ricerca). Ascolta con attenzione — NVDA dovrebbe annunciare automaticamente il testo del messaggio entro uno o due secondi. Se non senti nulla e il focus non si è spostato, il criterio non è rispettato. Usa lo Speech Viewer di NVDA (Tools > Speech Viewer) per vedere un log testuale di tutti gli annunci e verificarne l'accuratezza.
- Test manuale con JAWS + Chrome: Ripeti le stesse interazioni con JAWS. Conferma che i messaggi con
role="status"vengano annunciati con un'interruzione gentile e che i messaggi conrole="alert"interrompano immediatamente. Verifica che JAWS non annunci lo stesso messaggio più volte a causa di impostazioni errate diaria-atomicoaria-relevant. - Test manuale con VoiceOver + Safari (macOS/iOS): Usa VoiceOver su macOS con Safari e ripeti le stesse interazioni. Nota che la gestione di
aria-liveda parte di VoiceOver può differire leggermente dai lettori di schermo per Windows — verifica che gli annunci avvengano e che siano formulati in modo sensato. - Ispeziona il DOM dopo l'interazione: Usando i DevTools del browser, attiva il messaggio di stato e poi ispeziona l'elemento che è apparso. Conferma che abbia
role="status",role="alert"o un attributoaria-livevalido. Se il messaggio viene iniettato come testo semplice in un contenitore non marcato, il test non è superato. Controlla anche che il contenitore della live region esistesse nel DOM prima che il messaggio venisse iniettato — i lettori di schermo annunciano solo i cambiamenti nelle live region preesistenti, non gli elementi inseriti ex novo nel DOM.
Come Correggere
Riepilogo di Validazione del Form — Non Corretto
<!-- 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 -->
Riepilogo di Validazione del Form — Corretto
<!-- 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 -->
Conteggio Articoli nel Carrello — Non Corretto
<!-- 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 -->
Conteggio Articoli nel Carrello — Corretto
<!-- 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 -->
Conteggio dei Risultati di Ricerca — Non Corretto
<!-- 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 -->
Conteggio dei Risultati di Ricerca — Corretto
<!-- 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 -->
Avanzamento del Caricamento File — Non Corretto
<!-- 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 -->
Avanzamento del Caricamento File — Corretto
<!-- 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 -->
Errori Comuni
- Creare l'elemento della live region nello stesso momento del messaggio: Aggiungere
role="alert"a un elemento DOM appena creato e popolarlo immediatamente spesso non funziona perché i lettori di schermo non hanno ancora registrato il nuovo nodo come live region. Renderizza sempre il contenitore vuoto al caricamento della pagina e aggiorna il suo contenuto testuale solo quando il messaggio di stato è pronto. - Usare
aria-live="assertive"per messaggi non urgenti: Le live region assertive interrompono qualunque cosa il lettore di schermo stia leggendo. Usareassertiveper messaggi di routine come "Articolo aggiunto al carrello" frustrerà gli utenti interrompendo continuamente il loro flusso di lettura. Riservaassertive(orole="alert") per errori o avvisi realmente sensibili al tempo; usapoliteper tutto il resto. - Impostare
aria-livesu un valore non valido come"true"o"1": Solo"off","polite"e"assertive"sono valori validi. I valori non validi disabilitano silenziosamente la live region senza alcun avviso del browser, causando la segnalazione dell'elemento da parte della regolaaria-livedi axe-core. - Affidarsi esclusivamente al colore o alle icone per comunicare lo stato: Un'icona con segno di spunta verde o un bordo rosso iniettati nella pagina sono segnali solo visivi. Senza testo di accompagnamento in una live region, gli utenti di lettori di schermo non ricevono alcuna informazione. Abbina sempre gli indicatori visivi a un annuncio testuale tramite live region.
- Omettere
aria-atomic="true"quando si aggiorna parte di una frase: Se JavaScript aggiorna solo un numero all'interno di una frase (ad esempio, cambiando "3" in "4" in "4 articoli nel carrello"), alcuni lettori di schermo annunceranno solo il nodo modificato, dicendo "4" senza contesto. Impostarearia-atomic="true"sul contenitore indica all'AT di leggere l'intera regione come un'unità. - Annunciare ogni aggiornamento incrementale di avanzamento: Iniettare un nuovo messaggio di stato ogni secondo durante il caricamento di un file ("10%", "11%", "12%"…) inonda l'utente di annunci e rende il lettore di schermo inutilizzabile. Annuncia solo le tappe significative o lo stato finale di completamento.
- Posizionare il contenitore della live region all'interno di elementi nascosti in modo condizionale con
display:noneovisibility:hidden: Una live region all'interno di un genitore nascosto è inerte e non annuncerà nulla, anche se l'elemento della live region è visibile. Assicurati che la catena di antenati della live region non sia nascosta al momento dell'annuncio. - Usare
role="alert"per messaggi di successo che compaiono dopo una navigazione: Quando un messaggio di stato persiste attraverso il ricaricamento di una pagina (ad esempio, un messaggio flash renderizzato lato server dopo un redirect), usarerole="alert"può causare annunci duplicati o eccessivamente aggressivi. Valuta l'uso dirole="status"o lo spostamento del focus sulla regione del messaggio, in modo che l'annuncio si integri naturalmente nella navigazione dell'utente. - Dare per scontato che le librerie di tooltip o toast gestiscano automaticamente le live region: Molte librerie di componenti UI popolari (ad esempio, Bootstrap Toasts, sistemi di tooltip personalizzati) non aggiungono di default gli attributi ARIA di live region. Ispeziona sempre l'HTML renderizzato dei componenti di terze parti e aggiungi
role="status"oaria-livequando mancano. - Non testare con lettori di schermo reali prima del rilascio: Gli strumenti automatizzati come axe non possono rilevare una live region mancante su un messaggio di stato dinamico. Affidarsi solo ad audit automatizzati lascerà irrisolti i fallimenti del criterio 4.1.3. Rendi il test manuale con lettori di schermo — NVDA, JAWS e VoiceOver — una parte standard del tuo processo di QA per qualsiasi funzionalità che generi feedback dinamico.
Relazione con le Normative di Accessibilità della Turchia
La Circolare Presidenziale n. 2025/10 della Turchia, pubblicata nella Gazzetta Ufficiale n. 32933 il 21 giugno 2025, stabilisce obblighi vincolanti in materia di accessibilità digitale per un'ampia gamma di organizzazioni che operano in Turchia. La Circolare fa riferimento a WCAG 2.1 e WCAG 2.2 come standard tecnico per la conformità e richiede specificamente la conformità al Livello AA come base per la maggior parte dei soggetti interessati.
WCAG 4.1.3 Status Messages è un criterio di Livello AA, il che significa che rientra direttamente nell'ambito obbligatorio della Circolare per tutti i soggetti coperti. I seguenti tipi di organizzazioni sono esplicitamente inclusi:
- Istituzioni e agenzie pubbliche — tutti gli organi di governo centrali e locali, ministeri, municipalità e imprese statali devono soddisfare la conformità di livello AA per tutti i loro servizi digitali.
- Banche e istituzioni finanziarie — regolamentate dall'Agenzia di Regolamentazione e Vigilanza Bancaria (BDDK), queste entità offrono servizi online critici (internet banking, richieste di prestito, gestione delle carte) in cui il feedback dinamico di stato — come conferme di transazioni, messaggi di errore e aggiornamenti di saldo — è estremamente comune. I fallimenti del criterio 4.1.3 ostacolano direttamente l'indipendenza finanziaria degli utenti con disabilità.
- Piattaforme di e-commerce — il commercio online è un caso d'uso primario per i messaggi di stato (aggiornamenti del carrello, conferme d'ordine, avvisi di disponibilità). Gli operatori di e-commerce devono garantire che queste notifiche dinamiche siano accessibili a tutti gli utenti.
- Ospedali e istituzioni sanitarie — i sistemi di prenotazione appuntamenti, i portali dei risultati degli esami e le dashboard dei pazienti utilizzano frequentemente messaggi di stato. Informazioni sanitarie inaccessibili possono avere gravi conseguenze per i pazienti con disabilità.
- Società di telecomunicazioni con 200.000 o più abbonati — i portali di gestione degli account, le notifiche di fatturazione e gli aggiornamenti sullo stato del servizio devono tutti essere conformi al Livello AA, incluso il criterio 4.1.3.
- Agenzie di viaggio e società di trasporto privato — le conferme di prenotazione, il feedback sulla selezione dei posti e i messaggi di aggiornamento dell'itinerario sono elementi fondamentali dell'esperienza utente e devono essere determinabili in modo programmato.
- Scuole private e istituzioni educative autorizzate dal Ministero dell'Istruzione Nazionale (MoNE) — i sistemi di gestione dell'apprendimento, i portali dei voti e le piattaforme di iscrizione devono esporre i messaggi di stato in modo accessibile per servire tutti gli studenti e i genitori.
Il Logo di Accessibilità (Erişilebilirlik Logosu), rilasciato dal Ministero della Famiglia e dei Servizi Sociali, è il marchio ufficiale di certificazione per siti web e applicazioni turche digitalmente accessibili. Per essere idonea al Logo, un'organizzazione deve dimostrare la piena conformità al Livello AA — che include il criterio 4.1.3. Dato che i messaggi di stato sono onnipresenti nelle interfacce web moderne, qualsiasi organizzazione che cerchi l'Erişilebilirlik Logosu dovrebbe considerare il criterio 4.1.3 come un elemento di audit obbligatorio e implementare in modo coerente i pattern di live region in tutte le aree di contenuto dinamico.
Le organizzazioni che non rispettano i requisiti rischiano azioni amministrative ai sensi della Circolare, la perdita dell'idoneità al Logo di Accessibilità e danni alla reputazione in un mercato sempre più attento all'accessibilità. Implementare correttamente WCAG 4.1.3 non è semplicemente una casella tecnica da spuntare — è un investimento concreto nell'accesso digitale paritario per gli circa 8,5 milioni di cittadini turchi che vivono con disabilità.
