Manuale di JavaScript

a cura di Giulio Balestreri


Indice

INTRODUZIONE

1 CONCETTI FONDAMENTALI

2 LE VARIABILI

3 IL COSTRUTTO if... then... else...

4 CICLI for

5 CICLI while

6 GLI ARRAY

7 LE FUNZIONI

Introduzione

Un documento HTML è composto per lo più da testo e immagini statiche che vengono visualizzate nella finestra del browser. Questa caratteristica dell'HTML rende impossibile l'esecuzione di elaborazioni più o meno complesse, capaci di interagire con l'utente. javascript è un linguaggio di programmazione che consente di aggiungere capacità computazionali all'HTML e assicura un livello minimo di interattività con l'utente. Questo vuol dire ad esempio, poter mantenere il controllo sulla corretta compilazione di un form, poter aggiungere effetti grafici ai documenti, ottenere informazioni sull'utente o sul tipo di browser utilizzato, modificare in tempo reale il contenuto di una pagina etc...

Prima di cominciare a scrivere una pagina HTML contenente codice javascript dobbiamo procurarci un editor di testo ASCII. Un editor di questo genere ha la caratteristica, al momento del salvataggio su file, di non inserire informazioni aggiuntive, generalmente di formattazione del testo, all'interno del file creato. E' importante assicurarsi che quanto viene salvato su file corrisponda esattamente a quello che noi abbiamo scritto e nulla di più. Microsoft Word, ad esempio, quando salva un documento in formato .doc, aggiunge informazioni di formattazione che pur non essendo visibili, una volta salvate su file creano confusione al browser che deve interpretare il documento. Uno strumento alla portata di tutti è il Notepad di Windows, tuttavia vi consiglio di utilizzate un editor di testo leggermente più evoluto, quale ad esempio il Textpad.

1. Concetti fondamentali

Il codice javascript può esser inserito direttamente all'interno di un documento HTML utilizzando opportuni TAGs, o in un file esterno e quindi collegato al documento tramite l'attributo SRC che ne identifica la posizione. In entrambi i casi il codice viene caricato ed eseguito dal browser dell'utente mentre questo sta visitando la vostra pagina. I TAGs da utilizzare per includere il codice direttamente in una pagina sono <SCRIPT> e </SCRIPT> che marcano rispettivamente inizio e fine del listato. All'interno del primo TAG indicheremo il tipo di linguaggio script che stiamo utilizzando aggiungendo il comando LANGUAGE="JavaScript". Il codice può essere posizionato sia nell'intestazione (cioè tra i TAGs <HEAD> e </HEAD>), che nel corpo del documento (tra i TAGs <BODY> e </BODY>). Nel primo caso il browser avvierà l'esecuzione del codice prima della visualizzazione della pagina, nel secondo caso l'esecuzione del codice avrà inizio a seconda della sua posizione.
Di seguito sono riportati due esempi.


<HTML> <HEAD> <TITLE>Titolo della pagina</TITLE>
<SCRIPT LANGUAGE="javascript"> <!--
alert("Welcome to Software Developers");
//-->
</SCRIPT>
</HEAD>
<BODY> Informazioni da visualizzare nel documento </BODY>
</HTML>




<HTML> <HEAD> <TITLE>Titolo della pagina</TITLE> </HEAD>
<BODY> Informazioni da visualizzare nel documento
<script language="javascript"> <!--
alert("Welcome to Software Developers");
//-->
</SCRIPT>
</BODY>
</HTML>


Il codice javascript viene eseguito dalle versioni 2 e successive di Netscape Communicator, 3 e successive di Internet Esplorer e da tutti i browser che ne supportano la sintassi. Per questo motivo, al fine di non creare confusione con i browser non abilitati all'esecuzione di javascript, il codice viene inserito tra i TAGs di commento <!-- e -->. Questo evita che i vecchi browser, invece di interpretare il sorgente, lo visualizzino nella pagina.

