Programmazione in JavaScript
Programmazione in JavaScript
Dipartimento di Informatica
Programmazione in JavaScript
Vincenzo Ambriola
Prefazione
Per chi si avvicina alla programmazione gli ostacoli da superare sono tanti: un
nuovo linguaggio (artificiale) da imparare, strumenti di sviluppo da provare per
capirne la logica di funzionamento, esercizi da risolvere per apprendere i con-
cetti di base e, successivamente, quelli più avanzati. Ci sono molti modi per in-
segnare a programmare e ogni docente, nel tempo, ha trovato il suo.
Questo libro è rivolto agli studenti del primo anno del Corso di laurea in In-
formatica umanistica che seguono Elementi di programmazione (uno dei due
moduli dell’insegnamento di Fondamenti teorici e programmazione) e Pro-
grammazione (uno dei due moduli di Progettazione e programmazione web).
L’approccio adottato si basa sull’introduzione graduale dei concetti di Java-
Script, un linguaggio di programmazione ampiamente usato per la programma-
zione web.
Questo libro non è un manuale di JavaScript. Il linguaggio è troppo comples-
so per insegnarlo a chi non ha mai programmato e, soprattutto, di manuali di
questo tipo ce ne sono tanti in libreria. Il libro presenta gli aspetti più importan-
ti di JavaScript, necessari ma, soprattutto, sufficienti per la soluzione dei pro-
blemi proposti. Il lettore interessato agli aspetti più avanzati di JavaScript e al
suo uso professionale è invitato a continuare lo studio e la pratica di questo lin-
guaggio. I risultati supereranno di gran lunga le aspettative.
Con l’evoluzione dei browser, JavaScript ha subito numerose modifiche, ac-
quisendo progressivamente nuove funzionalità. Per evitare possibili confusioni,
il libro fa riferimento alla versione del linguaggio conforme allo standard EC-
MAScript 2017 e accettata dal browser Firefox (versione aggiornata alla data del
libro).
―3―
Programmazione in JavaScript
1.2 Ringraziamenti
La prima parte di questo libro nasce da una lunga collaborazione con Giuseppe
Costa, coautore di 4 passi in JavaScript. Senza le sue preziose indicazioni non
avrei capito e apprezzato le insidie e la bellezza di un linguaggio di programma-
zione complesso come JavaScript. La seconda parte è stata scritta seguendo i
consigli e i suggerimenti di Maria Simi, profonda conoscitrice del web, della sua
storia e delle tante tecnologie ad esso collegate.
―4―
Programmazione in JavaScript
Indice
Prefazione...............................................................................................................3
1.1 Struttura del libro..........................................................................................3
1.2 Ringraziamenti..............................................................................................4
2 Linguaggi e grammatiche..................................................................................11
2.1 Alfabeto, linguaggio.....................................................................................11
2.2 Grammatiche...............................................................................................12
2.3 Backus-Naur Form......................................................................................13
2.4 Sequenze di derivazione.............................................................................14
2.5 Alberi di derivazione...................................................................................15
3 Programmi, comandi e letterali........................................................................17
3.1 Programma..................................................................................................17
3.2 Letterali numerici e logici...........................................................................18
3.3 Letterali stringa..........................................................................................20
3.4 Comando di stampa....................................................................................21
4 Espressioni........................................................................................................23
4.1 Operatori.....................................................................................................23
4.2 Valutazione delle espressioni.....................................................................25
4.3 Casi particolari............................................................................................26
4.4 Conversione implicita................................................................................26
4.5 Esercizi........................................................................................................27
5 Variabili e assegnamento..................................................................................29
5.1 Dichiarazione di costante...........................................................................30
5.2 Variabili ed espressioni..............................................................................30
5.3 Comando di assegnamento.........................................................................31
5.4 Abbreviazioni del comando di assegnamento............................................31
5.5 Esercizi........................................................................................................32
6 Comandi condizionali.......................................................................................33
6.1 Comando condizionale...............................................................................33
6.2 Comando di scelta multipla.......................................................................34
7 Funzioni.............................................................................................................37
7.1 Funzioni anonime.......................................................................................39
7.2 Anno bisestile.............................................................................................40
7.3 Visibilità......................................................................................................40
7.4 Funzioni di conversione.............................................................................42
7.5 Funzioni predefinite...................................................................................42
7.6 Esercizi........................................................................................................42
8 Comandi iterativi..............................................................................................45
8.1 Comando iterativo determinato.................................................................45
8.2 Comando iterativo indeterminato.............................................................46
8.3 Primalità.....................................................................................................47
8.4 Radice quadrata intera...............................................................................48
8.5 Esercizi........................................................................................................48
9 Array...................................................................................................................51
―5―
Programmazione in JavaScript
―6―
Programmazione in JavaScript
―7―
Parte prima
Elementi di programmazione
Programmazione in JavaScript
2 Linguaggi e grammatiche
― 11 ―
Programmazione in JavaScript
Una frase su un alfabeto è una sequenza di lunghezza finita formata dai sim-
boli dell’alfabeto. Ad esempio, con l’alfabeto A definito in precedenza si possono
formare le frasi aa, abba, caab.
Dato un alfabeto A, l’insieme di tutte le frasi che si possono formare usando i
suoi simboli è infinito, anche se ogni frase è di lunghezza finita. Per semplicità
questo insieme è chiamato insieme delle frasi di A. Sempre usando l’esempio
precedente, è possibile formare l’insieme delle frasi di A ma non è possibile ri-
portarlo in questo libro perché, come già detto, la sua lunghezza è infinita. Cio-
nonostante, è possibile mostrarne una parte finita, usando come artificio i pun-
tini di sospensione per indicare la parte infinita: {a, b, c, aa, ab, ac, ba, bb, bc,
ca, cb, cc, ...}.
Dato un alfabeto A, un linguaggio L su A è un sottoinsieme delle frasi di A.
Questa definizione è diversa da quella data in precedenza: non tutte le frasi di A
sono, infatti, anche frasi di L.
Abbiamo fatto riferimento a “un” linguaggio e non “del” linguaggio su un alfa-
beto perché può esistere più di un linguaggio su un dato alfabeto. Prendiamo
come esempio il linguaggio italiano e quello inglese: entrambi si basano sull’al-
fabeto latino (detto anche alfabeto romano), ma sono costituiti da insiemi diver-
si di frasi.
I like walking on the grass è una frase del linguaggio inglese, ma non lo è di
quello italiano. Mi piace camminare sull’erba è una frase del linguaggio italia-
no, ma non lo è di quello inglese, anche se il significato è lo stesso.
Sdksfdk skjfsfkj sdkfsakjfd, invece, non è una frase né del linguaggio italiano
né di quello inglese, nonostante appartenga all’insieme delle frasi sull’alfabeto
latino.
2.2 Grammatiche
Un linguaggio ha due aspetti importanti:
• sintassi: le regole per la formazione delle frasi del linguaggio (ad esem-
pio, la grammatica italiana);
• semantica: il significato da attribuire ad ogni frase del linguaggio (ad
esempio, tramite l’analisi logica delle frasi, che permette di individuare il
soggetto di una data azione, l’oggetto e così via).
Esistono formalismi che definiscono i due aspetti di un linguaggio. In questo li-
bro presentiamo un formalismo per la definizione della sintassi. Non trattiamo,
invece, gli aspetti relativi alla definizione formale della semantica.
― 12 ―
Programmazione in JavaScript
― 13 ―
Programmazione in JavaScript
― 14 ―
Programmazione in JavaScript
<S>
=> Regola <S> ::= <A> <B>
<A> <B>
=> Regola <A> ::= a | a <A> seconda opzione
a <A> <B>
=> Regola <A> ::= a | a <A> prima opzione
a a <B>
=> Regola <B> ::= b | b <B> prima opzione
aab
<S>
Applichiamo la regola <S> ::= <A> <B> al nodo radice dell’albero di derivazio-
ne. L’applicazione della regola genera due nuovi nodi.
<S>
<A> <B>
Applichiamo la regola <A> ::= a | a <A> (seconda opzione) al nodo <A> e la re-
gola <B> ::= b | b <B> (prima opzione) al nodo <B>.
<S>
<A> <B>
a <A> b
― 15 ―
Programmazione in JavaScript
Infine applichiamo la regola <A> ::= a | a <A> (prima opzione) al nodo <A>. La
frase aab è formata dai simboli terminali presenti sulle foglie dell’albero di deri-
vazione, letti da sinistra a destra.
<S>
<A> <B>
a <A> b
― 16 ―
Programmazione in JavaScript
3.1 Programma
In JavaScript un programma è una sequenza di comandi. Un comando può es-
sere una dichiarazione, un comando semplice o un comando composto.
<Programma> ::= <Comandi>
1 http://www.di.unipi.it/~ambriola/pw/radice.htm
― 17 ―
Programmazione in JavaScript
<CifraNZ> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
― 18 ―
Programmazione in JavaScript
― 19 ―
Programmazione in JavaScript
<Lettera> ::= a | b | c | d | e | f | g | h | i
| j | k | l | m | n | o | p | q | r
| s | t | u | v | w | x | y | z
| A | B | C | D | E | F | G | H | I
| J | K | L | M | N | O | P | Q | R
| S | T | U | V | W | X | Y | Z
In un programma, i letterali stringa devono essere scritti su una sola riga. Per
inserire ritorni a capo, tabulazioni, particolari caratteri o informazioni di for-
mattazione si utilizza la barra diagonale decrescente: '\''3 chiamata anche ca-
rattere di quotatura. La coppia formata da backslash e da un altro carattere è
chiamata sequenza di escape. Le principali sequenze di escape sono:
• \n: nuova riga;
2 Carattere di spaziatura.
3 In inglese questo carattere si chiama backslash.
― 20 ―
Programmazione in JavaScript
4 Come vedremo nel seguito, il comando di stampa è un’invocazione di funzione. Per semplici-
tà, in questo capitolo è trattato come un comando semplice.
― 21 ―
Programmazione in JavaScript
4 Espressioni
4.1 Operatori
Gli operatori che hanno un unico operando sono detti unari. Gli operatori unari
sono:
• − : segno negativo
• + : segno positivo
• ! : negazione
L’operatore di segno negativo ha un operando il cui valore è un numero. L’ope-
ratore cambia il segno del valore. Anche l’operatore di segno positivo ha un ope-
rando il cui valore è un numero. In questo caso, però, il segno del valore non è
modificato. Questi due operatori sono detti numerici, perché il loro risultato è
un numero.
― 23 ―
Programmazione in JavaScript
― 24 ―
Programmazione in JavaScript
― 25 ―
Programmazione in JavaScript
― 26 ―
Programmazione in JavaScript
4.5 Esercizi
I seguenti problemi devono essere risolti usando letterali e operatori e visualiz-
zando il risultato con il comando di stampa.
― 27 ―
Programmazione in JavaScript
5 Variabili e assegnamento
Per descrivere un calcolo è necessario tener traccia dei valori intermedi, memo-
rizzandoli per usarli in seguito. Nei linguaggi di programmazione questo ruolo è
svolto dalle variabili. In JavaScript, come negli altri linguaggi di programma-
zione imperativi, una variabile è un identificatore a cui è associato un valore.
<Identificatore> ::= <CarIniziale>
| <CarIniziale> <Caratteri>
― 29 ―
Programmazione in JavaScript
La costante π (pi greco), il cui valore approssimato alle prime dieci cifre decima-
li è 3,1415926535, può essere dichiarata come segue.
const PI_GRECO = 3,1415926535;
― 30 ―
Programmazione in JavaScript
― 31 ―
Programmazione in JavaScript
tato alla variabile x. Lo stesso ragionamento è applicabile agli altri operatori nu-
merici.
<Assegnamento> ::= <Identificatore>++;
| <Identificatore>--;
| <Identificatore> += <Espressione>;
| <Identificatore> -= <Espressione>;
| <Identificatore> *= <Espressione>;
| <Identificatore> /= <Espressione>;
| <Identificatore> %= <Espressione>;
5.5 Esercizi
Risolvere i seguenti problemi utilizzando variabili, costanti, letterali e operatori.
Il risultato deve essere visualizzato mediante il comando di stampa print, dispo-
nibile nell’ambiente EasyJS.
― 32 ―
Programmazione in JavaScript
6 Comandi condizionali
Il comando inizia con la parola riservata if, seguita da un’espressione tra paren-
tesi tonde, detta condizione. Il valore della condizione deve essere un booleano.
Se la condizione vale true (la condizione è vera), si esegue il primo blocco di co-
mandi, detto blocco. Se la condizione vale false (la condizione è falsa) ci posso-
no essere due casi: se è presente ed è preceduto dalla parola riservata else, viene
eseguito il secondo blocco, altrimenti non si esegue alcun comando.
Un blocco è costituito da una sequenza di comandi racchiusa tra parentesi
graffe. Un blocco è considerato un comando unico e permette di utilizzare una
sequenza di comandi dove normalmente sarebbe possibile usarne solo uno.
Nel seguito mostriamo un programma che usa due comandi condizionali. Nel
primo comando la condizione è vera se il valore della variabile x è maggiore di
zero: in tal caso il suo valore è decrementato di uno. Non è prevista alcuna azio-
ne nel caso in cui il valore di x sia minore o uguale a zero. Il secondo comando è
un esempio che mostra come sia possibile assegnare a x un valore maggiore di
― 33 ―
Programmazione in JavaScript
I comandi condizionali possono essere annidati per effettuare una scelta tra più
di due possibilità. Il seguente esempio mostra due comandi condizionali anni-
dati e mostra anche come sia possibile evidenziare la struttura di un programma
mediante l’indentazione.
if (a < 6) {
b = 1;
} else {
if (a < 8) {
b = 2;
} else {
b = 3;
}
}
― 34 ―
Programmazione in JavaScript
Con questa modifica, anche quando il valore del selettore è uguale a 5, la varia-
bile z non è incrementata.
È possibile inserire, rigorosamente per ultima, un’alternativa speciale i cui
comandi sono eseguiti quando il confronto ha avuto esito negativo per tutte le
alternative.
― 35 ―
Programmazione in JavaScript
switch (x) {
case 5 : y += 5; break;
case 6 : z += 6; break;
default : z++;
}
Con questa modifica, in tutti i casi in cui il valore del selettore è diverso da 5 o
da 6, la variabile z è incrementata di uno.
― 36 ―
Programmazione in JavaScript
7 Funzioni
L’intestazione della funzione definisce la lista dei suoi parametri (chiamati an-
che parametri formali) racchiusi tra due parentesi tonde. La lista dei parametri
formali può essere vuota.
Come esempio, definiamo la funzione stampaSomma che stampa la somma
dei suoi parametri.
function stampaSomma (n, m) {
print(n + m);
}
Dopo aver dichiarato una funzione, è possibile usarla in un punto qualunque del
programma. Il punto in cui si usa una funzione è detto punto di chiamata o di
invocazione. Quando si invoca la funzione, si assegna a ciascun parametro for-
male il valore dell’espressione utilizzata nel punto di chiamata e poi si esegue il
blocco di comandi.
Le espressioni utilizzate nel punto di invocazione (chiamate anche parametri
attuali) sono valutate prima dell’esecuzione del blocco di comandi associato alla
funzione e il loro valore è associato ai parametri formali. Questo procedimento è
detto passaggio dei parametri. L’associazione tra i parametri formali e i valori
dei parametri attuali avviene con il sistema posizionale, ovvero ad ogni parame-
― 37 ―
Programmazione in JavaScript
tro formale è associato il valore del parametro attuale che occupa la medesima
posizione nella rispettiva lista. Il primo parametro attuale è dunque legato al
primo parametro formale, il secondo parametro attuale è legato al secondo pa-
rametro formale e così via.
<ComandoSemplice> ::= <Invocazione>
Gli esempi che seguono mostrano due invocazioni di funzione con un numero di
parametri attuali pari a quello dei parametri formali. L’effetto delle invocazioni
è, rispettivamente, stampare prima il valore 5 e poi il valore 15.
stampaSomma(10, -5);
stampaSomma(10, 5);
Ad esempio, definiamo una funzione che calcola e restituisce la somma dei suoi
parametri.
function calcolaSomma (x, y) {
return x + y;
}
― 38 ―
Programmazione in JavaScript
var x = 1;
var y = 2;
x = calcolaSomma(x, y);
print(calcolaSomma(x, y));
La leggibilità delle funzioni definita con questa tecnica è molto bassa e la loro
corretta indentazione è assolutamente necessaria.
5 L’intervallo [a, b) è formato dai numeri maggiori o uguali di a e minori di b. Per convenzione
si assume che a sia minore o uguale di b. Quando a è uguale a b l’intervallo è vuoto.
― 39 ―
Programmazione in JavaScript
Una versione più semplice del predicato bisestile non fa uso del comando condi-
zionale.
function bisestile (anno) {
return (anno % 400 == 0) ||
((anno % 4 == 0) && (anno % 100 != 0));
}
7.3 Visibilità
Quando si dichiara una variabile o una funzione è necessario tenere in debita
considerazione la loro visibilità. In pratica è necessario sapere quali variabili
sono definite nel programma e quali sono, invece, definite nel corpo della fun-
zione. Il modello adottato da JavaScript è complesso, essendo basato sull’esecu-
zione del programma ma anche sulla sua struttura sintattica. Ai fini di questo li-
bro, tuttavia, si ritiene sufficiente presentare una versione semplificata del mo-
dello, versione che permette di spiegare il comportamento degli esempi riporta-
ti.
Un ambiente è formato da un insieme di variabili e di funzioni. In un ambien-
te non possono esserci due variabili che hanno lo stesso identificatore, altrimen-
ti non sarebbe possibile sapere quale dei due dovrà essere utilizzato al momento
― 40 ―
Programmazione in JavaScript
della valutazione della variabile. Allo stesso modo non ci possono essere due
funzioni con lo stesso identificatore.
Un ambiente è modificato dalle dichiarazioni, che introducono nuove variabi-
li e nuove funzioni, e dai comandi, che modificano il valore delle variabili pre-
senti nell’ambiente. Ogni punto di un programma ha un ambiente, formato dalle
variabili definite in quel punto. Al contrario delle variabili, tutte le funzioni di-
chiarate in un programma fanno parte del suo ambiente.
Ogni variabile è visibile in una porzione ben definita del programma in cui
essa è dichiarata. In particolare, la variabile è visibile dal punto in cui è dichiara-
ta la prima volta (o assegnata la prima volta) fino al termine del programma.
Una variabile visibile solo in alcune porzioni del programma è detta variabile
locale. Una variabile la cui visibilità è l’intero programma è detta variabile glo-
bale. Una variabile globale può essere nascosta da una variabile locale che ha lo
stesso identificatore. Un variabile nascosta è definita, ma non è accessibile.
In JavaScript le uniche variabili locali sono quelle dichiarate nel corpo delle
funzioni. I parametri formali di una funzione sono trattati come variabili dichia-
rate al suo interno e quindi locali. Tutte le altre variabili sono globali.
var risultato = 0;
function calcolaSomma (x, y) {
var somma = 0;
somma = x + y;
return somma;
}
risultato = calcolaSomma(2, 4);
― 41 ―
Programmazione in JavaScript
Questo esempio mostra come sia possibile modificare il valore di una variabile
globale all’interno del corpo di una funzione. L’utilità di questa tecnica sarà ap-
prezzata nella seconda parte del libro, quando presenteremo problemi che ri-
chiedono soluzioni complesse.
7.6 Esercizi
1. L’equazione di secondo grado ax2 + bx + c = 0 ha due radici [Wikipedia,
alla voce Equazione di secondo grado]:
−b± b2−4 ac
x 1 /2=
2a
Definire in JavaScript una funzione che stampa le radici di un’equazione i
cui coefficienti sono a, b e c (con a diverso da zero).
La funzione ha tre parametri: a, b, c.
― 42 ―
Programmazione in JavaScript
― 43 ―
Programmazione in JavaScript
8 Comandi iterativi
Molti problemi richiedono un calcolo che deve essere ripetuto più volte per otte-
nere il risultato finale. In JavaScript la ripetizione di un calcolo si ottiene utiliz-
zando un comando iterativo.
― 45 ―
Programmazione in JavaScript
return s;
}
― 46 ―
Programmazione in JavaScript
8.3 Primalità
Un numero primo è un numero naturale maggiore di uno, divisibile solamente
per uno e per sé stesso [Wikipedia, alla voce Numero primo]. I primi dieci nu-
meri primi sono 2, 3, 5, 7, 11, 13, 17, 19, 23, 29.
Dato un numero naturale maggiore di uno è possibile verificare se è primo,
cioè se soddisfa la condizione di primalità, definendo in JavaScript il predicato
ePrimo basato su un comando di iterazione determinata.
function ePrimo (n) {
var c = 0;
for (var i = 2; i < n; i++) {
if (n % i == 0) {
c++;
}
}
return (c == 0);
}
L’espressione usata per aggiornare il valore della variabile booleana può essere
utilizzata come guardia di un comando iterativo indeterminato.
function ePrimo (n) {
var i = 2;
while ((i < n) && (n % i != 0)) {
i++;
}
return (i == n);
}
― 47 ―
Programmazione in JavaScript
8.5 Esercizi
1. Un anno è perfetto per una persona se è un multiplo della sua età in quel-
l’anno, assumendo come età massima cento anni. Ad esempio gli anni
― 48 ―
Programmazione in JavaScript
perfetti per chi è nato nel 1984 sono nove: 1985, 1986, 1988, 1992, 2000,
2015, 2016, 2046, 2048.
Definire in JavaScript una funzione che stampa gli anni perfetti relativi a
un anno di nascita.
La funzione ha un parametro: annoDiNascita.
Invocare la funzione con i seguenti valori: 1984, 1990, 1992, 2000, 2009.
2. In matematica, con reciproco di un numero x si indica il numero che mol-
tiplicato per x dà come risultato 1.
Definire in JavaScript una funzione che calcola e restituisce la somma dei
reciproci dei primi n numeri interi maggiori di zero.
La funzione ha un parametro: n.
Invocare la funzione con i seguenti valori: 1, 2, 4, 7.
3. Definire in JavaScript una funzione che stampa, se esistono, le radici in-
tere di un’equazione di secondo grado di coefficienti a, b, c comprese nel-
l’intervallo [l, u).
La funzione ha i seguenti parametri: a, b, c, l, u.
Invocare la funzione con i seguenti valori:
1, −2, −8, 1, 5
1, −2, −8, −5, 5
1, −2, −8, 5, 10.
― 49 ―
Programmazione in JavaScript
9 Array
Nel primo caso si ottiene un array vuoto. Nel secondo caso un array con un ele-
mento, 12. Nel terzo caso un array con quattro elementi, i caratteri f, u, n, ed e.
Ccreato un array, si può accedere ai suoi elementi per utilizzarne i valori. L’e-
spressione tra parentesi quadre deve avere un valore maggiore o uguale a zero.
<Espressione> ::= <Identificatore>[<Espressione>]
6 In JavaScript gli array possono essere omogenei (tutti i valori sono dello stesso tipo) o diso-
mogenei (i valori sono di più tipi). Per semplicità di presentazione assumiamo che gli array
siano omogenei.
― 51 ―
Programmazione in JavaScript
― 52 ―
Programmazione in JavaScript
― 53 ―
Programmazione in JavaScript
Per gli array associativi la proprietà length non è definita perché gli indici di
questi array non hanno un valore numerico. Per scandire tutti gli elementi di un
array associativo si usa una forma particolare di iterazione determinata in cui
l’indice di iterazione assume tutti i valori utilizzati per definire l’array7.
<For> ::= for (var <Identificatore> in <Espressione>)
<Blocco>
― 54 ―
Programmazione in JavaScript
― 55 ―
Programmazione in JavaScript
var a = 'ALFAbeto'
var b = a.toLowerCase(); // b vale 'alfabeto'
― 56 ―
Programmazione in JavaScript
}
}
― 57 ―
Programmazione in JavaScript
9.9 Filtro
Un filtro è uno strumento per la selezione (filtraggio) delle parti di un insieme
[Wikipedia, alla voce Filtro]. Un esempio di filtro, chiamato filtro passa banda,
seleziona tutti i valori che appartengono all’intervallo [lo, hi). I valori lo e hi
sono chiamati livello basso (low level) e livello alto (high level).
― 58 ―
Programmazione in JavaScript
La funzione filtro ha tre parametri (a, lo, hi) e restituisce un nuovo array for-
mato da tutti gli elementi di a i cui valori sono compresi tra lo e hi.
function filtro (a, lo, hi) {
var b = [];
for (var i = 0; i < a.length; i++) {
if ((a[i] >= lo) && (a[i] < hi)) {
b.push(a[i]);
}
}
return b;
}
9.11 Palindromo
Un palindromo è una sequenza di caratteri che, letta al contrario, rimane iden-
tica [Wikipedia, alla voce Palindromo]. Alcuni esempi sono il nome Ada, la voce
verbale aveva e la frase I topi non avevano nipoti.
Il predicato ePalindromo ha un parametro (s) e verifica se la stringa s è un
palindromo.
― 59 ―
Programmazione in JavaScript
Per evitare di scandire tutta la stringa quando non è un palindromo si usa un’i-
terazione indeterminata.
function ePalindromo (s) {
var i = 0;
while ((i < s.length) &&
(s[i] == s[s.length – 1 – i])) {
i++;
}
return (i == s.length);
}
― 60 ―
Programmazione in JavaScript
La stessa funzione può essere riscritta usando la forma alternativa del comando
iterativo indeterminato.
function ordina (a) {
do {
var scambi = 0;
for (var i = 1; i < a.length; i++) {
if (a[i - 1] > a[i]) {
var tmp = a[i – 1];
a[i - 1] = a[i];
a[i] = tmp;
scambi++;
}
}
} while (scambi > 0);
}
9.13 Esercizi
1. La media aritmetica semplice di n numeri è così definita [Wikipedia, alla
voce Media (statistica)]:
x 1 x 2... x n
m=
n
Ad esempio, la media aritmetica semplice di 3, 12, 24 è 13.
Definire in JavaScript una funzione che calcola e restituisce la media arit-
metica semplice degli elementi di un array a formato da n numeri.
― 61 ―
Programmazione in JavaScript
La funzione ha un parametro: a.
Invocare la funzione con i seguenti valori:
[3, 12, 24]
[5, 7, 9, -12, 0].
2. Dato un array a e un valore k, il numero di occorrenze di k in a è definito
come il numero degli elementi di a il cui valore è uguale a k.
Definire in JavaScript una funzione che calcola e restituisce il numero di
occorrenze del valore k nell’array a.
La funzione ha due parametri: a, k.
Invocare la funzione con i seguenti valori:
[10, −5, 34, 0], 1
[10, −5, 34, 0], −5.
3. Definire in JavaScript un predicato che verifica se ogni elemento di un
array di numeri (tranne il primo) è uguale alla somma degli elementi che
lo precedono.
La funzione ha un parametro: a.
Invocare la funzione con i seguenti valori:
[1, 2, 6, 10, 32]
[1, 1, 2, 4, 8].
4. Definire in JavaScript una funzione che ha come parametro un array a di
numeri e che restituisce un nuovo array che contiene le differenze tra gli
elementi adiacenti di a.
La funzione ha un parametro: a.
Invocare la funzione con i seguenti valori:
[1, 2, -6, 0, 3]
[2, 2, 3, 3, 4, 4].
― 62 ―
Programmazione in JavaScript
― 63 ―
Programmazione in JavaScript
― 64 ―
Programmazione in JavaScript
−b± b2−4 ac
x 1 /2=
2a
Definire in JavaScript una funzione che stampa le radici di un’equazione i
cui coefficienti sono a, b e c (con a diverso da zero).
La funzione ha tre parametri: a, b, c.
Invocare la funzione con i seguenti valori: 1, -5, 6; 1, 8, 16; 1, 2, 3.
― 65 ―
Programmazione in JavaScript
― 66 ―
Programmazione in JavaScript
case 2: n += 31;
}
return n;
}
print(numeroGiorno(1957, 4, 25));
print(numeroGiorno(2004, 11, 7));
print(numeroGiorno(2000, 12, 31));
print(numeroGiorno(2012, 2, 29));
― 67 ―
Programmazione in JavaScript
return "rettangolo";
} else {
return "scaleno";
}
}
print(triangolo(3, 3, 3));
print(triangolo(3, 4, 4));
print(triangolo(3, 4, 5));
print(triangolo(3, 4, 6));
― 68 ―
Programmazione in JavaScript
perfetti per chi è nato nel 1984 sono nove: 1985, 1986, 1988, 1992, 2000,
2015, 2016, 2046, 2048.
Definire in JavaScript una funzione che stampa gli anni perfetti relativi a
un anno di nascita.
La funzione ha un parametro: annoDiNascita.
Invocare la funzione con i seguenti valori: 1984, 1990, 1992, 2000, 2009.
function anniPerfetti (annoDiNascita) {
const ETA_MASSIMA = 100;
for (var i = 1; i <= ETA_MASSIMA; i++) {
if (((annoDiNascita + i) % i) == 0) {
print(annoDiNascita + i);
}
}
}
anniPerfetti(1984);
anniPerfetti(1990);
anniPerfetti(1992);
anniPerfetti(2000);
anniPerfetti(2009);
― 69 ―
Programmazione in JavaScript
― 70 ―
Programmazione in JavaScript
― 71 ―
Programmazione in JavaScript
[1, 2, -6, 0, 3]
[2, 2, 3, 3, 4, 4].
function differenze (a) {
var b = [];
for (var i = 0; i < a.length - 1; i++) {
b.push(a[i] - a[i + 1]);
}
return b;
}
print(differenze([1, 2, -6, 0, 3]));
print(differenze([2, 2, 3, 3, 4, 4]));
― 72 ―
Parte seconda
Programmazione web
Programmazione in JavaScript
11 Ricorsione
11.1 Fattoriale
Il fattoriale di n (indicato con n!) è il prodotto dei primi n numeri interi positivi
minori o uguali di quel numero [Wikipedia, alla voce Fattoriale]. 0! vale 1, 1!
vale 1, 2! vale 2, 3! vale 6, 4! vale 24 e così via.
La funzione fattorialeR ha un parametro (n) e restituisce il fattoriale di n. La
funzione è definita in maniera ricorsiva, sfruttando la definizione matematica
del fattoriale.
function fattorialeR (n) {
if ((n == 0) || (n == 1)) {
return 1;
} else {
return n * fattorialeR(n – 1);
}
}
Il calcolo del fattoriale può essere effettuato anche con una funzione iterativa,
che non fa uso della ricorsione. Anche in questo caso la funzione ha un parame-
tro (n) e restituisce il fattoriale di n.
function fattorialeI (n) {
var r = 1;
for (var i = 1; i <= n; i++) {
r *= i;
}
return r;
}
― 75 ―
Programmazione in JavaScript
― 76 ―
Programmazione in JavaScript
return n;
}
var f1 = 0;
var f2 = 1;
var f;
for (var i = 2; i <= n; i++) {
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
8 Per semplicità di presentazione, l’operatore unario successore è stato sostituito dagli operato-
ri unari di incremento (+1) e decremento (−1) unitario.
― 77 ―
Programmazione in JavaScript
Le operazioni divisione (indicata con D) e resto (indicata con R) sono così defi-
nite per induzione:
― 78 ―
Programmazione in JavaScript
• x D y = 0 se x < y
• x D y = 1 se x = y
• x D y = (x S y + y) D y = (x S y) D y + y D y = ((x S y) D y) +1 se y < x
Da notare che x D 0 non è definito.
• x R y = x se x < y
• x R y = 0 se x = y
• x R y = (x S y) R y se y < x
Anche in questo caso x R 0 non è definito.
11.4 Esercizi
1. Definire in Javascript una funzione ricorsiva che calcola e restituisce la
differenza tra due interi maggiori o uguali a zero.
La funzione ha due parametri: x, y.
Invocare la funzione con le seguenti coppie di valori:
5, 0
3, 3
9, 2.
2. Definire in JavaScript una funzione ricorsiva che calcola e restituisce la
relazione di minore tra due interi maggiori o uguali a zero.
La funzione ha due parametri: x, y.
Invocare la funzione con le seguenti coppie di valori:
0, 0
0, 4
3, 0
2, 6
9, 2.
3. Definire in JavaScript una funzione ricorsiva che calcola e restituisce la
divisione tra due interi maggiori o uguali a zero.
La funzione ha due parametri: x, y.
Invocare la funzione con le seguenti coppie di valori:
0, 4
3, 3
9, 2.
― 79 ―
Programmazione in JavaScript
― 80 ―
Programmazione in JavaScript
12 Alberi
Nella teoria dei grafi un albero è un grafo non orientato nel quale due vertici
qualsiasi sono connessi da uno e un solo cammino (grafo non orientato connes-
so e privo di cicli) [Wikipedia, alla voce Albero (grafo)].
― 81 ―
Programmazione in JavaScript
Un’altra differenza con gli alberi binari consiste nel fatto che per un albero n-a-
rio sono definite solo due visite: anticipata e differita. La visita simmetrica, in-
fatti, non avrebbe senso. La visita anticipata di un albero n-ario si comporta
analogamente a quella di un albero binario. La visita anticipata dell’albero n-a-
rio mostrato nella figura precedente costruisce la sequenza 1 2 5 6 3 7 4 8 9. An-
che la visita differita di un albero n-ario si comporta analogamente a quella di
un albero binario. La visita differita dell’albero n-ario mostrato nella figura pre-
cedente costruisce la sequenza 5 6 2 7 3 8 9 4 1.
Le definizioni di altezza e di frontiera di un albero n-ario sono equivalente a
quelle di un albero binario. L’altezza dell’albero n-ario mostrato nella figura pre-
cedente è 3, la sua frontiera è la sequenza 5 6 7 8 9.
Un albero n-ario con attributi è un albero n-ario esteso associando uno o più
attributi ad ogni nodo. Ogni attributo ha un nome e un valore associato.
― 82 ―
Programmazione in JavaScript
13.1 HTML
HTML (HyperText Mark-up Language) è un linguaggio per la descrizione
strutturale di documenti, usato prevalentemente per definire i siti web. La sua
presentazione è volutamente molto ridotta: il lettore interessato ha a disposizio-
ne un’ampia letteratura su HTML, utile per approfondirne la conoscenza.
HTML non è un linguaggio di programmazione, in quanto non descrive algo-
ritmi, ma si basa sull’uso di etichette o marche (tag) per la marcatura di porzio-
ni di testo di un documento HTML10. Una marca è un elemento inserito nel testo
di un documento per indicarne la struttura. Una marca è formata da una stringa
racchiusa tra parentesi angolari (“<” e “>”). Subito dopo la parentesi angolare
aperta si trova il nome della marca, seguito da eventuali attributi, che ne specifi-
cano le caratteristiche.
Poiché ogni marca determina la formattazione di una parte di un documento
è necessario che questa parte sia indicata da una marca di apertura, che segna
l’inizio della porzione di testo da formattare, e da una marca di chiusura, che ne
segna la fine. La marca di chiusura è formata dal nome della marca, preceduto
dal simbolo “/”. Nel testo racchiuso dalle due marche (ovvero compreso tra
quella di apertura e quella di chiusura) possono comparire altre marche il cui ef-
fetto si aggiunge a quello delle marche più esterne.
Ogni marca ha un diverso insieme di possibili attributi, dipendente dalla fun-
zione della marca stessa. Alcune marche hanno uno o più attributi obbligatori,
senza i quali non possono svolgere la loro funzione. La sintassi della definizione
di un attributo è: NomeAttributo="valore". Il valore dell’attributo è racchiuso
tra doppi apici.
Un documento è formato da un testo racchiuso dalla marca html e si divide in
due parti: intestazione e corpo. L’intestazione, racchiusa dalla marca head, ri-
10Nel seguito, per semplicità, i documenti HTML saranno chiamati documenti quando il conte-
sto non crea ambiguità.
― 83 ―
Programmazione in JavaScript
13.2 Script
Un programma JavaScript può essere associato a un documento HTML tramite
la marca script, che può comparire sia nell’intestazione che nel corpo del docu-
mento. In questo libro la marca script è sempre usato solo nell’intestazione. Il
programma JavaScript ha la funzione di rendere interattivo il comportamento
della pagina web visualizzata dal browser.
Un programma JavaScript può essere associato a un documento in due modi:
• inserendolo direttamente tra la marca script di apertura e di chiusura;
• scrivendolo in un file separato che ha, per convenzione, estensione “.js” e
indicando il nome del file come valore dell’attributo src.
Come mostrato nell’esempio che segue, in questo libro sarà sempre utilizzata la
seconda tecnica. Da notare che la marca script è chiusa esplicitamente con una
marca di chiusura. A differenza di altre marche, infatti, per la marca script l’uso
della marca esplicita di chiusura è rigorosamente obbligatorio.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
― 84 ―
Programmazione in JavaScript
<script src="nomeFile.js"></script>
<title>Titolo del documento</title>
</head>
<body>
Contenuto del documento
</body>
</html>
13.3 DOM
DOM (Document Object Model, modello a oggetti del documento), è un’inter-
faccia programmatica per la rappresentazione di documenti. DOM è uno stan-
dard ufficiale del W3C (World Wide Web Consortium) utilizzato per la pro-
grammazione di applicazioni web basate su documenti in formato HTML [Wi-
kipedia, alla voce Document Object Model].
Secondo il DOM, un documento è rappresentato da un albero che può essere
visitato, modificato e trasformato mediante strumenti specifici o programmi
scritti a tal scopo. Un albero DOM11 è un albero n-ario con attributi. I nodi del-
l’albero sono di varia natura:
• nodi documento (document nodes)
• nodi elemento (element nodes)
• nodi testo (text nodes)
• nodi attributo (attribute nodes).
La struttura principale di un albero è formata da nodi elemento che possono
avere un numero variabile di figli. La radice è sempre un nodo documento e i
nodi testo possono essere solo foglie di un albero. I nodi attributo definiscono
gli attributi dei nodi elemento. La radice dell’albero associato a un documento
corrisponde all’oggetto document.
Ogni nodo ha le seguenti proprietà, oltre ad altre descritte nel seguito:
• nodeType
• nodeName
• nodeValue
• childNodes
11 Nel seguito, per semplicità, gli alberi DOM saranno chiamati alberi quando il contesto non
crea ambiguità.
― 85 ―
Programmazione in JavaScript
• attributes.
Il tipo di un nodo, definito dalla proprietà nodeType, può avere i seguenti valori
• nodo elemento: 1;
• nodo attributo: 2;
• nodo testo: 3;
• nodo documento: 9.
Il nome di un nodo, definito dalla proprietà nodeName, ha un significato che di-
pende dal tipo del nodo:
• nodo elemento: marca HTML dell’elemento;
• nodo attributo: nome dell’attributo;
• nodo testo: valore predefinito #text;
• nodo documento: valore predefinito #document.
Il valore di un nodo, definito dalla proprietà nodeValue, ha un significato che
dipende dal tipo del nodo:
• nodo elemento: null;
• nodo attributo: valore dell’attributo;
• nodo testo: stringa associata al nodo;
• nodo documento: null.
Il valore della proprietà childNodes è un array che contiene i figli di un nodo
elemento o di un nodo documento, null negli altri casi. Se un nodo non ha figli,
il valore della proprietà è un array vuoto.
Il valore della proprietà attributes è un array che contiene gli attributi di un
nodo elemento o di un nodo documento. Se un nodo non ha attributi, il valore
della proprietà attributes è null.
13.4 Navigazione
Il modello DOM prevede diverse tecniche per visitare gli alberi e per muoversi
(navigare) tra i suoi nodi. Queste tecniche si basano sul valore della proprietà
childNodes e di altre proprietà che, quando sono definite (cioè quando il loro
valore non è null), collegano un nodo ai suoi nodi vicini:
• firstChild: primo figlio del nodo;
• lastChild: ultimo figlio del nodo;
• firstSibling: primo fratello del nodo;
― 86 ―
Programmazione in JavaScript
La visita può essere effettuata anche in ordine inverso, partendo dall’ultimo fi-
glio del nodo e arrivando al primo. In questo caso si usano le proprietà lastSi-
bling e previousSibling.
var nodoFiglio = nodo.lastChild;
while (nodoFiglio != null) {
nodoFiglio = nodoFiglio.previousSibling;
}
Per visitare un albero partendo da un nodo fino ad arrivare alla sua radice si usa
la proprietà parentNode. Nell’esempio che segue la visita parte dalla radice del
nodo, procede scegliendo il primo figlio e poi torna indietro fino a ritornare alla
radice.
while (nodo.firstChild != null) {
nodo = nodo.firstChild;
}
while (nodo.parentNode != null) {
nodo = nodo.parentNode;
}
13.5 Ricerca
La ricerca di un nodo si effettua utilizzando i seguenti metodi:
• getElementsByTagName
― 87 ―
Programmazione in JavaScript
• getElementsByClassName
• getElementById.
Il metodo getElementsByTagName ha un unico argomento, una stringa t e può
essere invocato su un nodo elemento o su un nodo documento. Il metodo effet-
tua una visita anticipata dell’albero radicato nel nodo su cui è stato invocato e
raccoglie in una collezione tutti e soli gli elementi con marca t, ovvero tutti e soli
i nodi la cui proprietà nodeName ha un valore uguale a t. Alla fine della visita il
metodo restituisce la collezione (possibilmente vuota).
Nell’esempio che segue la ricerca parte dalla radice dell’albero. L’iterazione
determinata12 scandisce la collezione così ottenuta.
var collezione = document.getElementsByTagName("script");
var nomiFile = [];
for (var i = 0; i < collezione.length; i++) {
nomiFile.push(collezione[i].getAttribute("src"));
}
13.6 Attributi
Gli attributi di un nodo sono gestiti dai seguenti metodi:
• getAttribute
• setAttribute
• removeAttribute.
Il metodo getAttribute ha un unico argomento, una stringa a. Può essere invo-
cato su un nodo elemento o un nodo documento e restituisce il valore dell’attri -
buto il cui nome è a, undefined altrimenti.
var valore = nodo.getAttribute("a");
― 88 ―
Programmazione in JavaScript
nodo.removeAttribute("a");
― 89 ―
Programmazione in JavaScript
Un nodo, e tutto l’albero di cui tale nodo è la radice, può essere rimosso usando
i seguenti metodi:
• removeChild
• replaceChild.
Il metodo removeChild ha un parametro, il nodo che si intende rimuovere. Il
metodo deve essere invocato sul padre del nodo che si intende eliminare.
nodo.removeChild(nodo.firstChild);
― 90 ―
Programmazione in JavaScript
Pur non essendo definita nello standard W3C questa proprietà è, di fatto, gestita
dalla maggior parte dei browser14.
13.8 Esercizi
1. Definire una funzione JavaScript che visita un albero DOM e che restitui-
sce il numero dei suoi nodi di tipo testo. Invocare la funzione usando
come argomento la radice dell’albero DOM corrispondente alla pagina
web dell’ambiente EasyJS.
14 In questo libro la proprietà innerHTML non è utilizzata negli esempi e negli esercizi.
― 91 ―
Programmazione in JavaScript
14 Interattività
Una delle caratteristiche più interessanti delle pagine web è la loro interattività,
cioè la capacità di reagire ad azioni effettuate dall’utente. Questo capitolo pre-
senta i concetti e le tecniche di base necessarie per rendere interattiva una pagi-
na web.
14.1 Eventi
Un evento è qualcosa che accade in seguito a un’azione di un utente che sta vi-
sualizzando un documento HTML. Gli eventi sono raggruppati in base ai se-
guenti aspetti che ne causano la generazione:
• tasti del mouse
• movimenti del mouse
• trascinamento del mouse
• tastiera
• modifiche del documento
• cambiamento del focus
• caricamento degli oggetti
• movimenti delle finestre
• pulsanti speciali.
Nel seguito è presentata una parte degli eventi, quelli più comuni. Il lettore inte-
ressato può trovare l’elenco completo degli eventi consultando la relativa lette-
ratura.
Gli eventi generati dai tasti del mouse sono:
• click: generato quando si clicca su un oggetto;
• dblClick: generato con un doppio click;
• mouseDown: generato quando si schiaccia il tasto sinistro del mouse;
• mouseUp: generato quando si alza il tasto sinistro del mouse precedente-
mente schiacciato.
― 93 ―
Programmazione in JavaScript
Gli eventi mouseDown e mouseUp sono generati dai due movimenti del tasto si-
nistro del mouse, il primo quando si preme il tasto e il secondo quando lo si sol-
leva dopo il click. Il doppio click è un evento che ingloba gli altri e, per la preci -
sione, genera in successione mouseDown, mouseUp, click.
Gli eventi generati dai movimenti del mouse sono:
• mouseOver: generato quando il mouse si muove su un elemento;
• mouseOut: generato quando il mouse si sposta fuori da un elemento;
Gli eventi mouseOver e mouseOut sono complementari: il primo è generato nel
momento in cui il puntatore è posto nell’area dell’oggetto e il secondo quando
ne esce.
Gli eventi generati dalla tastiera sono:
• keyPress: generato quando si preme e si rilascia un tasto o anche quando
lo si tiene premuto;
• keyDown: generato quando si preme un tasto;
• keyUp: generato quando un tasto, che era stato premuto, viene rilasciato.
Gli eventi legati al caricamento delle pagine sono:
• load: generato quando si carica una pagina;
• unload: è l’opposto del precedente ed è generato quando si lascia una fi-
nestra per caricarne un’altra o per ricaricare la stessa (col tasto refresh).
15 Ogni browser ha la sua console in cui sono visualizzati gli errori dinamici. In Firefox questa
console (chiamata Console web) può essere aperta pigiando CTRL+Maiusc+K oppure con la
sequenza di menu Strumenti, Sviluppo web, Console web.
― 94 ―
Programmazione in JavaScript
― 95 ―
Programmazione in JavaScript
window.onload = gestoreLoad;
― 96 ―
Programmazione in JavaScript
― 97 ―
Programmazione in JavaScript
― 98 ―
Programmazione in JavaScript
― 99 ―
Programmazione in JavaScript
nodoConverti.onclick = gestoreConverti;
} catch ( e ) {
alert("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
― 100 ―
Programmazione in JavaScript
― 101 ―
Programmazione in JavaScript
function gestoreImposta () {
try {
var valuta = nodoValuta.value;
if (valuta.length != 3) {
alert("la valuta non \u00E8 valida");
return;
}
if (nodoFattore.value == "") {
alert("il fattore di conversione \u00E8 vuoto");
return;
}
var fattore = Number(nodoFattore.value);
if (isNaN(fattore)) {
alert(nodoFattore.value + " non \u00E8 un numero");
return;
}
if (fattore <= 0) {
alert("il fattore di conversione non \u00E8 valido");
return;
}
valutaCorrente = valuta;
fattoreCorrente = fattore;
nodoImporto.value = "";
nodoRisultato.value = "";
} catch ( e ) {
alert("gestoreImposta " + e);
}
}
― 102 ―
Programmazione in JavaScript
return;
}
nodoRisultato.value = valutaCorrente + " " +
importo * fattoreCorrente;
} catch ( e ) {
alert("gestoreConverti " + e);
}
}
14.7 Dialogo
L’interazione tra l’utente e la pagina segue un dialogo, le cui regole stabiliscono
la sequenza corretta di azioni che l’utente deve effettuare per ottenere i risultati
desiderati. Nel caso del convertitore interattivo, l’unica regola che l’utente deve
seguire prevede che prima di convertire un importo è necessario impostare la
valuta e il fattore di conversione. Da quel momento in avanti l’utente può con-
vertire uno o più importi, cambiare la valuta e il fattore di conversione e conti-
nuare a convertire altri importi. In pratica, l’utente non può effettuare come pri-
ma azione dopo il caricamento della pagina la conversione dell’importo.
Per gestire questo semplice dialogo è sufficiente aggiungere un controllo sul
valore delle variabili globali valutaCorrente e fattoreCorrente nella funzione ge-
storeConverti. Se il valore delle due variabili è undefined la conversione non può
essere effettuata perché l’utente non ha impostato la valuta e il fattore di conver-
sione.
function gestoreConverti () {
try {
if ((valutaCorrente == undefined) &&
(fattoreCorrente == undefined)) {
alert("valuta e fattore indefiniti");
return;
}
if (nodoImporto.value == "") {
alert("l'importo \u00E8 vuoto");
return;
}
var importo = Number(nodoImporto.value);
if (isNaN(importo)) {
alert(nodoImporto.value + " non \u00E8 un numero");
return;
}
if (importo <= 0) {
alert("l'importo non \u00E8 valido");
return;
}
― 103 ―
Programmazione in JavaScript
― 104 ―
Programmazione in JavaScript
Come per gli altri elementi interattivi già inseriti in HTML, anche i nodi associa-
ti a messaggioImposta e messaggioConverti devono essere definiti e inizializza-
ti in inizializza. In vista della visualizzazione dei messaggi di errore, è necessa-
rio creare un nodo testo e appenderlo come primo figlio dell’elemento messag-
gioImposta. Analogamente va fatto per l’elemento messaggioConverti.
La funzione gestoreLoad è così modificata.
var nodoValuta;
var nodoFattore;
var nodoImposta;
var nodoImporto;
var nodoConverti;
var nodoRisultato;
var nodoMessaggioImposta;
var nodoMessaggioConverti;
// stato del convertitore
var valutaCorrente;
var fattoreCorrente;
function gestoreLoad() {
try {
nodoValuta = document.getElementById("valuta");
nodoFattore = document.getElementById("fattore");
nodoImposta = document.getElementById("imposta");
nodoImporto = document.getElementById("importo");
nodoConverti = document.getElementById("converti");
nodoRisultato = document.getElementById("risultato");
nodoMessaggioImposta = document.getElementById("messaggioImposta");
nodoMessaggioConverti = document.getElementById("messaggioConverti");
nodoValuta.value = "";
nodoFattore.value = "";
nodoImporto.value = "";
nodoRisultato.value = "";
nodoImposta.onclick = gestoreImposta;
nodoConverti.onclick = gestoreConverti;
― 105 ―
Programmazione in JavaScript
― 106 ―
Programmazione in JavaScript
}
valutaCorrente = valuta;
fattoreCorrente = fattore;
nodoImporto.value = "";
nodoRisultato.value = "";
} catch ( e ) {
alert("gestoreImposta " + e);
}
}
14.9 Cookie
Un cookie è un’informazione trasmessa da un sito web e memorizzata dal
browser mentre l’utente sta visitando una pagina. Ogni volta che l’utente carica
la pagina relativa al sito, il browser invia il cookie al server del sito per informar-
lo dell’attività svolta in precedenza dall’utente. In questo modo, il server tiene
traccia del comportamento e delle abitudini dell’utente, raccogliendo informa-
zioni utili che hanno un rilevante valore commerciale [Wikipedia, alla voce
HTTP cookie].
Ci sono numerose categorie di cookie, ognuna delle quali svolge un ruolo nel-
la navigazione su Internet. Per semplicità, il libro presenta solo i cosiddetti coo-
kie di sessione, ovvero di quei cookie temporanei che vivono solo durante una
sessione di connessione a una pagina web e che sono cancellati quando l’utente
chiude il browser.
Un cookie di sessione ha la forma nome = valore, dove nome è un identifica-
tore che indica il nome del cookie e valore è una stringa che ne rappresenta il
― 107 ―
Programmazione in JavaScript
16 UTC (un acronimo che sta per Coordinated Universal Time) è il fuso orario di riferimento da
cui sono calcolati tutti gli altri fusi orari del mondo. Deriva dal tempo medio di Greenwich (in
inglese Greenwich Mean Time, GMT), con il quale coincide a meno di approssimazioni
infinitesimali [Wikipedia, alla voce UTC].
17 L’oggetto data memorizza il numero di millisecondi trascorsi dalle ore 00:00:00 del 1 gen-
naio 1970. Per convenzione, questa è la data di inizio del tempo.
― 108 ―
Programmazione in JavaScript
― 109 ―
Programmazione in JavaScript
La seconda modifica è relativa alla lettura dei cookie e usare i loro valori per ini-
zializzare le variabili globali valutaCorrente e fattoreCorrente, oltre che al valo-
re dei campi valuta e fattore. Tuttavia, poiché i cookie potrebbero non essere
stati creati in precedenza, è necessario verificare che il valore restituito dalla
funzione estraiCookie non sia undefined. La modifica apportata alla funzione
gestoreLoad è la seguente.
var valuta = estraiCookie("valuta", document.cookie);
if (valuta != undefined) {
nodoValuta.value = valuta;
valutaCorrente = valuta;
}
var fattore = estraiCookie("fattore", document.cookie);
if (fattore != undefined) {
nodoFattore.value = fattore;
fattoreCorrente = fattore;
}
― 110 ―
Programmazione in JavaScript
Per evitare che l’utente debba inserire il nome della valuta in un campo di testo
si utilizza un menu di selezione in cui compaiono i nomi delle valute conosciute
dal convertitore: LIT (Lira italiana), USD (Dollaro statunitense), YEN (Yen giap-
ponese). La modifica del codice HTML riguarda solo il campo Valuta.
<select id="valuta">
<option>LIT</option>
<option>USD</option>
<option>YEN</option>
</select> Valuta
― 111 ―
Programmazione in JavaScript
― 112 ―
Programmazione in JavaScript
Togliere la lista delle valute dal codice HTML significa avere un campo select
in cui non compaiono staticamente le relative opzioni. Le opzioni dovranno es-
sere create dinamicamente al momento del caricamento della pagina da parte
del programma JavaScript. Per fare ciò è necessario definire una funzione chia-
mata creaSelect che modifica l’albero DOM della pagina, aggiungendo tanti ele-
menti option quanti sono gli elementi di un array associativo. La funzione sarà
invocata nel corpo di gestoreLoad con i seguenti argomenti: nodoValuta e valu-
teFattori.
La funzione creaSelect è così definita.
function creaSelect (nodoSelect, opzioni) {
for (var opzione in opzioni) {
var nodoOpzione = document.createElement("option");
var nodoTesto = document.createTextNode(opzione);
nodoOpzione.appendChild(nodoTesto);
nodoSelect.appendChild(nodoOpzione);
}
}
14.12 Esercizi
1. Definire una pagina web interattiva che realizza una sveglia. La pagina
permette di impostare l’orario corrente, l’allarme e di far avanzare l’ora
corrente. L’inserimento dell’orario corrente avviene mediante un pulsan-
te e due campi di testo che contengono l’ora e i minuti. L’inserimento del-
l’orario dell’allarme avviene mediante un pulsante e due campi di testo
che contengono l’ora e i minuti. L’ora corrente avanza di un minuto me-
diante un pulsante. La pagina visualizza in due campi di testo di sola let-
tura l’orario corrente e l’orario della sveglia. Quando l’orario corrente di-
venta uguale a quello dell’allarme la pagina visualizza un apposito mes-
saggio.
2. Definire una pagina web interattiva che realizza un distributore automa-
tico di caffè. La pagina permette di aggiungere al distributore un numero
arbitrario di capsule, di chiedere l’erogazione di un numero arbitrario di
caffè (tenendo conto delle capsule disponibili) e di addebitarle a una per-
sona identificata da un codice univoco, di visualizzare il numero di caffè
addebitati finora a una persona mediante il suo codice univoco. Al mo-
mento della sua attivazione la pagina non ha conoscenza dei codici delle
― 113 ―
Programmazione in JavaScript
― 114 ―
Programmazione in JavaScript
Una pagina web visualizza informazioni di varia natura: testuale, grafica, audio-
visiva. La gestione di queste informazioni, chiamate anche contenuti, diventa
sempre più complessa all’aumentare della loro dimensione e varietà. Per affron-
tare questo problema è necessario ricorrere a tecniche di rappresentazione e di
trattamento dei contenuti.
15.1 Il ricettario
In molti casi, i contenuti gestiti da una pagina non possono essere rappresentati
da un unico array, soluzione adottata per il convertitore di valuta. Una situazio-
ne molto frequente è quella in cui i contenuti sono formati da una lista di entità,
ognuna delle quali è caratterizzata da proprietà comuni. La rappresentazione di
queste entità si può basare su un array in cui ogni elemento è a sua volta un ar-
ray associativo. Questo approccio, molto generale, può essere seguito in moltis-
sime situazioni.
Si consideri, ad esempio, una pagina interattiva che visualizza un ricettario
formato da alcune ricette, permettendo all’utente di effettuare alcune semplici
attività di ricerca. Il ricettario può essere rappresentato da un array di elementi,
uno per ogni ricetta. A sua volta, una ricetta può essere rappresentata mediante
un array associativo di quattro elementi: categoria (che può assumere i valori
antipasto, primo, secondo, contorno, frutta o dolce), nome, difficoltà (bassa,
media o alta) e preparazione (il numero di minuti previsto).
Il contenuto specifico di una pagina potrebbe essere costituito da due ricette,
rappresentate dal seguente array, dove ricettario è una variabile globale.
var ricettario = [
{
categoria : "Primo",
nome : "Gnocchi",
difficoltà : "media",
preparazione : 30
},
{
categoria : "Secondo",
nome : "Cotoletta",
― 115 ―
Programmazione in JavaScript
difficoltà : "bassa",
preparazione : 15
}
]
― 116 ―
Programmazione in JavaScript
function calcolaListaDescrizioni(ricette) {
var listaDescrizioni = [];
for (var i = 0; i < ricette.length; i++) {
var ricetta = ricette[i];
var s = "(" + ricetta.categoria + ") " +
ricetta.nome + ", difficoltà " +
ricetta.difficoltà + ", " +
ricetta.preparazione + " minuti di preparazione";
listaDescrizioni.push(s);
}
return listaDescrizioni;
}
― 117 ―
Programmazione in JavaScript
<head>
<meta charset="UTF-8">
<script src="Ricettario.js"></script>
<title>Ricettario</title>
</head>
<body>
<b>Le mie ricette</b>
<br />
<input type="text" id="chiave"/>
<input type="button" value="Cerca" id="cerca"/>
<br />
<br />
<div id="risultato"></div>
</body>
</html>
― 118 ―
Programmazione in JavaScript
function gestoreCerca () {
try {
var chiave = nodoChiave.value;
var ricette = ricercaEsatta(chiave);
var listaDescrizioni;
if (ricette.length != 0) {
listaDescrizioni = calcolaListaDescrizioni(ricette);
} else {
listaDescrizioni = ["Nessuna ricetta trovata"];
}
creaLista(nodoRisultato, listaDescrizioni);
} catch ( e ) {
alert("gestoreCerca " + e);
}
}
― 119 ―
Programmazione in JavaScript
}
}
― 120 ―
Programmazione in JavaScript
― 121 ―
Programmazione in JavaScript
if (ricetta.categoria == categoria) {
ricette.push(ricetta);
}
}
return ricette;
}
― 122 ―
Programmazione in JavaScript
function gestoreLoad () {
try {
nodoCategorie = document.getElementById("categorie");
nodoCerca = document.getElementById("cerca");
nodoRisultato = document.getElementById("risultato");
var categorie = calcolaCategorie();
creaSelect(nodoCategorie, categorie);
nodoCerca.onclick = gestoreCerca;
} catch ( e ) {
alert("gestoreLoad " + e);
}
}
― 123 ―
Programmazione in JavaScript
― 124 ―
Programmazione in JavaScript
La ricerca usa il valore delle due chiavi, selezionate dai due menu creati in fase
di inizializzazione. Dopo aver estratto questi valori il gestore del pulsante cerca
(gestoreCerca) invoca il metodo ricercaMultipla ottenendo un array, possibil-
mente vuoto, che contene le ricette che soddisfano la ricerca a chiave multipla.
function gestoreCerca () {
try {
var categoria = nodoCategorie.value;
var preparazione = Number(nodoPreparazioni.value);
var ricette = ricercaMultipla(categoria, preparazione);
var listaDescrizioni;
if (ricette.length != 0) {
listaDescrizioni = calcolaListaDescrizioni(ricette);
} else {
listaDescrizioni = ["Nessuna ricetta trovata"];
}
creaLista(nodoRisultato, listaDescrizioni);
} catch ( e ) {
alert ("gestoreCerca " + e);
}
}
― 125 ―
Programmazione in JavaScript
return ricette;
}
― 126 ―
Programmazione in JavaScript
― 127 ―
Programmazione in JavaScript
}
}
― 128 ―
Programmazione in JavaScript
15.8 Esercizi
1. Definire una pagina web che visualizza una lista di film, a ognuno dei
quali è associata una lista di cinema presso i quali il film è in programma-
zione.
2. Definire una pagina web interattiva che visualizza una lista di film, a
ognuno dei quali è associata una lista di cinema presso i quali il film è in
programmazione. La pagina contiene un menu di selezione, generato di-
namicamente, contenente tutti e soli i cinema presenti nella programma-
zione, un pulsante che visualizza la lista dei film in programmazione
presso il cinema selezionato.
― 129 ―
Programmazione in JavaScript
― 131 ―
Programmazione in JavaScript
Gli elementi interattivi sono i pulsanti Avanti e Indietro per il passaggio alla
foto successiva e a quella precedente, e il pulsante StartStop per l’attivazione e
la disattivazione della modalità automatica di visualizzazione. La foto è visualiz-
zata nell’elemento con marca img, il cui identificatore è foto.
Il codice JavaScript è strutturato in maniera standard. La funzione gestore-
Load gestisce l’evento load, la funzione gestoreClickAvanti gestisce l’evento
click sul pulsante Avanti, la funzione gestoreClickIndietro gestisce l’evento click
sul pulsante Indietro e la funzione gestoreClickStartStop gestisce l’evento click
sul pulsante StartStop.
Le foto della galleria sono contenute nella cartella del file HTML. I loro nomi
sono memorizzati nell’array galleria. La variabile globale indiceFoto contiene
l’indice della foto correntemente visualizzata. La variabile globale automatico
vale true se la modalità di visualizzazione automatica è stata scelta dall’utente,
false altrimenti. La variabile numeroFoto indica il numero delle foto della galle-
ria e la costante RITARDO il numero di millisecondi che devono trascorrere per
passare automaticamente da una foto all’altra. Infine, le variabili globali nodoA-
vanti, nodoIndietro, nodoStartStop e nodoFoto fanno riferimento ai relativi
nodi dell’albero DOM.
Il codice della funzione gestoreLoad, preceduto dalle dichiarazioni delle co-
stanti e delle variabili globali e seguito dalla registrazione dell’evento load è mo-
strato nel seguito. Da notare l’inizializzazione della proprietà value di nodo-
StartStop, fatta in modo che sia l’utente a scegliere esplicitamente la modalità
automatica di visualizzazione.
const RITARDO = 2000;
var indiceFoto;
var numeroFoto;
var automatico;
var nodoAvanti;
var nodoIndietro;
var nodoStartStop;
var nodoFoto;
function gestoreLoad () {
try {
nodoAvanti = document.getElementById("avanti");
nodoIndietro = document.getElementById("indietro");
nodoStartStop = document.getElementById("startStop");
nodoFoto = document.getElementById("foto");
nodoAvanti.onclick = gestoreClickAvanti;
nodoIndietro.onclick = gestoreClickIndietro;
nodoStartStop.onclick = gestoreClickStartStop;
nodoStartStop.value = "Start";
numeroFoto = galleria.length;
― 132 ―
Programmazione in JavaScript
automatico = false;
indiceFoto = 0;
cambiaFoto(0);
} catch ( e ) {
alert("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
var galleria = [
"foto0.png",
"foto1.png",
"foto2.png",
"foto3.png",
"foto4.png",
"foto5.png",
"foto6.png",
"foto7.png"
]
Il codice dei gestori dell’evento click sui pulsanti Avanti e Indietro usa la funzio-
ne cambiaFoto per passare da una foto all’altra. Il parametro di questa funzione
è un intero che indica di quanto deve cambiare l’indice della foto visualizzata.
function gestoreClickAvanti () {
try {
if (!automatico) {
cambiaFoto(+1);
}
} catch ( e ) {
alert("gestoreClickAvanti " + e);
}
}
function gestoreClickIndietro () {
try {
if (1automatico) {
cambiaFoto(-1);
}
} catch ( e ) {
alert("gestoreClickIndietro " + e);
}
}
function cambiaFoto (x) {
indiceFoto += x;
if (indiceFoto == numeroFoto) {
indiceFoto = 0;
}
― 133 ―
Programmazione in JavaScript
if (indiceFoto < 0) {
indiceFoto = numeroFoto – 1;
}
nodoFoto.setAttribute("src", galleria[indiceFoto]);
}
― 134 ―
Programmazione in JavaScript
― 135 ―
Programmazione in JavaScript
<img id="t6"/>
<img id="t7"/>
<br />
<img id="t8"/>
<img id="t9"/>
<img id="t10"/>
<img id="t11"/>
<br />
<img id="t12"/>
<img id="t13"/>
<img id="t14"/>
<img id="t15"/>
<br />
<input type="button" value="Nuova partita" id="nuovaPartita" />
</body>
</html>
― 136 ―
Programmazione in JavaScript
nodoCarta.setAttribute("carta", "coperta");
nodoCarta.onclick = gestoreClickCarta;
carte.push(nodoCarta);
}
for (var i = 0; i < NUMERO_IMMAGINI; i++) {
var fileImmagine = "carta" + i + ".png";
var i1 = calcolaIndiceCarta();
carte[i1].setAttribute("src1", fileImmagine);
carte[i1] = null;
var i2 = calcolaIndiceCarta();
carte[i2].setAttribute("src1", fileImmagine);
carte[i2] = null;
}
primaCarta = null;
secondaCarta = null;
} catch ( e ) {
alert("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
― 137 ―
Programmazione in JavaScript
}
}
function gestoreClickCarta () {
try {
if (this.getAttribute("carta") == "scoperta") {
return;
}
if (this == primaCarta) {
return;
}
if (primaCarta == null) {
primaCarta = this;
this.setAttribute("src", this.getAttribute("src1"));
return;
}
if (secondaCarta == null) {
secondaCarta = this;
this.setAttribute("src", this.getAttribute("src1"));
if (primaCarta.getAttribute("src") ==
secondaCarta.getAttribute("src")) {
primaCarta.setAttribute("carta", "scoperta");
primaCarta = null;
secondaCarta.setAttribute("carta", "scoperta");
secondaCarta = null;
} else {
setTimeout(giraCarte, RITARDO);
}
}
} catch ( e ) {
alert("gestoreClickCarta " + e);
}
}
Il calcolo dell’indice della carta utilizza una funzione, uniformeRandom, che ge-
nera un numero casuale intero compreso tra zero e k. Per fare questo utilizza la
funzione predefinita Math.random che genera un numero casuale reale com-
preso tra zero e uno (escluso).
function uniformeRandom (k) {
return Math.trunc(Math.random() * k);
}
function calcolaIndiceCarta () {
var i = uniformeRandom(NUMERO_CARTE);
while (carte[i] == null) {
i = (i + uniformeRandom(NUMERO_CARTE)) % NUMERO_CARTE;
}
― 138 ―
Programmazione in JavaScript
return i;
}
16.3 Snake
Snake è un videogioco presente in molti telefonini, in particolare quelli prodotti
dalla Nokia. Le sue origini risalgono agli anni settanta, con il videogioco arcade
Blockade. Da allora è stato prodotto in numerose piattaforme e varianti, fino a
ritrovare nuova fama negli anni novanta grazie ai cellulari. Snake è un serpente
che mangiando quello che appare sul display si allunga facendo guadagnare dei
punti al giocatore. Si muove costantemente e deve evitare di andare a sbattere
contro gli ostacoli, ma soprattutto contro sé stesso, cosa sempre più difficile
man mano che il suo corpo si allunga [Wikipedia, alla voce Snake].
La versione proposta di seguito è molto semplificata rispetto al gioco origina-
le e alle sue innumerevoli varianti. Il serpente non si allunga durante la partita e
non ha nulla da mangiare. Essendo molto corto non ha il problema di sbattere
contro sé stesso, a meno che non cerchi di andare nella direzione opposta. Infine
non ha ostacoli da evitare, tranne i bordi dell’area al cui interno si può muovere.
La scelta più importante da fare per realizzare il gioco è la rappresentazione
dell’area. Per semplicità l’area è una matrice bidimensionale (elemento table in
HTML, con id matrice) in cui le celle hanno una dimensione molto ridotta (un
quadrato di tre pixel di lato). La matrice è creata dalla funzione gestoreLoad e
tutte le sue celle hanno lo stesso colore di sfondo (azzurro chiaro). Il pulsante
Inizia iniziala partita sia dopo che la pagina è stata caricata sia quando il ser-
pente si ferma. Il serpente è lungo quattro celle, colorate di nero, ed è inizial-
mente posizionato al centro dell’area con la testa rivolta verso destra, direzione
che prende quando inizia la partita. L’utente può cambiare la direzione di movi-
mento del serpente pigiando i tasti freccia presenti sulla tastiera.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="Snake.js"></script>
<link rel="stylesheet" href="Snake.css"></link>
<title>Snake</title>
</head>
<body>
<table id="matrice"></table>
<br />
<input type="button" value="Inizia" id="inizia"/>
</body>
</html>
― 139 ―
Programmazione in JavaScript
Per evitare che le celle della tabella siano separate una dall’altra è necessario as-
segnare alla proprietà di stile border-collapse il valore collapse.
Anche per questa pagina il codice JavaScript ha una struttura standard. La
funzione gestoreLoad, le costanti e le variabili globali sono riportate nel seguito.
const NUMERO_RIGHE = 50;
const NUMERO_COLONNE = 50;
const BASSO = "ArrowDown";
const ALTO = "ArrowUp";
const DESTRA = "ArrowRight";
const SINISTRA = "ArrowLeft";
const COLORE_SFONDO = "lightblue";
const COLORE_SERPENTE = "black";
const RITARDO = 60;
var nodoMatrice;
var nodoInizia;
var serpente;
var direzione;
var finePartita;
function gestoreLoad () {
try {
nodoMatrice = document.getElementById("matrice");
nodoInizia = document.getElementById("inizia");
nodoInizia.onclick = gestoreClickInizia;
document.onkeydown = gestoreKeyDown;
creaMatrice();
coloraMatrice(COLORE_SFONDO);
finePartita = true;
} catch ( e ) {
alert("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
― 140 ―
Programmazione in JavaScript
function creaMatrice () {
for (var i = 0; i < NUMERO_RIGHE; i++) {
var nodoRiga = document.createElement("tr");
nodoMatrice.appendChild(nodoRiga);
for (var j = 0; j < NUMERO_COLONNE; j++) {
var nodoCella = document.createElement("td");
nodoRiga.appendChild(nodoCella);
}
}
}
function coloraMatrice (colore) {
for (var i = 0; i < nodoMatrice.childNodes.length; i++) {
var nodoRiga = nodoMatrice.childNodes[i];
for (var j = 0; j < nodoRiga.childNodes.length; j++) {
var nodoCella = nodoRiga.childNodes[j];
nodoCella.style.backgroundColor = colore;
}
}
}
― 141 ―
Programmazione in JavaScript
}
} catch ( e ) {
alert("gestoreClickInizia " + e);
}
}
function mostraSerpente () {
for (var i = 0; i < serpente.length; i++) {
cambiaColore(serpente[i], COLORE_SERPENTE);
}
}
― 142 ―
Programmazione in JavaScript
}
case SINISTRA : {
nuovaTesta.x--;
break;
}
}
if ((nuovaTesta.x < 0 || nuovaTesta.x == NUMERO_COLONNE) ||
(nuovaTesta.y < 0 || nuovaTesta.y == NUMERO_RIGHE)) {
finePartita = true;
return;
}
cambiaColore(nuovaTesta, COLORE_SERPENTE);
cambiaColore(coda, COLORE_SFONDO);
for (var i = serpente.length - 1; i > 0; i--) {
serpente[i] = serpente[i – 1];
}
serpente[0] = nuovaTesta;
setTimeout(muoviSerpente, RITARDO);
} catch ( e ) {
alert("muoviSerpente " + e);
}
}
― 143 ―
Programmazione in JavaScript
16.4 Quiz
Un quiz è una domanda o una serie di domande, in forma verbale o scritta, pre-
disposte allo scopo di saggiare la preparazione o la memoria della persona alla
quale vengono poste [Wikipedia, alla voce Quiz].
Le risposte a un quiz possono essere in forma aperta o chiusa. La forma
aperta permette a chi risponde a una domanda di formulare liberamente la sua
risposta. La forma chiusa, invece, richiede che chi risponde debba scegliere la
sua risposta tra un elenco prestabilito di risposte.
La pagina web interattiva presentata realizza un quiz in forma chiusa formato
da quattro domande ognuna con tre risposte predefinite. La pagina permette al-
l’utente di passare da una domanda alla successiva, dopo aver eventualmente
selezionato una risposta. Dopo la risposta all’ultima domanda la pagina riporta
il numero di risposte corrette. Il quiz può essere interrotto in qualsiasi momen-
to, facendolo iniziare dalla prima domanda.
La struttura della pagina è molto semplice: la prima riga contiene il numero
della domanda corrente, la seconda riga contiene il testo della domanda corren-
te, le tre righe successive contengono le risposte predefinite, il pulsante Avanti
permette all’utente di passare alla domanda successiva e il pulsante Inizia di ini-
ziare di nuovo il quiz. L’esito del quiz è mostrato in una riga compresa tra i due
pulsanti. Il testo delle risposte è preceduto da un elemento interattivo radio che
permette di sceglierne solo una e di cambiare la scelta prima di passare alla do -
manda successiva.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="Quiz.js"></script>
<title>Quiz</title>
</head>
<body>
<span id="numeroDomanda"></span>
― 144 ―
Programmazione in JavaScript
<br />
<span id="testoDomanda"></span>
<br />
<input type="radio" name="risposte" id="risposta0"/>
<span id="testoRisposta0"></span>
<br />
<input type="radio" name="risposte" id="risposta1"/>
<span id="testoRisposta1"></span>
<br />
<input type="radio" name="risposte" id="risposta2"/>
<span id="testoRisposta2"></span>
<br />
<input type="button" value="Avanti" id="avanti" />
<br />
<span id="risultato"></span>
<br />
― 145 ―
Programmazione in JavaScript
nodoAvanti = document.getElementById("avanti");
nodoRisultato = document.getElementById("risultato");
nodoInizia = document.getElementById("inizia");
nodoAvanti.onclick = gestoreClickAvanti;
nodoInizia.onclick = gestoreClickInizia;
numeroDomande = quiz.length;
nuovoQuiz();
} catch ( e ) {
alert ("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
― 146 ―
Programmazione in JavaScript
domanda : "testoDomanda2",
risposte : [
"testoRisposta21",
"testoRisposta22",
"testoRisposta23"
],
rispostaEsatta : 0
},
{ // domanda 2
domanda : "testoDomanda3",
risposte : [
"testoRisposta31",
"testoRisposta32",
"testoRisposta33"
],
rispostaEsatta : 0
},
{ // domanda 3
domanda : "testoDomanda4",
risposte : [
"testoRisposta41",
"testoRisposta42",
"testoRisposta43"
],
rispostaEsatta : 0
}
];
― 147 ―
Programmazione in JavaScript
Per iniziare un nuovo quiz l’utente deve pigiare il pulsante Inizia, a cui è asso-
ciato la funzione gestoreClickInizia.
― 148 ―
Programmazione in JavaScript
function gestoreClickInizia () {
try {
nuovoQuiz();
} catch ( e ) {
alert ("gestoreClickInizia " + e);
}
}
― 149 ―
Programmazione in JavaScript
― 150 ―
Programmazione in JavaScript
}
}
Per far cambiare il cursore quando passa sopra l’immagine è sufficiente cambia-
re lo stile cursor, assegnando il valore pointer.
function gestoreCursore () {
try {
nodoImmagine.style.cursor = "pointer";
} catch ( e ) {
alert("gestoreCursore " + e);
}
}
Questo esempio di drag and drop è molto semplice. Lo schema presentato può
essere facilmente esteso per casi più complicati. Ad esempio, si potrebbe defini-
re un altro rettangolo che contiene inizialmente l’immagine e permettere all’u-
tente di spostarla da un rettangolo all’altro.
― 151 ―
Programmazione in JavaScript
― 152 ―
Programmazione in JavaScript
768,281,785,316,765,318,732,359,705,342,
669,247,573,250,671,131,645, 90,539, 18,
590, 16" />
<!-- Serpente e forbici -->
<area id="4" shape="poly"
coords="443,117,500, 18,651,122,517,202,584,207,
654,160,487,199" />
<!-- Maternità -->
<area id="5" shape="poly"
coords="561,322,605,313,645,393,634,495,590,497,
565,437,544,398" />
<!-- Delfino -->
<area id="6" shape="poly"
coords="333, 24,393, 42,435, 22,435, 55,460, 70,
435, 77,402, 77,435,142,378,137,360,146,
357,175,363,194,337,186,312,174,301,140,
258,107,277, 71,261, 52,271, 29" />
<!-- Infinito -->
<area id="7" shape="poly"
coords="178, 48,237, 38,265, 68,245,101,250,130,
281,147,285,184,253,219,197,224,163,202,
161,170,151,141,121,128,101,120,144, 74" />
<!-- Cooperatività -->
<area id="8" shape="poly"
coords="288,530,332,550,415,625,355,629,335,694,
289,694,214,605,253,544" />
<!-- Lupo -->
<area id="9" shape="poly"
coords="162,311,235,311,251,383,297,391,296,426,
323,448,337,485,301,487,273,529,251,503,
221,471,213,421,215,335" />
<!-- Uomo scala -->
<area id="10" shape="poly"
coords="293,374,298,284,269,237,149,241,128,142,
103,245, 55,268, 6,246, 44,294,258,306,
246,372" />
<!-- Gemelli -->
<area id="11" shape="poly"
coords="281,510,359,459,422,564,380,592,349,555" />
<!-- Scimmia -->
<area id="12" shape="poly"
coords=" 13,279,116,349, 69,406, 9,367" />
</map>
<br />
<br />
<span id="messaggio"></span>
<h3>La definizione delle aree è di Elvira Mercatanti</h3>
― 153 ―
Programmazione in JavaScript
</body>
</html>
// contenuti
var simboliNascosti = [
"Croce pisana",
"Keith Haring",
"Uomo TV",
"Tre razze umane",
"Forbici che tagliano serpente",
"Maternità",
"Uomo con delfino",
"Infinito",
"Cooperazione",
"Cane",
"Uomo scala",
"Gemelli",
"Scimmia"
];
― 154 ―
Programmazione in JavaScript
La seconda modifica riguarda le coordinate di ogni area, che devono essere ri-
portate su una sola riga, senza andare a capo. Questo accorgimento è necessario
per consentirne la modifica dinamica.
Il programma JavaScript è molto diverso da quello precedente. L’idea alla
base della nuova soluzione consiste nel registrare l’evento resize, associato alla
finestra, a un gestore che calcola le nuove coordinate delle aree utilizzando un
fattore moltiplicativo (la variabile ratio) pari al rapporto tra l’attuale dimensio-
ne della foto (la variabile attualeDimensioneFoto) e la dimensione della foto
prima della sua scalatura (la variabile dimensioneFoto). Per realizzare questa
tecnica è necessario memorizzare le coordinate di ogni area in un array (la va-
riabile coordinateAree) e aggiornare questo array ogni volta che la foto viene
scalata.
La funzione gestoreLoad è così modificata.
const LARGHEZZZA_FOTO = 803;
var nodoTuttomondo;
var nodoMessaggio;
var nodiArea;
var coordinateAree;
var dimensioneFoto;
function gestoreLoad () {
try {
nodiArea = document.getElementsByTagName("area");
nodoTuttomondo = document.getElementById("tuttomondo");
nodoMessaggio = document.getElementById("messaggio");
― 155 ―
Programmazione in JavaScript
coordinateAree = [];
for (var i = 0; i < nodiArea.length; i++){
var nodoArea = nodiArea[i];
nodoArea.onclick = gestoreClickArea;
nodoArea.onmouseover = gestoreCursore;
coordinateAree[i] = nodoArea.coords.split(',');
}
dimensioneFoto = LARGHEZZZA_FOTO;
var nodoTesto = document.createTextNode("");
nodoMessaggio.appendChild(nodoTesto);
window.onresize = gestoreResize;
gestoreResize();
} catch ( e ) {
alert ("gestoreLoad " + e);
}
}
window.onload = gestoreLoad;
― 156 ―
Programmazione in JavaScript
17 Progetto didattico
17.1 Il sito
La scelta dell’argomento del sito è lasciata completamente allo studente che
può, in questo modo, esprimere al meglio le sue capacità creative e tecniche. Il
sito si rivolge a una platea di destinatari ben definita, potenzialmente interessa-
ti a visitarlo.
La complessità e il livello di approfondimento dell’argomento richiedono una
valutazione attenta e consapevole. Un argomento semplice può dar luogo a un
sito che non valorizza le competenze e le conoscenze dello studente. Viceversa,
un argomento troppo complesso può comportare un periodo di tempo eccessivo
per la realizzazione del sito, spesso superiore a quello previsto per il progetto di-
dattico.
L’argomento scelto può richiedere la raccolta di contenuti di varia natura (te-
sti, immagini, filmati). Molto spesso accade che parte di questi contenuti sia sta-
to realizzato da altre persone o istituzioni. Utilizzarli è consentito, a patto di ci-
tare puntualmente le fonti: i siti da cui sono state raccolte le informazioni, i libri,
gli articoli, il materiale multimediale. Inoltre, è buona regola indicare esplicita-
mente le persone che hanno dato un contributo alla realizzazione del sito, speci-
ficando esattamente ciò che hanno fatto.
Occorre prestare molta attenzione alla dimensione dei contenuti non originali
presentati nel sito. Ad esempio, non è consentito copiare interi paragrafi da altri
siti o da libri perché ciò costituisce una violazione del diritto d’autore, anche se
le fonti sono citate.
I contenuti raccolti sono presentati nel sito per renderne efficace la comuni-
cazione e la fruizione da parte dei destinatari. La natura intrinsecamente multi-
mediale e ipertestuale del sito richiede sinteticità, precisione e incisività. Ad
esempio, è bene evitare che una pagina contenga testi lineari lunghi e poco
strutturati.
― 157 ―
Programmazione in JavaScript
Il sito è strutturato in più pagine, legate tra loro da un tema grafico comune.
La pagina principale, chiamata home page, contiene il nome del sito e ne descri-
ve sinteticamente le finalità. A partire da questa pagina si raggiungono le altre,
coordinate tra loro, in cui l’argomento è sviluppato in maggior dettaglio. Il nu-
mero complessivo delle pagine varia da un minimo di 4 a un massimo (consi-
gliato) di 10.
Il sito contiene elementi di interattività che consentono all’utente di effettua-
re azioni che causano effetti visibili, secondo un dialogo gradevole e intuitivo.
Il documento dei requisiti descrive il progetto didattico nei suoi aspetti prin-
cipali. La sua redazione inizia il più presto possibile, per consentire allo studente
di riflettere sull’argomento da proporre, sui contenuti da raccogliere, sulle scelte
di progettazione e su quelle di programmazione. Il modello del documento dei
requisiti è disponibile sul sito web dei docenti.
Appena pronto, il documento è inviato per posta elettronica ai docenti che ne
prendono visione e lo discutono durante gli incontri con lo studente. Anche se la
redazione del documento dei requisiti non è una condizione necessaria per il su-
peramento della verifica finale, l’esperienza acquisita finora dimostra che i pro-
getti corredati da questo documento sono di buona qualità.
17.2 Le regole
Il progetto didattico si svolge secondo regole definite a priori, il cui rispetto è es-
senziale per il superamento della verifica finale. Le regole si dividono in due
gruppi: requisiti, suggerimenti. La violazione di almeno un requisito comporta
l’esclusione dalla prova d’esame. I suggerimenti sono indicazioni che lo studen-
te può ignorare senza che ciò comporti l’esclusione dalla prova d’esame.
Requisiti
1. I file HTML sono redatti secondo lo standard HTML5 e validati con il va-
lidatore del W3C.
2. I file CSS sono validati con il validatore del W3C.
3. Lo stile è separato dal contenuto mediante l’uso di fogli di stile.
4. Il sito è responsive o almeno fluido per sfruttare al meglio lo spazio a di-
sposizione su schermi di diversa dimensione.
5. Il sito ha una pagina con le generalità dell’autore, i riferimenti ai conte-
nuti non originali utilizzati, le persone che hanno partecipato alla sua
realizzazione.
6. I collegamenti ipertestuali presenti nel sito funzionano anche quando i
file sono spostati altrove, ad esempio su un web server.
― 158 ―
Programmazione in JavaScript
Suggerimenti
1. La prima pagina del sito, la cosiddetta home page, si chiama index.html.
2. Il sito è visualizzato correttamente sui browser recenti.
3. I contenuti sono corretti dal punto di vista ortografico, senza errori di
battitura.
4. Le immagini sono di buona qualità, non deformate e di dimensioni conte-
nute.
5. Il codice JavaScript è correttamente indentato.
6. I contenuti gestiti dal codice JavaScript sono dichiarati in un file con
estensione js, separato dagli altri file con la stessa estensione.
7. Le variabili globali sono inizializzate nel gestore dell’evento load.
8. Ad ogni funzione JavaScript è associato un commento che la descrive
sommariamente.
― 159 ―
Programmazione in JavaScript
― 160 ―
Programmazione in JavaScript
― 161 ―
Programmazione in JavaScript
― 162 ―
Programmazione in JavaScript
― 163 ―
19 Grammatica di JavaScript
this, new
return, break
if, else
while, for, in
19.2 Caratteri
<Lettera> ::= a | b | c | d | e | f | g | h | i
| j | k | l | m | n | o | p | q | r
| s | t | u | v | w | x | y | z
| A | B | C | D | E | F | G | H | I
| J | K | L | M | N | O | P | Q | R
| S | T | U | V | W | X | Y | Z
<Cifra> ::= 0
| <CifraNz>
<CifraNz> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
18 Carattere di spaziatura.
― 166 ―
Programmazione in JavaScript
19.3 Identificatore
<Identificatore> ::= <CarIniziale>
| <CarIniziale> <Caratteri>
― 167 ―
Programmazione in JavaScript
19.4 Letterale
<Letterale> ::= <Numero>
| <Booleano>
| <Stringa>
| null
― 168 ―
Programmazione in JavaScript
19.5 Espressione
<Espressione> ::= <Letterale>
| <Identificatore>
| (<Espressione>)
| <UnOp> <Espressione>
| <Espressione> <BinOp> <Espressione>
| this
| <Espressione>.<Identificatore>
| <Espressione>.<Chiamata>
| <Espressione>[<Espressione>]
| <Espressione> in <Espressione>
| <Chiamata>
| new <Identificatore>()
| new <Identificatore>(<Espressioni>)
| []
| [<Espressioni>]
| {}
| {<Coppie>}
<UnOp> ::= − | + | !
<BinOP> ::= - | + | * | / | %
| && | || |
| < | <= | > | >= | == | !=
― 169 ―
Programmazione in JavaScript
― 170 ―
Programmazione in JavaScript
19.7 Dichiarazione
<DicCost> ::= const <Identificatore> = <Espressione>;
― 171 ―
Programmazione in JavaScript
― 172 ―
Programmazione in JavaScript
― 173 ―
Programmazione in JavaScript
Indice analitico
Abbreviazione.................................................................................................................................. 31
Addizione........................................................................................................................................ 24
Albero.............................................................................................................................................. 81
Albero binario.................................................................................................................................. 81
Albero di derivazione....................................................................................................................... 15
Albero DOM.................................................................................................................................... 85
Albero n-ario................................................................................................................................... 82
Albero n-ario con attributi.............................................................................................................. 82
Albero sintattico.............................................................................................................................. 15
Alfabeto............................................................................................................................................ 11
Algoritmo di ordinamento.............................................................................................................. 60
Altezza............................................................................................................................................. 82
Ambiente......................................................................................................................................... 40
Ambiente di programmazione......................................................................................................... 17
Anno bisestile.................................................................................................................................. 40
Apici doppi...................................................................................................................................... 20
Applicazione.................................................................................................................................... 17
Applicazione web............................................................................................................................ 85
Aritmetica di Peano......................................................................................................................... 77
Array................................................................................................................................................ 51
Array associativo............................................................................................................................. 53
Array omogenei............................................................................................................................... 51
Assiomi di Peano............................................................................................................................. 77
Backslash........................................................................................................................................ 20
Backus-Naur Form.......................................................................................................................... 13
Barra del browser............................................................................................................................ 84
Barra diagonale decrescente........................................................................................................... 20
Blocco di comandi........................................................................................................................... 33
Booleano.......................................................................................................................................... 18
Calcolatore elettronico..................................................................................................................... 11
Calendario giuliano......................................................................................................................... 40
Cammino......................................................................................................................................... 81
Carattere......................................................................................................................................... 20
Carattere di quotatura.................................................................................................................... 20
Carattere stampabile...................................................................................................................... 20
Case sensitive.................................................................................................................................. 18
Categoria sintattica.......................................................................................................................... 13
Chiamata di funzione...................................................................................................................... 37
Chiave............................................................................................................................................. 117
Chiesa di Sant’Antonio Abate........................................................................................................ 152
Cifra numerica................................................................................................................................ 20
Codice etico della comunità accademica......................................................................................160
Comandi annidati........................................................................................................................... 34
Comando.......................................................................................................................................... 17
Comando break............................................................................................................................... 35
Comando composto......................................................................................................................... 17
Comando condizionale................................................................................................................... 33
Comando di assegnamento............................................................................................................. 31
Comando di scelta multipla............................................................................................................ 34
Comando di stampa......................................................................................................................... 21
Comando if...................................................................................................................................... 33
Comando iterativo.......................................................................................................................... 45
― 175 ―
Programmazione in JavaScript
― 176 ―
Programmazione in JavaScript
Evento keyUp.................................................................................................................................. 94
Evento load..................................................................................................................................... 94
Evento mouseDown........................................................................................................................ 93
Evento mouseOut........................................................................................................................... 94
Evento mouseOver.......................................................................................................................... 94
Evento mouseUp............................................................................................................................. 93
Evento resize.................................................................................................................................. 155
Evento unload................................................................................................................................. 94
Fattoriale......................................................................................................................................... 75
Filtro................................................................................................................................................ 58
Filtro passa banda........................................................................................................................... 58
Finestra............................................................................................................................................ 17
Focus............................................................................................................................................... 93
Foglia di un albero sintattico........................................................................................................... 15
Foglio di stile................................................................................................................................... 88
Formalismo..................................................................................................................................... 12
Formattazione................................................................................................................................. 20
Frase................................................................................................................................................ 12
Frontiera......................................................................................................................................... 82
Funzione.......................................................................................................................................... 37
Funzione anonima.......................................................................................................................... 39
Funzione predefinita....................................................................................................................... 42
Funzione ricorsiva........................................................................................................................... 75
Fuso orario.................................................................................................................................... 108
Galleria fotografica........................................................................................................................ 131
Generazione di evento.................................................................................................................... 93
Gestore di evento............................................................................................................................ 95
Giuseppe Peano............................................................................................................................... 77
Giustapposizione di stringhe.......................................................................................................... 25
GMT............................................................................................................................................... 108
Grafo non orientato......................................................................................................................... 81
Grammatica..................................................................................................................................... 13
Guardia............................................................................................................................................ 45
Home page..................................................................................................................................... 158
HTML.............................................................................................................................................. 83
HyperText Mark-up Language....................................................................................................... 83
Identificatore.................................................................................................................................. 29
Il gioco del Memory....................................................................................................................... 135
Immagine interattiva..................................................................................................................... 151
Immagine scalabile........................................................................................................................ 155
Indentazione................................................................................................................................... 34
Indice............................................................................................................................................... 51
Indice di iterazione......................................................................................................................... 45
Induzione......................................................................................................................................... 77
Infinity............................................................................................................................................. 26
Inizializzazione............................................................................................................................... 29
Insieme delle frasi di un alfabeto.................................................................................................... 12
Interattività..................................................................................................................................... 93
Interfaccia programmatica............................................................................................................. 85
Internet.......................................................................................................................................... 107
Interruzione di riga......................................................................................................................... 18
Intervallo......................................................................................................................................... 39
Intestazione..................................................................................................................................... 83
Intestazione di funzione.................................................................................................................. 37
― 177 ―
Programmazione in JavaScript
Invocazione di funzione.................................................................................................................. 37
JavaScript........................................................................................................................................ 17
Keith Haring.................................................................................................................................. 152
Leonardo Fibonacci......................................................................................................................... 76
Letterale........................................................................................................................................... 18
Letterale false.................................................................................................................................. 19
Letterale logico................................................................................................................................ 19
Letterale numerico.......................................................................................................................... 19
Letterale stringa.............................................................................................................................. 20
Letterale true................................................................................................................................... 19
Linguaggio........................................................................................................................................ 11
Linguaggio artificiale....................................................................................................................... 11
Linguaggio di programmazione....................................................................................................... 11
Linguaggio di programmazione imperativo...................................................................................18
Linguaggio naturale......................................................................................................................... 11
Logaritmo........................................................................................................................................ 42
Maggiore......................................................................................................................................... 24
Maggiore o uguale........................................................................................................................... 24
Mappa dei progetti........................................................................................................................ 159
Marca.............................................................................................................................................. 83
Marca body..................................................................................................................................... 84
Marca di apertura........................................................................................................................... 83
Marca di chiusura........................................................................................................................... 83
Marca head...................................................................................................................................... 83
Marca html...................................................................................................................................... 83
Marca script.................................................................................................................................... 84
Marcatura........................................................................................................................................ 83
Massimo.......................................................................................................................................... 57
Matrice bidimensionale................................................................................................................ 139
Media aritmetica semplice.............................................................................................................. 61
Menu di selezione........................................................................................................................... 111
Metalinguaggio................................................................................................................................ 13
Metasimbolo.................................................................................................................................... 13
Metodo............................................................................................................................................ 52
Metodo appendChild...................................................................................................................... 89
Metodo createElement................................................................................................................... 89
Metodo createTextNode................................................................................................................. 89
Metodo getAttribute....................................................................................................................... 88
Metodo getElementById................................................................................................................. 88
Metodo getElementsByClassName................................................................................................ 88
Metodo getElementsByTagName................................................................................................... 87
Metodo indexOf............................................................................................................................... 55
Metodo insertBefore....................................................................................................................... 89
Metodo push................................................................................................................................... 53
Metodo removeAttribute................................................................................................................ 88
Metodo removeChild...................................................................................................................... 90
Metodo replaceChild...................................................................................................................... 90
Metodo setAttribute....................................................................................................................... 88
Metodo split.................................................................................................................................. 109
Metodo substr................................................................................................................................. 55
Metodo toLowerCase...................................................................................................................... 55
Metodo trim.................................................................................................................................. 109
Minimo............................................................................................................................................ 57
Minore............................................................................................................................................. 24
― 178 ―
Programmazione in JavaScript
Minore o uguale.............................................................................................................................. 24
Modulo............................................................................................................................................ 24
Moltiplicazione............................................................................................................................... 24
Motore di ricerca............................................................................................................................ 117
Mouse.............................................................................................................................................. 93
Murale Tuttomondo...................................................................................................................... 152
NaN................................................................................................................................................. 26
Negazione........................................................................................................................................ 23
Nodo attributo................................................................................................................................ 85
Nodo di un albero sintattico............................................................................................................ 15
Nodo documento............................................................................................................................. 85
Nodo elemento................................................................................................................................ 85
Nodo testo....................................................................................................................................... 85
Notazione a punti............................................................................................................................ 52
Numeri di Fibonacci........................................................................................................................ 76
Numero casuale.............................................................................................................................. 42
Numero primo................................................................................................................................. 47
Nuova riga....................................................................................................................................... 20
Oggetto............................................................................................................................................ 52
Oggetto document........................................................................................................................... 85
Oggetto predefinito......................................................................................................................... 52
Operando......................................................................................................................................... 23
Operatore........................................................................................................................................ 23
Operatore binario........................................................................................................................... 24
Operatore booleano........................................................................................................................ 24
Operatore di concatenazione.......................................................................................................... 25
Operatore di confronto................................................................................................................... 24
Operatore numerico........................................................................................................................ 23
Operatore unario............................................................................................................................. 23
Operazione...................................................................................................................................... 23
Ordine di valutazione...................................................................................................................... 25
Pagina web....................................................................................................................................... 17
Palindromo...................................................................................................................................... 59
Parametro attuale............................................................................................................................ 37
Parametro di funzione.................................................................................................................... 37
Parametro formale.......................................................................................................................... 37
Parentesi angolari........................................................................................................................... 83
Parentesi graffe............................................................................................................................... 33
Parentesi tonda................................................................................................................................ 21
Parola............................................................................................................................................... 11
Parola riservata............................................................................................................................... 29
Passaggio dei parametri.................................................................................................................. 37
Pi greco............................................................................................................................................ 30
Pixel............................................................................................................................................... 139
Plagio............................................................................................................................................. 160
Poligono......................................................................................................................................... 152
Precedenza degli operatori............................................................................................................. 25
Predicato......................................................................................................................................... 39
Predicato isNaN............................................................................................................................. 101
Processo di derivazione................................................................................................................... 14
Produzione sintattica....................................................................................................................... 13
Progetto didattico.......................................................................................................................... 157
Programma...................................................................................................................................... 11
Proprietà.......................................................................................................................................... 52
― 179 ―
Programmazione in JavaScript
Proprietà attributes........................................................................................................................ 86
Proprietà childNodes...................................................................................................................... 85
Proprietà draggable....................................................................................................................... 149
Proprietà firstChild......................................................................................................................... 86
Proprietà firstSibling...................................................................................................................... 86
Proprietà innerHTML..................................................................................................................... 90
Proprietà lastChild.......................................................................................................................... 86
Proprietà lastSibling....................................................................................................................... 87
Proprietà length.............................................................................................................................. 52
Proprietà nextSibling...................................................................................................................... 87
Proprietà nodeName....................................................................................................................... 85
Proprietà nodeType........................................................................................................................ 85
Proprietà nodeValue....................................................................................................................... 85
Proprietà parentNode..................................................................................................................... 87
Proprietà previousSibling............................................................................................................... 87
Punto e virgola................................................................................................................................. 18
Quiz................................................................................................................................................ 144
Radice di un albero sintattico.......................................................................................................... 15
Radice quadrata.............................................................................................................................. 42
Radice quadrata intera................................................................................................................... 48
Rappresentazione decimale............................................................................................................ 19
Rappresentazione esadecimale..................................................................................................... 101
Rappresentazione esponenziale...................................................................................................... 19
Registrazione di un evento............................................................................................................. 96
Regola sintattica.............................................................................................................................. 13
Relazione di ordinamento............................................................................................................... 25
Relazione di ordinamento alfanumerico........................................................................................25
Relazione di ordinamento lessicografico........................................................................................25
Ricerca............................................................................................................................................ 117
Ricerca lineare................................................................................................................................. 56
Ricettario........................................................................................................................................ 115
Ritorno a capo................................................................................................................................. 18
Schermo........................................................................................................................................... 17
Script................................................................................................................................................ 17
Segno di interpunzione................................................................................................................... 20
Segno negativo................................................................................................................................ 23
Segno positivo................................................................................................................................. 23
Selettore.......................................................................................................................................... 35
Selezione a cascata......................................................................................................................... 127
Semantica........................................................................................................................................ 12
Sequenza.......................................................................................................................................... 17
Sequenza di comandi...................................................................................................................... 33
Sequenza di derivazione.................................................................................................................. 14
Sequenza di escape......................................................................................................................... 20
Servizio web................................................................................................................................... 110
Sessione di connessione................................................................................................................ 107
Simbolo............................................................................................................................................ 11
Simbolo iniziale............................................................................................................................... 13
Simbolo non-terminale................................................................................................................... 13
Simbolo terminale........................................................................................................................... 13
Sintassi............................................................................................................................................. 12
Sistema posizionale......................................................................................................................... 37
Sito responsive.............................................................................................................................. 158
Sito web........................................................................................................................................... 83
― 180 ―
Programmazione in JavaScript
Snake............................................................................................................................................. 139
Sottrazione...................................................................................................................................... 24
Spazio bianco................................................................................................................................... 18
Stato di una pagina web................................................................................................................ 100
Stringa............................................................................................................................................. 20
Successione di Fibonacci................................................................................................................. 76
Successore....................................................................................................................................... 77
Tabulazione..................................................................................................................................... 20
Tabulazione orizzontale.................................................................................................................. 21
Tag................................................................................................................................................... 83
Tastiera........................................................................................................................................... 20
Tasto freccia.................................................................................................................................. 139
Tempo medio di Greenwich.......................................................................................................... 108
Teoria del prim’ordine.................................................................................................................... 77
Terminatore di comando................................................................................................................ 18
Tipo composto................................................................................................................................. 51
Tipo primitivo.................................................................................................................................. 18
Uguaglianza..................................................................................................................................... 24
undefined........................................................................................................................................ 29
UTC............................................................................................................................................... 108
Validazione.................................................................................................................................... 101
Valore assoluto................................................................................................................................ 42
Valore di ingresso.......................................................................................................................... 101
Valore logico.................................................................................................................................... 18
Valore numerico.............................................................................................................................. 18
Valutazione di espressione.............................................................................................................. 25
Variabile.......................................................................................................................................... 29
Variabile globale.............................................................................................................................. 41
Variabile locale................................................................................................................................ 41
Vertice.............................................................................................................................................. 81
Vertice di un poligono................................................................................................................... 152
Visibilità.......................................................................................................................................... 40
Visita................................................................................................................................................ 81
Visita anticipata............................................................................................................................... 81
Visita differita.................................................................................................................................. 81
Visita simmetrica............................................................................................................................ 81
W3C................................................................................................................................................. 85
Web server..................................................................................................................................... 158
World Wide Web Consortium........................................................................................................ 85
― 181 ―