L’accessibilità web e i browser – Supporto all’Html accessibile

Questo articolo fa parte di un corso gratuito di accessibilità web ospitato su questo sito.

Progettare e costruire un sito accessibile prevede il rispetto di alcune linee guida e la verifica dei risultati ottenuti con screen reader, browser e browser di testo.

Purtroppo, il supporto dei browser ai tag e agli attributi accessibili è vario e alquanto carente. Anche se una persona disabile usa probabilmente un software dedicato, una maggiore aderenza agli standard è sicuramente auspicabile, così da evitare allo sviluppatore di ricorrere a soluzioni “ad interim”.

Per i test sono prese in esame le piattaforme:

  • Windows 2000
    • Internet Explorer 5
    • Internet Explorer 5.5
    • Internet Explorer 6
    • Netscape 4.7
    • Netscape 6.2
    • Netscape 7.0 pr1
    • Mozilla 1.0
    • Opera 5
    • Opera 6
  • Mac Os 9.1
    • Internet Explorer 5
    • Netscape 4.7
    • Netscape 6.2
    • Mozilla 1.0
    • iCab 2.8
    • Opera 5

Una pagina per il test di “conformità”

Abbiamo realizzato una semplice pagina di test contenente i tag normalmente usati per migliorare l’accessibilità di un documento Html.

Nella pagina sono presenti:

  • un menu realizzato come link ipertestuali, ognuno dei quali raggiungibile con scorciatoia da tastiera (in particolare con 1,2,3) e con un ordine di tabulazione dato dall’attributo tabindex
  • una form per un’iscrizione fittizia, che utilizza:
    • il tag fieldset e il tag legend per raggruppare elementi della form concettualmente simili
    • il tag label per associare esplicitamente un’etichetta al campo della form
    • l’attributo tabindex per modificare l’ordine di tabulazione all’interno dei campi
    • un tag optgroup utilizzato, all’interno di una combo-box, per raggruppare gli elementi in sottocategorie
  • una lista di acronimi realizzati con il tag acronym
  • una serie di abbreviazioni con il tag abbr
  • una tabella che sfrutta i tag th, caption e l’attributo summary
  • una image map che utilizza l’attributo alt
  • una image map che utilizza l’attributo title
  • una immagine con una descrizione estesa riferita dall’attributo longdesc
  • l’attributo title inserito in un link
  • l’attributo title inserito in un’immagine

I risultati del test

I risultati della pagina sono molto vari tra le diverse piattaforme.

Netscape 4.7

Data l’età, il supporto di Netscape 4.7 è piuttosto scadente:

  • non sono riconosciuti i tag fieldset e legend delle form
  • non sono raggruppati gli elementi della combo-box
  • non è possibile utilizzare i tasti di scelta rapida e nemmeno l’ordine di tabulazione
  • sono ignorati gli attributi title per i link e le immagini
  • non sono visualizzate le abbrevazioni e gli acronimi
  • sono visualizzati gli attributi alt nelle immagini, ma non nelle image map
Form in Netscape 4.7 senza fieldset e optgroup
Netscape 4.7: non vengono riconosciuti i tag e gli attributi che rendono le form accessibili e neppure optgroup per le combobox

Netscape 6+ / Mozilla

Con Netscape 6+ e Mozilla le cose migliorano sensibilmente: sono riconosciuti correttamente molti tag ed attributi.

I limiti principali di questa versione rimangono:

  • mancata visualizzazione degli alt nelle image map (ma non del tag title)
  • scadente gestione delle tabulazioni all’interno della pagina: è vero che l’attributo tabindex viene correttamente riconosciuto, ma procedendo con la tabulazione il browser non scrolla la pagina per posizionarsi sugli elementi non a video

Molto buona la gestione degli acronimi e delle abbreviazioni, che compaiono come parole sottolineate, delle virgolette (tag q) e del tag optgroup, visualizzato come intestazione agli elementi.

Netscape 6 supporta acronimi e abbreviazioni
Netscape 6: vengono gestiti correttamente sia gli acronimi sia le abbreviazioni, evidenziandoli con una sottolineatura tratteggiata
Netscape 6 supporta le form accessibili
Netscape 6: le form accessibili sono visualizzate correttamente e sono anche raggruppati eventuali elenchi presenti in un optgroup