alert(); è una funzione predefinita di javascript che apre una finestrella in cui viene riportato un avviso (nel nostro caso la scritta "Welcome to Software Developers"). Nel primo esempio la finestrella verrà aperta prima che venga visualizzato il testo del documento all'interno del browser; quindi premendo il tasto "ok" la finestrella verrà chiusa e proseguirà la normale visualizzazione delle informazioni contenute nel BODY del documento HTML. Nel secondo caso invece, essendo il codice javascript posizionato subito prima del TAG di chiusura </BODY>, la finestrella verrà aperta solo dopo che nella pagina nel browser è stato riportato il contenuto del documento.




Se non vogliamo inserire listati javascript all'interno del codice che definisce la pagina HTML sarà sufficiente creare un file a parte contenente il codice, salvarlo con estensione .js e quindi aggiungere il parametro SRC all'interno del TAG <SCRIPT>. Questa procedura può essere utile quando lo stesso programma viene utilizzato da più pagine. La sintassi del TAG sarà quindi:


<SCRIPT LANGUAGE="javascript" SRC="nomefile.js">

Il tutto risulterà come segue:



Document.html

<HTML> <HEAD> <TITLE>Titolo della pagina</TITLE>
<SCRIPT LANGUAGE="javascript" SRC="source.js">
</SCRIPT>
</HEAD>
<BODY> Informazioni da visualizzare nel documento </BODY>
</HTML>


source.js

alert("Welcome to Software Developers");



E' importante ricordare che Javascript distingue tra lettere maiuscole e minuscole. Ciò vuol dire che la corretta sintassi ad esempio, della funzione alert() è:

alert("Testo avviso...");

Qualora dovessimo scrivere:

Alert("Testo avviso...");

lo script potrebbe non funzionare. Dico "potrebbe" in quanto la maggior parte dei browser attualmente in circolazione tendono a correggere questo tipo di errori. Consiglio comunque di far attenzione a questa caratteristica di javascript per evitare comportamenti imprevedibili dei vostri programmi. Altra cosa cui dovete fare attenzione è ricordarvi di concludere ogni comando con il carattere ";" (punto e virgola).

2. Le variabili

Una variabile è una locazione di memoria, accessibile tramite un nome scelto dal programmatore, in cui è contenuto un valore. Questo valore, solitamente impostato su un valore di default all'avvio del programma, può essere variato durante l'esecuzione dello script. I nomi delle variabili possono essere composti da lettere maiuscole e minuscole, numeri e caratteri di sottolineatura ("_"). Non è possibile invece includere spazi o altri caratteri speciali nella definizione del nome di una variabile.
Per chiarirvi le idee osservate l'esempio di seguito, in cui vengono definite tre variabili: MyName, MySurname e MyFullName.


<HTML> <HEAD> <TITLE>Titolo della pagina</TITLE>
<SCRIPT LANGUAGE="javascript"> <!--
MyName = "Luigi";
MySurname = "Arlotta";
MyFullName = MyName + " " + MySurname;
document.write("Il mio nome è " + MyFullName);
//-->
</SCRIPT>
</HEAD>
<BODY>

Informazioni da visualizzare nel documento
</BODY>
</HTML>



Fate attenzione a come viene utilizzato il carattere " (virgolette) all'interno del codice. Tutto il testo che compare all'interno delle virgolette è considerato testo statico (una costante), mentre quello che non compare tra virgolette, quando non fa parte della sintassi del linguaggio, è considerato una variabile. Il seguente esempio evidenzia quanto detto.


<HTML> <HEAD> <TITLE>Titolo della pagina</TITLE>
<SCRIPT LANGUAGE="javascript"> <!--
MyName="Luigi";
MySurname="Arlotta";
MyFullName=MyName+" "+MySurname;
document.write("<BR>Il mio nome è "+MyFullName);
document.write("<BR>Il mio nome è MyFullName");
//-->
</SCRIPT>
</HEAD>
<BODY>

Informazioni da visualizzare nel documento
</BODY>
</HTML>



Nella prima istruzione di visualizzazione (document.write("Il mio nome è "+MyFullName);) MyFullName è considerato una variabile e quindi nella pagina del browser viene visualizzato il suo valore. Nella seconda istruzione write invece (document.write("Il mio nome è "+MyFullName);), MyFullName si trova all'interno delle virgolette ("), viene quindi considerato testo statico e non una variabile. Questo è il motivo del diverso output prodotto dalle due istruzioni ed evidenziato in fig.2.2.

