laboratorio caffeina

in few words, just developing

 

Tag: form

 
 

Form highlighting

Dopo l'autofocus, altro script a mio parere utilissimo è quello dell'highlighting degli input field e delle textarea, ovvero un semplice meccanismo javascript + css che permette di evidenziare il campo della form attualmente in uso. Vi propongo una funzione sviluppata in maniera che sia abbastanza adattabile ai diversi casi.

JavaScript:
  1. window.onload = function(){
  2.   /*applico l'highlight a tutti i campi di input*/
  3.   var inputFields = document.getElementsByTagName("INPUT");
  4.   for(i=0; i<inputFields.length; i++){
  5.     var field = inputFields.item(i);
  6.     if ( field != undefined){
  7.       if ( field.type=="text" || field.type=="password" ){
  8.         /*onfocus cambio la classe corrente con quella focus*/
  9.     field.onfocus = function(){this.className="focus";}
  10.         /*onblur ripristino la classe di default*/
  11.     field.onblur = function(){this.className="";}
  12.       }
  13.     }
  14.   }
  15.   /*stesso vale per le textarea*/
  16.   var textareas = document.getElementsByTagName("TEXTAREA");
  17.   for(i=0; i<textareas.length; i++){
  18.     var textarea = textareas.item(i);
  19.     textarea.onfocus = function(){this.className="focus";}
  20.     textarea.onblur = function(){this.className="";}
  21.   }
  22. }

Chiaramento a questo script va assocciato un opportuno foglio di stile con almeno una classe focus.

CSS:
  1. input.focus{
  2.   border: 1px solid #a00;
  3. }
  4. textarea.focus{
  5.   border: 1px solid #a00;
  6. }
  7. input, textarea{
  8.   padding: 1px;
  9.   background-color: #eee;
  10.   border: 1px solid #999;
  11. }

Visto che sostenere l'utilità di questi script può essere discutibile, vi propongo un esempio completo di una tipica form di contatti.

N.B: Questi script non trattano campi del tipo checkbox, ma in quel caso bisognerebbe studiare una soluzione ad hoc che evidenzi l'intera area contente tutti i radio button o checkbox e non il singolo, poichè la check box o i radio button sono uno o più valori per un campo.

Testato su:
Firefox 2.0.0.3 (Linux)
Mozilla 1.7.13 (Linux)
Epiphany 2.16.1 (Linux)
Galeon 2.0.2 (Linux)
IE 6.0 (Linux)

 
 
 

Autofocus e form usability

Leggendo l'articolo di Diego, Accessibilità  ed usabilità  nelle form, mi sono risorte in mente alcune questioni sulle form che reputo interessanti.

Prima fra tutte l'autofocus, uno script muove il cursore dell'utente direttamente su uno specifico campo di input al caricamento della pagina, come avviene in Google. Per il form proposto nell'articolo sopra citato lo script sarebbe:

JavaScript:
  1. /*window.onload equivale all'evento onload del tag body*/
  2. window.onload = document.forms[0].s.focus();

I problemi sorgono in quelle pagine in cui convivo più forms, spesso per esempio una form di login e una di ricerca. Capita quindi che l'utente vorrebbe autenticarsi, lo script sposta il cursore sul campo di ricerca e l'utente finito di digitare lo username compone la password, così oltre alla perdita di tempo si aggiunge magari la vista in chiaro della password nel campo di ricerca. Per risolvere questo problema riporto uno script che ho ritoccato in modo da renderlo più generico.

JavaScript:
  1. window.onload=function(){
  2.   var isfocused = false;
  3.   /*ottengo tutti i tag input della pagina HTML*/
  4.   var inputFields = document.getElementsByTagName("INPUT");   
  5.   /*scorro con un ciclo for ogni elemento della nodeList*/
  6.   for(i=0; i<inputFields.length; i++){
  7.   var current = inputFields.item(i);
  8.     /*considero solo gli elementi definiti e di tipo text*/
  9.     if(current != undefined){
  10.       if(current.type == "text" || current.type == "password")
  11.       {
  12.         /*controllo se nessun valore è stato cambiato*/
  13.         if(current.value != current.defaultValue){
  14.           isfocused = true;
  15.         }
  16.       }
  17.     }
  18.   }
  19.   var textarea = document.getElementsByTagName("TEXTAREA");   
  20.   for(i=0; i<textareas.length; i++){
  21.     var current = textareas.item(i);
  22.     if(current !== undefined){
  23.       if(current.value != current.defaultValue){
  24.         isfocused = true;
  25.       }
  26.     }
  27.   }
  28.   /*se nessun valore di default cambia scatta l'autofocus*/
  29.   if(!isfocused){
  30.     inputFields.item(0).focus();
  31.   }
  32. }