Cominciano timidamente a farsi vedere gli attributi longdesc, anche se per visualizzare la pagina è necessario posizionarsi sull’immagine, scegliere “Proprietà” dal menù contestuale e cliccare sul link della descrizione.

Netscape 6 visualizza le pagine di descrizione per le immagini
Netscape 6: è possibile aprire una finestra di proprietà per le immagini che contiene un link al file di descrizione specificato nell’attributo longdesc. Il metodo è effettivamente un po’ laborioso, ma funziona.

Internet Explorer Windows

Anche Internet Explorer 5+ ha un buon supporto per l’accessibilità, anche se in alcuni punti (come gli acronimi), potrebbe essere migliorato, per esempio sottolineando le voci, come fa Netscape. Dalla versione 6 Windows anche il tag optgroup per raggruppare gli elementi di una combo-box è interpretato correttamente.

Internet Explorer visualizza gli acronimi ma non li evidenzia
Internet Explorer 6 per Windows: vengono visualizzati gli acronimi se vi si posiziona il muose, ma non sono evidenziati

Internet Explorer Macintosh

Anche la versione 5 Mac gestisce optgroup, ed è forse il browser che visualizza i gruppi nel modo più efficace.

Internet Explorer 5 per Mac visualizza gli optgroup come più livelli di menù a tendina
Internet Explorer 5 per Mac: visualizza gli optgroup come più livelli di menù a tendina, una soluzione davvero efficace

Opera

Opera, in entrambe le versioni provate, non ha brillato per il suo riconoscimento dei tag accessibili. Solo con la versione 6 si comincia a vedere qualche timido miglioramento, soprattutto nelle form.

Opera 6 ha un supporto limitato per le form
Opera: nella versione 6 gestisce l’attributo fieldset, ma non l’optgroup

iCab

iCab per Macintosh include un’interessante opzione: visualizza tra parentesi i tasti di scelta rapida (accesskey) per le scorciatoie da tastiera.

È inoltre possibile richiedere, dal menu contestuale, l’apertura in una nuova finestra del file assegnato ad un’immagine con l’attributo longdesc, un po’ più rapidamente che in Netscape.

iCab visualizza i tasti di scelta rapida tra parentesi angolate
iCab: visualizza delle parentesi angolate nelle quali sono evidenziati i tasti di scelta rapida (accesskey) raggiungibili da tastiera.

Tabelle riassuntive

Segue una serie di tabelle con i dettagli del test.

Non è presentata una scheda riepilogativa con il supporto alle tabelle accessibili in quanto tutti i browser provati visualizzano correttamente i tag.

Se riesci a provare la pagina di esempio con un browser e una piattaforma non presente nella lista (ad esempio Linux), contattaci così che possiamo includere i risultati della tua prova e creare un elenco più completo, a disposizione di tutti.

Form

Nella tabella è evidenziato il supporto dei browser ai tag fieldset e optgroup che consentono di raggruppare rispettivamente i campi di una form e gli elementi di una combo-box.

È anche evidenziata la possibilità o meno di muoversi correttamente nelle form utilizzando il tabulatore secondo l’ordine definito dall’attributo tabindex.

Accessibilità delle form
Browser Fieldset Optgroup Tabindex
Windows 2000
Internet Explorer 5 No
Internet Explorer 5.5 No
Internet Explorer 6
Netscape 4.7 No No No
Netscape 6.2 Parz.
Netscape 7.0 pr1 Parz.
Mozilla 1.0 Parz.
Opera 5 No No No
Opera 6 No No
Mac Os 9.1
Internet Explorer 5
Netscape 4.7 No No No
Netscape 6.2 Parz.
Mozilla 1.0 Parz.
iCab 2.8 No
Opera 5 No No No

Nota: Netscape 6+ e Mozilla gestiscono l’attributo tabindex, però hanno qualche difficoltà nel visualizzare l’oggetto che ha il “fuoco” fuori della parte visibile dello schermo.