3. Il costrutto if...then...else...

Il costrutto if (a) then (b) else (c), tramite il quale è possibile controllare il flusso del programma, ha in javascript la seguente sintassi:

if (condizione) istruzione1; else istruzione2;

La condizione generalmente consiste nel comparare una variabile con una costante o due variabili tra loro. Se la condizione risulta vera (cioè restituisce il valore true) allora viene eseguita istruzione1 altrimenti viene eseguita istruzione2.
Nella tabella 3.1 sono elencati gli operatori di confronto.



= =Uguale a
>Maggiore di
<Minore di
!=Diverso da
>=Maggiore o uguale a
<=Minore o uguale a
Tab.3.1: Operatori di confronto



Fate attenzione all'operatore "uguale a" che è espresso da due simboli "=" (uguale) affiancati ("=="). Uno degli errori più comuni commessi dai programmatori, non solo in javascript, è quello di dimenticare un "=" nell'eseguire un confronto. Questo tipo di errore altera gravemente il flusso logico del programma. Osservate le seguenti righe:

if (Cognome == "Rossi") document.write ("Hello, Mr. Rossi!");

Cognome = "Rossi";

La prima istruzione viene interpretata come un confronto e restituisce il valore vero se la variabile Cognome contiene il valore "Rossi", falso altrimenti. La seconda istruzione invece assegna il valore "Rossi" alla variabile Cognome.

Il costrutto IF (a) THEN (b) ELSE (c) viene completato dall'utilizzo degli operatori booleani AND, OR e NOT. Tali operatori sono espressi in javascript tramite la sintassi riportata in tabella 3.2.



&&AND
||OR
!NOT
Tab.3.2: Operatori booleani in javascript


Probabilmente conoscerete il funzionamento delle tabelle di verità operatori booleani che comunque è riportata nella tabella 3.3.



aba AND ba OR bNOT a
VeroVeroVeroVeroFalso
VeroFalsoFalsoVeroFalso
FalsoVeroFalsoVeroVero
FalsoFalsoFalsoFalsoVero
Tab.3.3: Tabelle di verità


Di seguito è riportato un estratto di codice javascript in cui vengono eseguite delle operazioni condizionate. Nella tabella 3.4 sono spiegati i passaggi if... then... else.







VariabiliIstruzioneRisultato
CognomeNomeStipendio
Rossinull0if (Cognome=="Rossi") Nome = "Giovanni";
else Nome = Luca;
Vero. La variabile Nome diventa Giovanni.
La clausola else non viene eseguita.
RossiGiovanni0if ((Cognome=="Verdi")&&(Nome=="Giovanni")) Stipendio = 50;
else Stipendio = 10;
Falso. Viene eseguito il ramo else.
La Variabile Stipendio viene impostata sul valore 10
RossiGiovanni10if ((Cognome=="Rossi")&&(Nome=="Giovanni")) Stipendio = 37;Vero. La Variabile Stipendio viene impostata sul valore 37
RossiGiovanni37if (Stipendio<40) Stipendio = Stipendio +5;Vero. La variabile Stipendio viene incrementata di 5
RossiGiovanni42if (Stipendio<40) Stipendio = Stipendio +5;Falso. Nessuna operazione viene eseguita

Tab.3.4: Alcuni esempi

4. Cicli for

Un'altra istruzione utile per il controllo del flusso del programma è il costrutto for. Quest'ultimo ci permette di richiedere l'esecuzione di una o più istruzioni fin quando non si verifica una particolare condizione, detta condizione d'uscita. La sintassi javascript del costrutto è la seguente:

for (v=startValue; condizione su v; istruzione su v)
{ bloccoDiIstrizioni; }

