Salta il menu

Attenzione!

Chi usa Internet Explorer 6 o antecedenti avrà difficoltà nel visualizzare correttamente gli esempi, ma può scaricare il file a fondo pagina con il codice correttamente indentato.

[xhtml] Migliorare l'accessibilità

Notizia del 16/12/2006

Prima parte: il target blank

Uno dei drammi di chi era abituato a scrivere codice html è stato scoprire che xhtml nella versione strict non prevedeva più l'uso del comando target="_blank" che fa aprire i link in una nuova finestra del browser.

La scelta è stata determinata dalla necessità di rendere quanto più accessibili possibile le pagine web: togliendo quest'opzione, il navigatore può in qualsiasi momento tornare sui suoi passi usando il tasto "back" del browser, pulsante noto anche al più sprovveduto dei navigatori e in quest'ottica la scelta è senz'altro corretta ed è giusto che sia implementata nei siti di servizio come lo sono quelli delle Pubbliche Amministrazioni.

Detto ciò, si devono fare i conti anche con le esigenze dei siti commerciali che hanno bisogno di offrire delle informazioni, ma anche di non perdere il navigatore; a questo proposito, ci sono due correnti di pensiero: la più intransigente sostiene che se non è previsto, non è corretto trovare un escamotage che permetta di farlo, mentre la più morbida ammette in alcuni casi l'uso di alternative non invasive ed io - pur non discutendo su scelte diverse dalla mia - appartengo a quest'ultima.

Sempre per tale necessità di rendere accessibili a quanti più navigatori possibili le pagine web, sono stati banditi i link che usano Javascript soprattutto quando aprono finestre pop-up: un sito dev'essere navigabile e il suo contenuto fruibile anche nel caso si usino browser testuali, che si disabilitino gli script o che non si implementi alcun plug-in (un plug-in è un'estensione che permette di visualizzare elementi particolari; il più diffuso e' il plug-in di Flash).

Fatta questa premessa obbligatoria, vediamo com'è possibile superare il problema senza creare difficoltà a chi ha l'esigenza di mantenere la navigazione in un'unica finestra del browser e lo farò... usando Javascript ;)

In realtà non è l'uso di Javascript in se a essere messo in discussione, ma il fatto che generalmente un link gestito con questo linguaggio non è più apribile nel caso tale linguaggio sia disattivato; i browser offrono infatti tra le opzioni disponibili la possibilità di disattivarlo e molti navigatori lo fanno, perché spesso è usato per far comparire messaggi pubblicitari non sempre graditi.

Javascript però può essere usato in maniera per niente invasiva, agganciando il link prima che sia aperto e forzandone l'apertura in una nuova finestra: in questo modo il link rimane utilizzabile anche in mancanza dell'abilitazione degli script, solo si aprirà nella medesima finestra del browser anziché in una nuova.

Lo script - non mio, ma mutuato da SkidX un utente del forum di Html.it che frequento - è il seguente:

function intercetta() { for (var i=0; i<document.links.length; i++) if (document.links[i].className=="blank") { document.links[i].target="_blank"; } } window.onload = intercetta;

Lo scrivo su un file di testo che salvo con estensione .js (ad esempio come blank.js) e lo aggancio alla pagina inserendo il tag <script> nell'header:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="it"> <head> <title>...</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="keywords" content="..." /> <meta name="description" content="..." /> <meta name="author" content="rebelia.it" /> <link href="stile.css" rel="stylesheet" type="text/css" /> <script src="blank.js" type="text/javascript"></script> </head>

Al link vero e proprio invece aggiungo la classe class="blank" citata nello script; perché funzioni, è importante inserirla prima di href: il browser legge la pagina dall'alto in basso, arrivato all'head carica lo script che vi è linkato e lo tiene in memoria, così quando raggiungerà la classe citata (in questo caso blank) elaborerà lo script PRIMA di procedere con la lettura del resto e cioè del link (spiegazione poco tecnica, ma spero sufficientemente chiara).

Qui sotto un link aperto in questo modo:

<p>Lorem ipsum <a class="blank" href="http://www.google.it" title="Nuova finestra del browser">apri google</a> dolor sit amet...</p>

Nel caso Javascript sia disabilitato, l'indirizzo è presente e il link perfettamente utilizzabile.

Nota 1: ho usato sia per la classe che per il nome del file esterno la parola "blank", ma questo solo per ricordarmi di cosa si tratta; lo script avrebbe funzionato ugualmente se avessi chiamato il file "pippo.js" e la classe "pluto"; l'importante è che il nome del file sia lo stesso richiamanto nell'head e il nome della classe dello script la stessa usata nel link.