Una curiosa particolarità: mentre Internet Explorer considera i radio button come una sola entità quando si usa il tabulatore, Netscape 6+ e Mozilla distinguono ognuna delle opzioni del controllo.

Testo

I tag Html offrono la possibilità di arricchire il testo con abbreviazioni, acronimi, citazioni, che dovrebbero essere interpretate dal browser. Nella tabella, “virgolette” si riferisce al supporto del tag q, mentre citazioni indica il tag blockquote.

Accessibilità del testo
Browser Acronimi Abbreviazioni Virgolette Citazioni
Windows 2000
Internet Explorer 5 Parz. No No
Internet Explorer 5.5 Parz. No No
Internet Explorer 6 Parz. No No
Netscape 4.7 No No No
Netscape 6.2
Netscape 7.0 pr1
Mozilla 1.0
Opera 5 Parz. Parz.
Opera 6 Parz. Parz.
Mac Os 9.1
Internet Explorer 5 Parz. Parz.
Netscape 4.7 No No No
Netscape 6.2
Mozilla 1.0
iCab 2.8
Opera 5 Parz. Parz.

Nota: Internet Explorer visualizza correttamente gli acronimi. A differenza di Netscape e Mozilla, però, non dà indicazioni sulla presenza dell’acronimo, per esempio sottolineandolo, rendendo così difficile il suo riconoscimento. È comunque possibile utilizzare delle regole Css per simulare il comportamento di Netscape. La stessa cosa vale per Opera, che in più visualizza anche le abbreviazioni.

Link

È possibile estendere le informazioni dei link con l’attributo title. Inoltre, è prevista dall’Html la possibilità di introdurre delle scorciatoie da tastiera e di navigare i link con il tabulatore.

Accessibilità dei link
Browser Title Accesskey Tabindex
Windows 2000
Internet Explorer 5
Internet Explorer 5.5
Internet Explorer 6
Netscape 4.7 No No No
Netscape 6.2 Parz.
Netscape 7.0 pr1 Parz.
Mozilla 1.0 Parz.
Opera 5 No No
Opera 6 No No
Mac Os 9.1
Internet Explorer 5
Netscape 4.7 No No No
Netscape 6.2 Parz.
Mozilla 1.0 Parz.
iCab 2.8 No
Opera 5 No No No

Immagini

Anche per le immagini è possibile utilizzare l’attributo title, mentre invece l’attributo longdesc consente di collegare una pagina di dettaglio dell’immagine.

Accessibilità delle immagini
Browser Alt Title Longdesc
Windows 2000
Internet Explorer 5 No
Internet Explorer 5.5 No
Internet Explorer 6 No
Netscape 4.7 No No
Netscape 6.2 Parz.
Netscape 7.0 pr1 Parz.
Mozilla 1.0 Parz.
Opera 5 No
Opera 6 No
Mac Os 9.1
Internet Explorer 5 No
Netscape 4.7 No No
Netscape 6.2 Parz.
Mozilla 1.0 Parz.
iCab 2.8
Opera 5 No

Nota: la gestione dell’attributo longdesc è ancora un po’ troppo precaria e complessa in Netscape 6+ e Mozilla per considerarla definitiva.

Image Maps

Sia l’immagine sia le aree della mappa consentono di specificare l’attributo alt, anche se questa seconda possibilità non viene visualizzata sullo schermo quando si disabilitano le immagini. Sarebbe utile riuscire a vedere i contorni delle area anche quando l’immagine non viene caricata, e trovare all’interno le descrizioni alternative.

Accessibilità delle image map
Browser Alt (immagine) Alt (area) Title (area)
Windows 2000
Internet Explorer 5
Internet Explorer 5.5
Internet Explorer 6
Netscape 4.7 No No
Netscape 6.2 No
Netscape 7.0 pr1 No
Mozilla 1.0 No
Opera 5 No
Opera 6 No
Mac Os 9.1
Internet Explorer 5 No
Netscape 4.7 No No
Netscape 6.2 No
Mozilla 1.0 No
iCab 2.8 No
Opera 5 No No

