Torniamo a esaminare la gerarchia del Document Object Model (DOM), che inizia con l'oggettto Window. Uno degli oggetti contenuti è Document, che comprende, tra l'altro, tutta la parte delle funzioni di intrerattività con l'utente. I Forms controllano la comunicazione con l'utente offrendo diverse possibilità di interazione.

La sintassi della dichiarazione di un forms si scrive nel corpo del testo (body) e può avere questo aspetto.

<form name="mio_form1">
<input type="text" name="mio_testo" value="Come va?">
</form>
e il codice html potrebbe interagire con il form in questo modo
<ahref="#"onMouseOver="window.document.mio_form1.mio_testo.value='Bene!';">Bene!.</a>
<a href= "#"onMouseOver="window.document.mio_form1.mio_testo.value= 'Così così!';">Così così!</a>

L'elemento <input> produce un campo di testo ( type="text") il cui valore può essere controllato dalla gerarchia di oggetti window.document.mio_form.mio_testo.value. Ogni posizione nella gerarchia è separata da un punto.

Questo l'effetto

Bene!.Così così!

  Si consiglia di crearsi un'area di lavoro aprendo una pagina vuota nella quale visualizzare gli esempi di cui qui enunciamo solo il codice.

Con  <textarea> si produce  un'area di testo di cui è possibile specificare la dimensione in righe e colonne.

<form name="mio_form2">
<textarea name="textarea1" rows= 10 cols=60>Il testo può essere anche molto lungo</textarea>
</form>

Nonostante il testo contenuto in textarea sia racchiuso tra i tag <textarea>, il suo valore può essere modificato sempre con il comando value, seguendo il relativo percorso gerarchico.

Sui campi di testo si ottiene un controllo più accurato anche tramite l'ascolto degli eventi: le principali funzioni adatte a questo scopo sono onBlur, onFocus, e onChange. Con Focus si intende che l'utente ha cliccato sull'oggetto, con Blur si intende che l'oggetto ha perso il Focus e con Change che l'oggetto è stato modificato (in questo caso che il testo è cambiato).

<input type="text" name="mio_testo"  onFocus="scrivi('focus');"  onBlur="scrivi('blur');"  onChange="scrivi('modifica');">

In questo esempio la funzione scrivi(testo), inserita nel tag <head>, può segnalare il tipo di evento scrivendo il testo adeguato nel campo textarea.

<script language="JavaScript">
<!--
function scrivi(testo)
{

var testo_aggiunto =testo + "\n"; //  \n porta a capo il prossimo testo
window.document.mio_form2.textarea1.value +=  testo_aggiunto;
//  il testo viene riscritto con l'aggiunta del nuovo testo
}
//  -->
</script>

Gli eventi possono essere provocati di proposito tramite le funzioni blur(), focus(), select().

<form name="mio_form">
<input type="text" name="mio_testo" size=40 value="Campo di testo in attesa di focus">
</form>

<a href= "#"onMouseOver="window.document.mio_form.mio_testo.focus();">focus</a>
<a href= "#"onMouseOver="window.document.mio_form.mio_testo.select();">selezione</a>

Il form, in quanto oggetto, ha suoi metodi, proprietà e controllo sugli eventi. Uno di questi è onSubmit.

<form onSubmit="return false;">
<input type="submit" value="Cliccami">
</form>

Cliccando sul pulsante non succede nulla a causa di return false.

Ovviamente un'azione del genere può far sorridere, ma dato che la semplice pressione del tasto Invio produce un'azione di submit, ci sono casi in cui questa azione è indesiderata, oppure deve produrre qualcosa di diverso dall'invio di informazioni che, non trovando sbocco, creerebbero un fastidioso reload della pagina.

<form name="mio_form" onSubmit="Invio(); return false;">
<input type="text" name="invio" size="40" value="Clicca qui e premi Invio">
</form>
La funzione Invio()
function Invio()
{
var old_testo = window.document.mio_form.invio.value;
var new_testo = 'Hai premuto Invio ' + old_testo;
window.document.mio_form.invio.value = new_testo;
}


Esercizio: creare uno script e un form che siano in grado di collegarsi a un sito digitandolo in un campo di testo e premendo il tasto Invio, oppure da pulsante.
 

Nel prossimo esempio analizziamo le principali proprietà di un Checkbox.

<form name="form_1">
<input type= "checkbox"name="check_1">Checkbox
</form>

<a href= "#"onClick="window.document.form_1.check_1.checked= true;return false;">Seleziona Checkbox</a>
<a href= "#"onClick="window.document.form_1.check_1.checked= false;return false;">Deseleziona Checkbox</a>
<a href="#" onClick= "alert(window.document.form_1.check_1.checked);return false;">Valuta il valore di Checkbox</a>

Se la casella è spuntata, il valore di checked è true, altrimenti è false. Il valore di checked può essere inserito anche di proposito.
<input type="checkbox" name= "check_1" checked>Checkbox

Esercizio: creare uno script e,d un form che siano in grado di cambiare il colore di background da bianco a nero e il colore del testo da nero a rosso con un clic su una casella di checkbox.
Tip: utilizzare <input type="checkbox" name = "check_1"onClick="spegni();">Spegni la luce</form>
 

Più input di tipo radio sono raggruppati dallo stesso name, che permette una sola selezione su una scelta multipla. Quando un form viene spedito identifica la posizione della selezione nell'elenco degli input dello stesso radio, e ne restituisce il valore. Nell'esempio che segue non viene effettuata nessuna spedizione, ma l'azione rimane all'interno della pagina; in questo caso per valutare lo stato degli input si usa un name diverso e su ognuno di questi si effettua un controllo tramite le funzioni spegni1 e accendi1.
 