Testato su:
Firefox 2.0.0.3 (Linux)
Mozilla 1.7.13 (Linux)
Epiphany 2.16.1 (Linux)
Galeon 2.0.2 (Linux)
IE 6.0 (Linux)

 
 
 

Accessibilità  ed usabilità  nelle form

Dopo aver visto come creare e far funzionare un semplice motore di ricerca, ora vedremo, usando pochi accorgimenti, come renderlo accessibile via codice HTML.

Form iniziale:

HTML:
  1. <form method="get" action="/search.asp">
  2.     <label for="s">cerca:</label>
  3.     <input name="s" id="s" type="text" />
  4.     <input value="invia" type="submit" />
  5.   </fieldset>
  6. </form>

Il fatto di usare solo elementi strutturali usando l'elemento "fieldset" aiuta sicuramente l'interpretazione della pagina da parte dei browser testuali e tecnologie assistive. L'elemento "legend" servirà  a dare un nome ai vari gruppi della form. Nel caso specifico avremo bisogno di un solo "legend".

HTML:
  1.   <legend>Modulo di Ricerca</legend>
  2. </fieldset>

Occorre associare delle etichette (label) significative ai relativi input e legarle con l'attributo "for" al corrispettivo "id" dell'input.

HTML:
  1. <label for="s">cerca:</label>
  2.   <input name="s" id="s" type="text" />

Occorre controllare, soprattutto in caso di form molto complesse, che vi sia un ordine logico e che questo possa essere seguito anche attraverso la navigazione da tastiera spostando il focus delle azioni con il tasto "tab". Per far questo useremo l'attributo "tabindex".

HTML:
  1. <input name="s" id="s" tabindex="1" type="text" />
  2.   <input value="invia" tabindex="2" type="submit" />

Per far si che le "input" siano accessibili anche usando le combinazioni dei tasti di scelta rapida, daremo loro l'attributo "accesskey" indicando nel label corrispettivo la lettera tra parentesi quadre.

HTML:
  1. <label for="s">[c] cerca:</label>
  2.   <input name="s" id="s" tabindex="1" accesskey="c" type="text" />

NB: IE: tasto ALT + numero o lettera tra parentesi + INVIO. FF: ALT + SHIFT + numero o lettera tra parentesi. Apple: componendo la combinazione del tasto CMD ("tasto mela") + numero o lettera tra parentesi.

Quindi il risultato finale del nostro semplice form sarà :

HTML:
  1. <form method="get" action="/search.asp"> 
  2.     <legend>Modulo di Ricerca</legend>
  3.     <label for="s">[c] cerca:</label>
  4.     <input name="s" id="s" tabindex="1" accesskey="c" type="text" />
  5.     <input value="invia" accesskey="s" tabindex="2" type="submit" />
  6.   </fieldset>
  7. </form>

Modulo di Ricerca

Per approfondire:

 
 
 

Utilizzare il Tab in una Textarea

Nel normale funzionamento di un form il tasto tab passa da un campo all'altro.

Capita però (come in questo blog) di dover dare la possibilità  a chi scrive di inserire del codice e tutti sappiamo quanto sia FONDAMENTALE l'indentazione per renderlo comprensibile.

O ci si affida all'intelligenza di chi scrive, sperando che utilizzi in modo coerente gli spazi o il copia e incolla, oppure si utilizza questa funzione (via l4x.org ):

JavaScript:
  1. function insertTab(event,obj) {
  2.     var tabKeyCode = 9;
  3.     if (event.which) // mozilla
  4.         var keycode = event.which;
  5.     else // ie
  6.         var keycode = event.keyCode;
  7.     if (keycode == tabKeyCode) {
  8.         if (event.type == "keydown") {
  9.             if (obj.setSelectionRange) {  // mozilla
  10.                 var s = obj.selectionStart;
  11.                 var e = obj.selectionEnd;
  12.                 obj.value = obj.value.substring(0, s) + "\t" + obj.value.substr(e);
  13.                 obj.setSelectionRange(s + 1, s + 1);
  14.                 obj.focus();
  15.             } else if (obj.createTextRange) {  // ie
  16.                 document.selection.createRange().text="\t"
  17.                 obj.onblur = function() { this.focus(); this.onblur = null; };
  18.             } else {
  19.                 // unsupported browsers
  20.             }
  21.         }
  22.         if (event.returnValue) // ie ?
  23.             event.returnValue = false;
  24.         if (event.preventDefault) // dom
  25.             event.preventDefault();
  26.         return false; // should work in all browsers
  27.     }
  28.     return true;
  29. }

HTML:
  1. <textarea onkeydown="return insertTab(event,this);" onkeyup="return insertTab(event,this);"  onkeypress="return insertTab(event,this);"  rows="30" cols="80"></textarea>

 
 
 
Chiudi
E-mail It