Verificare i siti con uno screen reader

Questo articolo fa parte di un corso gratuito di accessibilità web ospitato su questo sito.

Scritto in collaborazione con Nicola Ferrando.

Nella scorsa puntata del corso abbiamo avuto modo di conoscere gli strumenti che aiutano i non vedenti e gli ipovedenti nella fruizione di un sito web.

Screen reader e browser vocali possono anche essere utilizzati dagli sviluppatori per verificare il livello di accessibilità della pagina, senza però dimenticare che il pubblico di un sito accessibile è più esteso e comprende altre categorie. Si tratta quindi di un test necessario, ma non sufficiente, per verificare l’accessibilità di un sito web.

Per capire come sia possibile realizzare un test utilizzando uno screen reader vi proponiamo tre esempi tratti da siti web famosi, in particolare la home page e la pagina di ricerca di Yahoo! Italia e la home page di Rai Sport.

Abbiamo scelto di non analizzare un sito costruito appositamente per soddisfare le linee guida Wai così da evidenziare le problematiche che deve affrontare chi deve affidarsi ad uno screen reader per leggere il contenuto di una pagina.

Siamo anche consci del fatto che è sempre molto semplice evidenziare le lacune di un sito, piuttosto che presentare validi esempi di buona accessibilità. Questi non sono quindi test di siti, ma casi d’uso da riportare alle vostre pagine.

Yahoo! Italia

L’analisi è stata realizzata il 28 Settembre 2002

Ascolta l’Mp3 della Home Page di Yahoo! (640 Kbyte)

Visualizza la pagina della Home Page di Yahoo!

Il frammento audio mostra quello che lo screen reader Jaws legge usando il comando “leggi tutto”, cioè il comando che interpreta l’intera pagina dall’inizio alla fine. Jaws scandisce automaticamente la pagina non appena viene caricata, ma è possibile interrompere la lettura in qualsiasi momento per esplorare con calma la pagina utilizzando i normali tasti di scorrimento del testo (tasti freccia, pagina giù, ecc.).

Il file è stato troncato: dura meno di 2 minuti, ma la lettura completa della homepage di Yahoo! ne richiede più di 4.

Quasi tutti gli elementi grafici sono completati dall’attributo alt, che viene regolarmente letto dalla sintesi vocale dopo la parola “grafico”.

Non è invece presente una etichetta che indichi immediatamente il significato del campo editazione che si incontra dopo la prima serie di link. Naturalmente la presenza del pulsante “Cerca” ben evidenziato immediatamente dopo al campo di immissione (che Jaws chiama “editazione”) non lascia dubbi. Inoltre tutti sanno che Yahoo! è nato come motore di ricerca, anche se con il tempo si sono aggiunti una serie sterminata di servizi, quali mail, gruppi, chat, ecc.

I servizi Mail e Gruppi sono perfettamente gestibili, ma lo stesso non si può dire per le Chat, a causa dell’intrinseca struttura di tali pagine, che prevedono un refresh continuo dello schermo con la comparsa di nuovi messaggi e l’uso di emoticons.

Ascolta l’Mp3 della ricerca di Yahoo! (600 Kbyte)

Visualizza la pagina della ricerca di Yahoo!

Nel secondo frammento audio si può ascoltare la lettura automatica della pagina contenente i risultati di una ricerca (abbiamo cercato la stringa “accessibilità siti web” ed abbiamo ottenuto 3 risultati).

Questa informazione ci viene fornita abbastanza presto, dopo circa 20 secondi, ma solo dopo altri 30 secondi inizieremo a leggere l’elenco dei risultati. Questo è dovuto al fatto che sulla sinistra dello schermo c’è il menu, che non è possibile saltare con un link del tipo “salta la barra di navigazione”, né sono offerti altri strumenti di orientamento, quali ad esempio le intestazioni (tag h1-h6) che consentano di individuare le diverse sezioni in cui è suddivisa la pagina web.

Rai Sport

L’analisi è stata realizzata il 28 Settembre 2002

Ascolta l’Mp3 della ricerca di Rai Sport (820 Kbyte)

Visualizza la pagina della ricerca di Rai Sport