Nota 2: nel title dell'alt o in qualche parte ben visibile della pagina è buona norma segnalare che il link si aprirà in una nuova finestra.

***

Seconda parte: saltare il menu

Un altro dei sistemi implementabili per rendere più accessibile una pagina è dare la possibilità di saltare da una sezione all'altra; i browser vocali leggono infatti TUTTO il contenuto della pagina ogni volta che si passa dall'una all'altra e soprattutto in caso di menu complessi o sezioni ripetitive, non sempre il navigatore desidera farlo, ma preferisce saltare direttamente al contenuto che gli interessa; per permetterglielo basta inserire all'inizio di una sezione un link che porta direttamente a un'altra, generalmente dal menu al contenuto e poi nasconderlo tramite i CSS.

Questo il codice xhtml:

<div id="menu"><a class="nascondi" href="#contenuto">Vai al contenuto</a> <ul> <li><a href="#">Home</a></li> <li><a href="#">Chi siamo</a></li> <li><a href="#">Prodotti</a></li> <li><a href="#">Servizi</a></li> <li><a href="#">Contatti</a></li> </ul> </div> <hr /> <div id="contenuto"> <h2>Home</h2> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In orci.</p> </div>

Non è necessario aggiungere un ancoraggio vero e proprio - il classico <a id="nome"></a> - se l'elemento a cui puntiamo già ha un id utilizzabile, com'è in questo caso.

Nel foglio di stile usato per la formattazione della pagina aggiungo il seguente comando:

.nascondi { display: none; }

Generalmente preferisco usare una classe (quindi .nascondi) anziché un id (#nascondi), perché potrei aver bisogno di usarla più volte e un id non me lo permette.

Oltre agli ancoraggi, i browser vocali per navigare usano anche i tag <hn> dei titoli, altro buon motivo per usarli correttamente.

Commenti

1 - Scritto da Marco GRAZIA il 04/02/2007 alle 11:33

Un'idea è quella che ho usato io.

// Sostituisce l'argomento target delle ancore, che in xhml non è previsto. function externalLinks() { if (!document.getElementsByTagName) return; var anchors = document.getElementsByTagName("a"); for (var i=0; i<anchors.length; i++) { var anchor = anchors[i]; // Versione italiana. if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "esterno") { anchor.target = "_blank"; if (anchor.title) anchor.title += " (Il link apre una nuova finestra)"; if (!anchor.title) anchor.title = "Il link apre una nuova finestra"; } // Versione inglese. if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external") { anchor.target = "_blank"; if (anchor.title) anchor.title += " (Il link apre una nuova finestra in inglese)"; if (!anchor.title) anchor.title = "Il link apre una nuova finestra in inglese"; } } } window.onload = function() { externalLinks(); // Per i links, vedi sopra. }

E lo si usa con l'attributo rel, ovvero:

<a rel='external' href=' ... title='' ....> e in title appare una scritta che indica che il link aprirà una nuova finestra in inglese.

Se invece si usa rel='esteno' la scritta dentro title non indicherà la lingua del sito da aprirsi.

Ovviamente si possono aggiungere quante più lingue si vuole, ma non solo, lo script fa una differenza se title='' è vuoto appunto, oppure se title ha qualcosa di scritto dentro, vi aggiunge tra parentesi la scritta (apre in una pagina differente).

M.

PS dato che questo sistema di news non ha l'anteprima, mi scuserai se ci saranno delle imprecisioni e degli Orrori di ortografia.

2 - Scritto da reb il 04/02/2007 alle 14:27

grazie :)

3 - Scritto da daniele il 01/02/2008 alle 21:28

Ciao reb ;)

volevo anche segnalarti questo codice realizzato da freemind su questo 3D

<html> <head> <script type="text/javascript"> function OpenPopup(Ind) { window.open(Ind,'NewWin','height=500,width=500'); } function Intercetta() { for (var i=0;i<document.links.length;++i) { if (document.links[i].className=="blank") { var Tmp = document.links[i].href; document.links[i].href = "javascript:OpenPopup('" + Tmp + "');"; } } } </script> </head> <body onload="javascript:Intercetta();"> <a class="blank" href="http://www.google.it">google</a> </body> </html>

Con questo codice è possibile creare Popup che anche con il j.s funzionano....

Ciao!

4 - Scritto da reb il 02/02/2008 alle 21:58

devi usare i tag in miniatura, altrimenti non funzionano ;)

tornando all'argomento, si tratta sempre di intercettare il link con una classe, niente di nuovo sotto il sole, solo che nel tuo script le finestre si ridimensionano pure, cosa che io voglio evitare completamente, senno' casca tutto il palco dell'accessibilita' :)

Aggiungi il tuo commento

I campi con * sono obbligatori.

Torna a inizio pagina