dove v è la variabile di controllo del ciclo. v viene inizializzata sul valore startValue prima dell'inizio del ciclo. condizione su v è la condizione di uscita del ciclo. Il ciclo termina quando condizione su v restituisce il valore false (cioè quando la condizione su v non è più verificata, quindi falsa). Il primo controllo sulla condizione viene effettuato all'ingresso nel ciclo, prima della prima iterazione, è quindi possibile che le istruzioni appartenenti a bloccoDiIstruzioni non vengano mai eseguite. Ciò avviene quando condizione su v restituisce immediatamente il valore false. istruzione su v è un'istruzione che modifica il valore della variabile di controllo v. Tale istruzione generalmente fa si che v tenda al valore che soddisfa la condizione di uscita (quindi tale da rendere condizione su v falso). Se così non fosse il rischio sarebbe quello di mandare il processo in loop, cioè creare un ciclo infinito, senza uscita.
L'esempio di seguito contiene codice javascript che costruisce una tabella tramite l'istruzione for.


Titolo della pagina



Informazioni da visualizzare nel documento




Per quanto quello descritto sia il modo più comune di utilizzare il costrutto for, è anche possibile che la variabile di controllo non sia v, cioè che la condizione di uscita non riguardi la variabile v; o che l'istruzione di iterazione non modifichi v ma qualche altra variabile. E' anche possibile che venga omessa una o più istruzioni tra quelle di inizializzazione, controllo, iterazione.
Tramite l'esecuzione dell'istruzione break all'interno del bloccoDiIstruzioni di un ciclo viene immediatamente interrotta l'esecuzione del ciclo stesso, anche se la condizione di uscita non si è ancora verificata.
Di seguito sono riportati alcuni esempi.


Titolo della pagina



Informazioni da visualizzare nel documento




Il codice javascript visualizza parte dei colori utilizzabili nelle pagine web, con i rispettivi valori RGB. Osserviamo che nel secondo e terzo ciclo for manca l'istruzione di inizializzazione della variabile di controllo. Le variabili g e b infatti vengono inizializzate all'inizio del codice in quanto sono utilizzate già nel primo ciclo. Da notare inoltre l'utilizzo del carattere "\" per inserire nel codice HTML generato dal programma il carattere " (virgolette). L'istruzione:

