Siete qui:

  1. Home
  2. Blog
  3. Un esempio di Javascript unobtrusive e progressive enhancement

Un esempio di Javascript unobtrusive e progressive enhancement

Alessandro Scoscia • 25 gennaio 2008 15:29

Il tema dell'accessibilità e dell' usabilità non è nuovo agli sviluppatori di applicazioni. In alcuni contesti, come nella realizzazione di applicazioni per windows, per mac o per linux, lo sviluppo di gui usabili ed accessibili è ormai prassi consolidata. Gli stessi sistemi operativi offrono agli sviluppatori oggetti, metodi e soluzioni per lo sviluppo di questo tipo di interfacce. Nello sviluppo di applicazioni web, soprattutto quelle basate su xhtml e javascript, questa metodologia di sviluppo non è sempre seguita e la realizzazione di applicazioni accessibili è lasciata completamente alla competenze dello sviluppatore.

Le tecniche utilizzate per la realizzazione di applicazioni web usabili ed accessibili seguono i paradigmi di programmazione definiti "unobtrusive javascript" e "progressive enhancement". Molto grossolanamente ciò significa realizzare interfacce grafiche in cui la presentazione sia realizzata indipendentemente dalla logica di utilizzo in modo tale da rendere utilizzabile l'applicazione in qualunque contesto (con browser diversi, con o senza supporto css, con o senza supporto javascript). In particolare, l'utilizzo di codice javascript deve tener conto di quella che viene definita "graceful degradation" cioè della adattabilità del codice realizzato ad essere eseguito su client che hanno supporto limitato al javascript o non ne hanno affatto.

L'esempio che propongo riprende un recente ed ottimo post di Mario Spada  proprio su questo argomento. Il codice presentato da Mario è molto interessante e, in pieno stile "progressive enhancement", può essere ulteriormente modificato.

Gli script che ho realizzato consentono di stampare una tabella e, qualora il client che la visualizza abbia un adeguato supporto javascript, vengono create a runtime delle checkbox che permettono all'utente di selezionare le righe che intende stampare. Cliccando sulla checkbox presente nell'intestazione della tabella, possono essere selezionate o deselezionate automaticamente tutte le righe.

Le parti più interessanti del codice sono presenti nella funzione init eseguita al caricamento della pagina.

  • function init(){
    • //Add a column to header
    • var myTableHeaderRow = document.getElementById('myTableHeader').getElementsByTagName('tr');
    • var tmpColumn = document.createElement('td');
    • var tmpCheckBox = document.createElement('input');
    • tmpCheckBox.name="checkboxAll";
    • tmpCheckBox.type="checkbox";
    • tmpCheckBox.className="DONTEverPrint";
    • tmpCheckBox.onclick = function() {
      • checkDecheck(this.checked);
    • }
    • tmpColumn.appendChild(tmpCheckBox);
    • myTableHeaderRow[0].insertBefore(tmpColumn, myTableHeaderRow[0].firstChild);
    •  
    • //Add a column (and a checkbox inside) to each row
    • var myTableRows = document.getElementById('myTableBody').getElementsByTagName("tr");
    • for (i = 0; i < myTableRows.length; i++) {
      • var tmpColumn = document.createElement("td");
      • var tmpCheckBox = document.createElement("input");
      • tmpCheckBox.name="checkbox"+i;
      • tmpCheckBox.type="checkbox";
      • tmpCheckBox.className="DONTEverPrint";
      • tmpCheckBox.onclick = function() {
        • select_row(this,'#cccccc');
      • }
      • tmpColumn.appendChild(tmpCheckBox);
      • myTableRows[i].insertBefore(tmpColumn, myTableRows[i].firstChild);
      • myTableRows[i].className = 'DONTPrint';
    • }

Una demo dell'esempio è disponibile qui.


Ulteriori miglioramenti possibili

Lo sviluppo del codice ha richiesto l'uso della funzione "getElementsByTagName". Questa funzione ha in effetti qualche problema di compatibilità cross-browser ed andrebbe riscritta come indicato in questo post.

Pur se il codice xhtml risulta valido, la realizzazione della tabella può essere ulteriormente migliorata in termini di accessibilità per aumentare il grado di compatibilità con i più noti screen reader come indicato in questo post.

 

Commenti

Inviato da Fabrizio Caccavello il 25 gennaio 2008 17:52
Mi permetto di aggiungere solo un contributo per quanto riguarda l'uso corretto del codice di marcatura XHTML, visto che si parla di accessibilità.
L'esempio di Mario Spada mostra una sintassi XHTML di base decisamente scarsa, priva di elementi come <thead> e <tbody> essenziali per capire l'esatta struttura della tabella. Quello di Alessandro invece è meglio strutturato ma anche qui manca l'elemento <caption> ossia l'intestazione (o la didascalia visibile) della tabella. Tale elemento deve indicare il vero contenuto della tabella e si differenzia dall'attributo summary di perché quest'ultimo deve invece indicare la struttura della tabella, cioè è un elemento sicuramente invisibile ai browser visuali che deve fornire in anteprima ai browser non visuali le informazioni di base della struttura della tabella.

Scusate l'intrusione, forse maniacale, ma penso possa essere un piccolo contributo per migliorare la partenza, poi i vostri javascript miglioreranno le performance in corsa.
Inviato da Mario Spada il 28 gennaio 2008 11:11
Ringrazio Fabrizio per le precisazioni sul mio post. Sono d'accordo: per realizzare una tabella veramente accessibile, è necessario seguire scrupolosamente non solo le regole del W3C, ma anche le WCAG. Vorrei però far osservare che il mio post intendeva mettere l'accento soprattutto sull'importanza dell'approccio unobtrusive nell'utilizzo di javascript, lasciando alla sensibilità dello sviluppatore l'attenzione nella scrittura "accessibile" del codice XHTML. Il fatto che "... ho anche modificato sia l'HTML che il codice javascript dell'esempio per renderlo un poco più vicino alle direttive degli standard W3C ..." va letto come quel "poco" che basta a renderlo almeno un esempio HTML 4.01 valido. Dovessi metterlo in produzione seguirei senz'altro i suggerimenti di Fabrizio sull'accessibilità.
Inserisci un commento

I campi contrassegnati con " * " sono obbligatori




Creative Commons License Valid XHTML 1.1 Valid CSS [Valid RSS] Powered by SmartControl