function spegni1()
{
            var the_box = window.document.form_1.radio_1;
            if (the_box.checked == true) {
                    window.document.form_1.radio_2.checked = false;
                    document.bgColor='black';
                    alert("Ehi! Accendi la luce!");
            }
}
function accendi1()
{
            var the_box = window.document.form_1.radio_2;
            if (the_box.checked == true) {
                    window.document.form_1.radio_1.checked = false;
                    document.bgColor='black';
                    alert("Ehi! Accendi la luce!");
            }
}

<form name="form_1">
<input type="radio" name= "radio_1"onClick="spegni1();">Spegni la luce
<input type="radio" name="radio_2" onClick = "accendi1();"checked>Accendi la luce
</form>


Spegni la luce
Accendi la luce 

Questo tipo di operazione è molto simile al precedente, semplicemente utilizza bottoni diversi.
 

Passiamo ora alle liste prodotte dal comando <select>. Ci sono due modi di rappresentare le liste: con menu a tendina o con la barra di scorrimento. Entrambi i modi sono solo però una variazione dell'opzione size.
 

<form name="form_list">
<select name="menu_1" size=1>
<option>uno
<option>due
<option>tre
<option>quattro
<option>cinque
<option>sei
</select><p>
<select name="lista_1" size=3>
<optionselected>uno
<option>due
<option>tre
<option>quattro
<option>cinque
<option>sei
</select>
</form>

Infatti l'unica differenza sta nel fatto che la prima lista ha l'opzione size = 1, mentre la seconda l'opzione size = 3.
Per accedere ai vari elementi creati con il comando <option> si utilizza l'array di oggetti puntati dalle proprietà dell'elemento <select>.
 

window.document.form_1.lista_1.options[1].text = 'altro testo';

Cambia il secondo elemento della lista
Quale elemento nella lista è selezionato?

Notare che il conto degli elementi parte da zero.

<a href= "#"onClick="window.document.form_list.menu_1.options[1].text= 'altro testo'; return false;">Cambia il secondo elemento della lista</a>
<a href="#" onClick= "alert('Numero di indice : ' + window.document.form_list.lista_1.selectedIndex); returnfalse;">Quale elemento nella lista è selezionato?</a>

Ora che conosciamo l'indice dell'elemento selezionato, possiamo leggerne il testo utilizzando la funzione leggi_indice().

leggi_indice()
{
        var selezione  =  window.document.form_list.list_1;
        var index  =  selezione.selectedIndex;
        var sel_testo = selezione.options[index].text;

}

Esercizio: creare una lista di elementi e scrivere ogni selezione fatta dall'utente in un campo di testo, in forma di elenco.

Se la lista deve consentire una selezione multipla, allora leggere le selezioni diventa leggermente più laborioso, ma non troppo.
Riprendiamo la lista precedente.

<form name="form_1" onSubmit="multipla(); return false;>
<select name="lista_1" size=3>
<options elected>uno
<option>due
<option>tre
<option>quattro
<option>cinque
<option>sei
</select>
<input type="submit" value="Fai una selezione multipla, poi cliccami"><
</form>
La funzione multipla()
function multipla()
{
var stringhe = "";
var selezioni = window.document.form_list.list_1;
for (conto=0; conto < selezioni.options.length; conto++)
{
if (selezioni.options[conto].selected == true){
    stringhe += selezioni.options[conto].text + "\n";
}
}
window.document.form_list.textarea.value= stringhe
}
Esercizio: ripetere l'esercizio precedente con la selezione multipla.
 

Avventuriamoci ora verso uno script che richiede maggiore attenzione.


<form name="form_categorie">
<select name="scegli_categoria"
         onChange="liste_categorie(window.document.form_categorie.scegli_categoria.options[selectedIndex].text);">
  <option selected>cani
  <option>gatti
  <option>pecore
  </select>
  <select name="scelte" multiple>
  <option>pastore tedesco
  <option>pastore belga
  <option>dalmata
  </select>
  </form>
La funzione liste_categorie passa come parametro il testo della selezione corrente nella prima lista; questo viene valutato dalla funzione eval, che è in grado di rendere compatibile una semplice stringa con un array di stringhe dichiarato con lo stesso nome.
Con questo, le stringhe cani, gatti e pecore diventano gli array corrispondenti. Questa funzione è molto utile.
Una volta avuto il nome dell'array, è facile copiarne il contenuto nella seconda lista.
 
var cani = new Array("pastore tedesco","pastore belga","dalmata");
var gatti = new Array("soriano", "siamese", "persiano");
var pecore = new Array("bianca", "nera", "merinos");

function liste_categorie(nome_array)
{

> var quali_scelte = window.document.form_categorie.scelte;
 var array = eval(nome_array);
 for (conto=0; conto < quali_scelte.options.length; conto++)
 {
          quali_scelte.options[conto].text = array[conto];
 }
}
NOTA:
Non essendo argomento del corso l'utilizzo di linguaggi che fanno uso di CGI, è stata volutamente omessa la trattazione del comando Action, il quale ha il compito di spedire in fase di submit i dati contenuti nel form a un programma in grado di riceverli. Si riporta comunque una sintassi di esempio.

<form name='form1' action='http://webserver/programmaCGI.exe?">
<input type = hidden name = 'nascosto'> //un input di tipo hidden non viene visualizzato
<input type = submit name = 'Invia'>
</form>

Esercizio: raccogliere in una sola pagina tutti gli esempi presentati durante questo corso e renderli funzionanti.
Tip: utilizzare nomi diversi per i vari form.