document.write("Color #"+r+g+b+"
");

genera la seguente linea di codice HTML:

This is color #102040


Nel prossimo esempio faremo uso dell'istruzione break per interrompere l'esecuzione di un ciclo for nel quale non è stata definita alcuna condizione d'uscita.


Titolo della pagina



...
Informazioni da visualizzare nel documento

...




Osservate l'output del browser in fig.4.3. Il ciclo termina alla settima iterazione in quanto quando la variabile di controllo k raggiunge il valore 7, viene eseguita l'istruzione break.




Fig.4.3: Finestra del Browser
Fig.4.3: Finestra del browser



Oltre all'istruzione break, è possibile utilizzare, all'interno di un ciclo for, l'istruzione continue. Quest'ultima interrompe l'esecuzione di una particolare iterazione, senza però interrompere l'esecuzione del ciclo.
Nell'esempio di seguito vengono interrotte la terza e la settima iterazione. Il ciclo comunque continua fin quando non risulta verificata la condizione d'uscita.


Titolo della pagina



...
Informazioni da visualizzare nel documento

...




Osservate l'output del browser in fig.4.4. in cui non compaiono le linee di output relative alle iterazioni 3 e 7.




Fig.4.4: Finestra del Browser
Fig.4.4: Finestra del browser

5. Cicli while

Un ciclo while è leggermente meno sofisticato di un ciclo for, ma svolge approssimativamente la stessa funzione. E' composto da un blocco di istruzioni e da una condizione di uscita. All'ingresso del ciclo e ogni volta che viene eseguito tutto il blocco di istruzioni si effettua il controllo sulla condizione di uscita. Il ciclo termina quando la condizione d'uscita restituisce il valore false.
La sintassi di un ciclo while è la seguente:

while (condizione)
{ bloccoDiIstrizioni; }

dove condizione è la condizione di uscita del ciclo. Il ciclo termina quando condizione restituisce il valore false (cioè quando la condizione risulta falsa). Il primo controllo sulla condizione viene effettuato all'ingresso nel ciclo, prima della prima iterazione, è quindi possibile che le istruzioni appartenenti a bloccoDiIstruzioni non vengano mai eseguite nel caso condizione risulti immediatamente false. Anche nel caso di cicli while, come per i cicli for, sussiste il pericolo di mandare il processo in loop. Questo avviene quando, al ripetersi delle iterazioni, non si verifica mai la condizione d'uscita.

La stessa applicazione vista nel capitolo precedente, che costruisce una tabella è stata realizzata sostituendo il ciclo for con un ciclo while.
Di seguito è riportato il codice.


Titolo della pagina



Informazioni da visualizzare nel documento




Anche nei cicli while è possibile far uso delle parole chiave break e continue, il cui funzionamento è stato spiegato nel capitolo precedente.

Nella tabella 5.2 sono riportati alcuni estratti di codice di cicli while e di cicli for. Ogni coppia di istruzioni esegue le stesse operazioni.




Ciclo forCiclo while
for (i=0; i<10; i++) {document.write.("Iterazione n° "+i+"
");
}
i=0;
while (i<10) {document.write.("Iterazione n° "+i+"
");
i++;
}
for (i=0;; i++) {document.write.("Iterazione n° "+i+"
");
if (i==8) break;
}
i=0;
while (i<10) {document.write.("Iterazione n° "+i+"
");
i++;
if (i==9) break;
}
for (i=0;i<10; i++) {if (i==6) continue;
document.write.("Iterazione n° "+i+"
");
}
i=0;
while (i<10) {if (i==6) continue;
document.write.("Iterazione n° "+i+"
");
i++;
}
for (;;);while (true);
Tab.5.2: Confronto tra cicli for e cicli while

6. Gli Array

Un array è una variabile contenente più valori. In un array ogni valore viene identificato (ed è dunque possibile accedervi e/o modificarlo) un numero d'ordine che ne indica la posizione.

Il codice che segue dichiara una variabile di tipo array di dimensione pari a cinque. La variabile, di nome VarArray, viene quindi inizializzata, inserendo in ogni locazione un valore. Il successivo ciclo for visualizza tutti i valori contenuti in VarArray.


Titolo della pagina



Altre informazioni da visualizzare nel documento







Gli array generalmente sono utilizzati per memorizzare variabili dello stesso tipo, o comunque legate da una qualche relazione logica. L'uso degli array risulta comodo anche in fase di consultazione: se decidiamo di accedere alle variabili contenute in un array, magari per stamparle come nell'esempio precedente, l'operazione può essere svolta utilizzando un'unica istruzione di ciclo (for o while). Al contrario, se avessimo utilizzato al posto di un array più variabili di nome differente non sarebbe stato altrettanto immediato scrivere il codice necessario ad accedere ad ognuna di esse. Il codice che segue fornisce lo stesso output del precedente, ma non fa uso di variabili di tipo array. Osservate come la procedura di visualizzazione dei valori delle cinque variabili richieda più istruzioni.


Titolo della pagina



Altre informazioni da visualizzare nel documento




Gli esempi sviluppati in questo capitolo probabilmente non mostrano la vera utilità degli array. Purtroppo, quanto abbiamo appreso fino ad ora non è sufficiente per sviluppare esempi che mostrino a pieno i vantaggi effettivamente offerti da questo genere di oggetti. Non preoccupatevi, nei prossimi capitoli, quando avremo imparato qualcosa di più, torneremo ad utilizzare gli array in modo più intelligente.

7. Le Funzioni

Le funzioni sono blocchi di istruzioni distinti dal programma principale che possono essere richiamati quando il programma necessita l'esecuzione di una determinata operazione per la quale la funzione è stata scritta. Ogni funzione ha un nome che la identifica. Le funzioni possono accettare in ingresso un numero arbitrario di parametri (variabili) in base ai quali eseguono una determinata operazione. A questo punto, se necessario, restituiscono un valore in output. Il valore restituito può essere memorizzato in una variabile ed utilizzato quando necessario. Le funzioni sono uno strumento fondamentale in ogni linguaggio di programmazione. Esse permettono di suddividere tutta l'elaborazione che deve svolgere l'applicazione in blocchi di istruzioni elementari e quindi più semplici da definire e controllare. Questa tecnica, è attualmente la più diffusa tra i cosiddetti "linguaggi imperativi" e prende il nome di programmazione modulare. L'applicazione richiamerà ogni singola funzione fornendole gli opportuni valori d'ingresso e memorizzando gli eventuali output restituiti. L'ordine in cui le funzioni vengono richiamate potrà variare a seconda dei dati forniti in ingresso dall'utente e/o dai risultati delle funzioni già eseguite.
La definizione di una funzione avviene attraverso la seguente sintassi:



function NomeFunzione(par1, par2, ..., parN)
{ CorpoDellaFunzione;
}


Dove NomeFunzione è il nome della funzione; par1, par2, ..., parN sono N parametri che la funzione riceve in input quando ne è richiesta l'esecuzione (N può anche essere 0). I parametri passati ad una funzione non devono essere necessariamente tipi di dati elementari (interi, stringhe, ...) ma possono anche essere oggetti definiti dal programmatore (vedi cap. 8). Tra le parentesi graffe ("{" e "}") compare il corpo della funzione, cioè le istruzioni che verranno eseguite al momento dell'attivazione. Eseguito il blocco di istruzioni viene generalmente restituito un valore, indicato col nome di output o risultato della funzione.

Supponiamo di aver la necessità di definire una funzione che visualizzi del testo, passato come parametro, in un documento HTML sotto forma di paragrafo. Potremo scrivere una funzione come la seguente:



function writeString (str)
{ document.write("

"+str+"

");
}


Quando all'interno del codice javascript avremo bisogno di visualizzare del testo sotto forma di paragrafo sarà sufficiente utilizzare l'istruzione:


writeString("Testo del paragrafo che verrà impaginato dalla funzione");

di seguito è riportato il codice completo della pagina HTML in cui è definita ed utilizzata la funzione writeString().




Titolo della pagina


...


Altre informazioni da visualizzare nel documento

...







E' possibile inviare ad una funzione più parametri di quelli effettivamente richiesti. In questo caso dovremo far uso della parola chiave arguments per accedervi. arguments potrà essere trattato come un array di lunghezza pari al numero di parametri in eccesso che sono stati passati alla funzione. Definiamo una funzione utile per visualizzare in un documento HTML liste di elementi. L'unico parametro previsto è listType che indica il tipo dell'elenco (numerato o semplice). Gli altri parametri vengono controllati tramite l'array argumets.



function printList (listType)
{ document.write("<" + listType + "L>");
for (var i = 1; i < printList.arguments.length; i++) document.write("
  • " + printList.arguments[i]);
  • document.write("");
    }


    Vediamo ora come può essere utilizzata la funzione appena definita. Di seguito è riportato il codice di una pagina HTML che fa uso di printList().




    Titolo della pagina


    ...


    Altre informazioni da visualizzare nel documento
    ...




    Il prossimo esempio si basa ancora sull'utilizzo dell'array arguments, ma svolge un'operazione diversa. CreateTable() è una funzione che permette di creare velocemente delle tabelle in una pagina HTML. In input sono richiesti il numero di colonne e di righe di cui deve essere composta la tabella; quindi i valori per i parametri border e background. I parametri addizionali, cui andremo ad accedere attraverso l'array arguments sono il contenuto delle singole celle.
    Come al solito di seguito è riportato il listato completo della funzione, una pagina HTML che ne fa uso e il corrispondente output visto nella finestra del browser.



    function createTable (cols, rows, border, bkg)
    { document.write("");
    var argnum=1;
    for (var k=0; k document.write("");
    for (var kk=0; kk if ((4+(k*cols+kk)) <= createTable.arguments.length) { document.write (""); } }
    document.write(""); }
    document.write("
    "+createTable.arguments[4+(k*cols+kk)]+"
    ");
    }




    Il codice completo sarà:


    Titolo della pagina


    ...

    Altre informazioni da visualizzare nel documento

    ...







    Fig.7.3: Finestra del Browser
    Fig.7.3: Finestra del browser