Ascoltando il terzo frammento audio si nota subito la presenza di molti link grafici non commentati. In questo caso Jaws non può far altro che leggere il contenuto dell’attributo href del link che contorna l’immagine.

La recente versione 4.50 legge invece il nome del file associato al link: in taluni casi ciò permette di comprendere il significato del link. Se ad esempio l’immagine si chiama menucalcio.gif, si può immaginare che seguendo quel link si accederà alla sezione del sito dedicata al calcio. Tuttavia si tratta di un palliativo che non sempre funziona. Pensate ad esempio ai link che vengono costruiti con l’immagine di un pallino seguita dal testo descrittivo, che però non è cliccabile.

In questo caso il nome dell’immagine non varia e l’unico modo per capire dove porta il link, oltre a leggere il testo che lo segue, è esaminare il nome del file Html che verrà caricato. Questo è ciò che accadeva fino a poco tempo fa nelle sezioni interne del sito di Repubblica. Ora fortunatamente i link sono costituiti dai titoli degli articoli e ciò ne consente una chiara comprensione anche se avulsi dal contesto, come accade se si utilizza la funzione dello screen reader che consente di accedere all’elenco di tutti i link presenti sulla pagina web.

Tornando alla home page del sito di RaiSport, noterete che l’utente rimane ignaro del fatto che nella pagina sono presenti diverse applet, in particolare l’oggetto incorporato che consentirebbe di ascoltare e vedere l’ultimo Tg sportivo. Purtroppo gli oggetti di tipo embedded sono molte volte inaccessibili, in quanto lo screen reader non ha alcuno strumento per gestirli. Bisognerebbe accompagnare tali oggetti con un link di tipo tradizionale che consenta di accedere alla risorsa multimediale.

ASP.NET: Politiche di Caching

Corso ASP.NET: tredicesima puntata

Esempio funzionante | Sorgente | Scarica il sorgente (zip)

La ripetitività e l’intensità nell’uso delle applicazioni Internet fa sì che sia teoricamente possibile prevedere dei meccanismi di salvataggio e recupero di pagine od oggetti dalla memoria, ai fini di aumentare le prestazioni.

Per questo motivo, a differenza di Asp, Asp .Net rende disponibili delle sofisticate tecniche di caching che, adottate correttamente, consentono allo sviluppatore di ridurre l’uso intensivo di alcune risorse, come la Cpu e le connessioni a database.

Con Asp.Net è possibile utilizzare due tipi di caching:

  • Output caching – utilizzato per memorizzare pagine o porzioni di pagine in memoria, così da ridurre l’esecuzione del codice che le compongono
  • Data caching – utilizzato per memorizzare qualunque tipo di oggetto, soprattutto Dataset o risultati di trasformazioni Xml

La cache viene normalmente riempita al primo caricamento della pagina o dell’oggetto da parte dell’utente. Le successive richieste vengono invece servite impiegando la copia compilata e precedentemente memorizzata nella cache, evitando la ri-esecuzione del codice.

Con Asp.Net è anche possibile definire dei discriminanti che possono invalidare la copia cache non valida e richiedere quindi la sua ricostruzione. Tipici eventi sono rappresentati dallo scadere di un intervallo di tempo o la modifica di file di dipendenza.

Output caching

L’output caching consente di ridurre il carico applicativo perché, dopo la prima richiesta della pagina, questa viene memorizzata nella cache.

Questa funzionalità si ottiene specificando in testa alla pagina qualcosa del tipo:

<%@ OutputCache Duration=”30″ VaryByParam=”None” %>

L’esempio sopra riportato mantiene la pagina nella cache per 30 minuti, allo scadere dei quali una nuova versione viene compilata e memorizzata.

I discriminanti con i quali è possibile confrontare la pagina sono:

  • Duration – la durata (in minuti) della pagina nella cache
  • VaryByParam – i parametri che provengono da una QueryString (get) o dal post di un form
  • VaryByHeader – l’header Http associato ad una pagina
  • VaryByCustom – un parametro configurabile, normalmente il tipo di browser utilizzato

Supponiamo ad esempio di avere una pagina che riceve come parametro l’anno di pubblicazione di un libro. E’ possibile inserire nella cache una versione di pagina per ogni anno di ricerca. La direttiva assume in questo caso una forma del tipo:

<%@ OutputCache Duration=”30″ VaryByParam=”AnnoPubblicazione” %>

Data caching

Il data caching consente un controllo più raffinato, perché opera a livello di oggetti invece che a livello di pagina.

Per inserire e rimuovere oggetti dalla cache è in questo caso possibile utilizzare la classe Cache, ospitata dal namespace System.Web.Caching.

Nel caso più semplice, per inserire un oggetto nella cache si usa una struttura del tipo:

Cache(“chiave”) = valore

Per rimuovere un elemento, si usa invece:

Cache.Remove(“chiave”)

Un elemento può essere inserito nella cache anche con il metodo Insert, tramite il quale è possibile specificare i discriminanti che portano alla “scadenza” dell’oggetto.

C’è ad esempio la possibilità di legare la cache ad un file presente sul server o ad un altro oggetto presente nella cache, e di invalidarla al modificarsi del documento. Per farlo si utilizza la classe CacheDependency.

Nell’esempio che segue viene realizzata una trasformazione tra un documento Xml e un documento Xsl. Il risultato viene memorizzato in cache e lì rimane fino a quando il file Xml non subisce un aggiornamento.

La prima volta che viene caricata la pagina, viene eseguita la trasformazione e l’oggetto è salvato in cache:

Tabella di libri con la scritta: Elemento non presente in cache... lo carico

Successivamente viene riportata una scritta che indica come il caricamento venga eseguito dalla cache:

Tabella di libri con la scritta: Elemento già presente in cache

La funzione PopolaCache (riportata qui sotto), si preoccupa di trasformare il documento Xml con il foglio Xslt e di memorizzare il risultato nella cache, con il metodo Insert. Viene utilizzata la classe CacheDependency per creare una dipendenza tra l’elemento in cache e il file fisico del documento Xml.

 42 Public Sub PopolaCache(strFileXml As String)
 43 
 44  Dim objXml As New XmlDocument
 45 
 46  objXml.Load(Server.MapPath(strFileXml))
 47 
 48  Dim objCDep as new CacheDependency(Server.MapPath(strFileXml))
 49 
 50  Cache.Insert(strFileXml, objXml, objCDep)

Se la cache è vuota viene richiamata la funzione PopolaCache:

 26   If (IsNothing(Cache("xml.xml"))) Then
 27     risposta.innerText = "Elemento non presente in cache…lo carico"
 28     PopolaCache("xml.xml")
 29   Else
 30     risposta.innerText = "Elemento già presente in cache"
 31   End If

In entrambi i casi, l’oggetto viene caricato prelevandolo dalla cache:

 33   objXsl.Load(Server.MapPath("xsl.xsl"))
 34 
 35   objXml = CType(Cache("xml.xml"), XmlDocument)
 36 
 37   libri.Document = objXml
 38   libri.Transform = objXsl

Se a questo punto modifichiamo (ad esempio con un editor di testo) il documento Xml, Asp.Net esegue nuovamente la trasformazione eliminando il precedente contenuto dalla cache.

Session, Application e Cache

Nel memorizzare un oggetto, lo sviluppatore ha a disposizione 3 strade: utilizzare le sessioni, l’oggetto application o la cache

In linea generale, ecco le situazioni in cui usarle:

  • Le sessioni dovrebbero essere impiegate quando è necessario registrare l’attività dell’utente nel sito, come ad esempio un carrello di commercio elettronico
  • L’oggetto application va utilizzato per memorizzare informazioni puntuali e comuni a tutto il progetto, come ad esempio la stringa di connessione ad un database. E’ un oggetto che andrebbe usato con parsimonia
  • La cache si presta ad ospitare pagine od oggetti di cui è possibile prevedere l’obsolescenza (al passare del tempo e al verificarsi di una certa condizione). Va impiegata nelle situazioni in cui c’è un effettivo guadagno in termini prestazionali o di risparmio delle risorse.