il linguaggio javascriptlioy/01nbe/js.pdf · linguaggio di script pensato per il web (ma ora...

79
Il linguaggio Javascript Antonio Lioy < [email protected] > Politecnico di Torino Dip. Automatica e Informatica

Upload: others

Post on 29-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Il linguaggio Javascript

Antonio Lioy< [email protected] >

Politecnico di TorinoDip. Automatica e Informatica

Javascript linguaggio di script pensato per il web (ma ora adottato

anche in altri ambienti, es. Adobe PDF) eseguibile lato client o lato server introdotto in pagine HTML tramite:

il tag <script> nell'head o nel body istruzioni specificate per un event-handler

eseguito nel momento in cui il browser, leggendo HTML, incontra il codice Javascript (sospensione temporanea dell'azione di interprete HTML)

node.js è un server web scritto in Javascript modello ad eventi (event-driven) registra funzioni JS di callback per gli eventi

© A.Lioy - Politecnico di Torino (2009-2020) 2

JavaScript core ed estensioni

estensioniclient-side

(es. window,history)

Core JavaScript

(variabili, funzioni,controllo di flusso, …)

estensioniserver-side

(es. database,gestione server)

client-side JavaScript

server-side JavaScript

© A.Lioy - Politecnico di Torino (2009-2020) 3

Il tag <script> due parametri principali: type="text/javascript" (default da HTML5) src="URI" (lo script è presente alla URI indicata)

esempi:

<scripttype="text/javascript"src="esempio.js">

</script>

<script type="text/javascript">alert("CIAO!");</script>

alert("CIAO!");

esempio.js

© A.Lioy - Politecnico di Torino (2009-2020) 7

Sintassi Javascript è case-sensitive ogni istruzione è terminata da fine riga (vincolo: una sola istruzione per riga) punto-e-virgola (possibili più istruzioni per riga)/* istruzioni terminate da fine riga */a = 3 + bc = 2 * a

/* istruzioni terminate con ; */a = 3 + b ; c= 2 * a;

/* errore! */a = 3+ b;

© A.Lioy - Politecnico di Torino (2009-2020) 8

Tipi di dati e corrispondenti valori base numeri decimali (es. 14, -7, 3.14, 10.7e-4),

ottali (es. 016) ed esadecimali (es. 0xE) valori Booleani (true false) stringhe di caratteri, racchiuse tra apici doppi o singoli (es.

"ciao mamma" 'ciao babbo') oggetti il valore speciale null (variabile non inizializzata) il valore speciale undefined (variabile non definita) il valore speciale NaN (Not A Number)

© A.Lioy - Politecnico di Torino (2009-2020) 9

Commenti stile C++: da "//" sino a fine riga stile C: tutto il testo compreso tra "/*" e "*/" esempi:

<script type="text/javascript">// commento di una sola riga in stile C++/*commento che occupa quattro righein stile C*/</script>

© A.Lioy - Politecnico di Torino (2009-2020) 10

Commenti HTML e JavaScript JS riconosce il commento HTML <!-- come commento single-

line JS non riconosce la sequenza di chiusura del commento

HTML (è quindi necessario premettere il commento JS //) usato in passato per nascondere JS ai browser che non lo

supportano (ed ignorano il tag <script> perché sconosciuto) – oggi meno necessario

<script type="text/javascript"><!--

document.writeln("<p>Ciao!></p>")//--></script>

© A.Lioy - Politecnico di Torino (2009-2020) 11

Variabili identificate tramite il loro nome:

deve iniziare con un carattere alfabetico, $ o _ può poi contenere caratteri alfanumerici, $ e _ es. costo, $1, studente_12345, _2009q1

non sono tipate (al contrario di Java, C, …) ma: prendono un tipo al momento della loro inizializzazione possono cambiare tipo (automaticamente) per adattarsi al

contesto in cui vengono usate

© A.Lioy - Politecnico di Torino (2009-2020) 12

Creazione di una variabile creazione esplicita tramite l'istruzione "var" (con o senza un

valore iniziale): var totale; var totale = 0; var saluto = "ciao mamma!"

creazione implicita assegnando un valore alla variabile: totale = 0;

se si usa una variabile senza averle prima assegnato un valore: undefined / NaN (se dichiarata con "var") runtime error (se non dichiarata)

© A.Lioy - Politecnico di Torino (2009-2020) 13

Costanti tramite l'istruzione "const" si può dichiarare una variabile

con valore fisso: const iva = 0.21; const autore = "A.Lioy";

all'interno di una stringa si possono usare: caratteri ISO-8859-1 caratteri Unicode sequenze di escape: \r \n \t \' \" \\ \nnn(ottale) \xNN (hex) \UNNNN (Unicode hex)

attenzione all’uso (se stringa usata in HTML allora può richiedere codifica, es. &grave; )

© A.Lioy - Politecnico di Torino (2009-2020) 14

Input ed output JS è un linguggio di scripting, pensato per essere eseguito

lato client (in un browser) o lato server le funzioni di I/O dipendono dall'ambiente di esecuzione per il lato client si possono usare: per l'input i dati provenienti da una finestra pop-up di input i dati provenienti da un form HTML (tramite DOM)

per l'output un finestra pop-up di output la pagina HTML (mentre viene "costruita" o tramite DOM

dopo la sua "costruzione")

© A.Lioy - Politecnico di Torino (2009-2020) 15

Pop-up di I/O window.alert( messaggio ) apre un pop-up bloccante contenente il messaggio ed un

pulsante per conferma di lettura (OK)

window.prompt( prompt_msg[ , valore_iniziale ] ) apre un pop-up bloccante contenente il messaggio di prompt,

un campo di input (vuoto o col valore iniziale specificato) e due pulsanti per inserire la risposta (OK) o per non fornirla (Cancel)

restituisce il valore introdotto, oppure null nel caso l'utente abbia premuto Cancel o chiuso il pop-up

© A.Lioy - Politecnico di Torino (2009-2020) 16

Pop-up di I/O window.confirm( messaggio ) apre un pop-up bloccante contenente il messaggio e due

pulsanti (per rispondere in modo affermativo o negativo) restituisce un valore Booleano (true se la risposta è

affermativa, false altrimenti)

a rigor di termini sono tutte implementazioni JS dell'oggetto window (DOM livello 0) e relativi metodi

© A.Lioy - Politecnico di Torino (2009-2020) 17

Pop-up di I/O: esempio di alert

<!DOCTYPE html><html><head><title>Pop-up di I/O: esempio di alert</title><script> window.alert("Attenzione! questa pagina usa JS")</script>

</head><body><p>Fine dell'esempio.</p>

</body></html>

js_alert.html

© A.Lioy - Politecnico di Torino (2009-2020) 18

Pop-up di I/O: esempio 1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<html><head><title>Pop-up di I/O: esempio 1</title><script type="text/javascript"> var n = window.prompt("Nome?", "nessuno")window.alert("Ciao "+n);

</script></head><body><p>Fine dell'esempio.</p>

</body></html>

nome1.html

© A.Lioy - Politecnico di Torino (2009-2020) 19

Pop-up di I/O: esempio 2<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">

<html><head><title>Pop-up di I/O: esempio 2</title>

</head><body><p>Inizio dell'esempio.</p><script type="text/javascript">var n = window.prompt("Nome?", "nessuno")window.alert("Ciao "+n);

</script><p>Fine dell'esempio.</p>

</body></html> nome2.html

© A.Lioy - Politecnico di Torino (2009-2020) 20

Output tramite HTML si può usare l'oggetto DOM "document" con uno dei seguenti

metodi: write( text ) inserisce il testo

writeln( text ) inserisce il testo seguito da CR LF

il testo è inserito nel punto ove si incontra lo script ATTENZIONE! se queste funzioni sono usate *dopo* che la

pagina è stata completamente caricata, allora la loro esecuzione cancella completamente tutto il contenuto della pagina (ossia rimpiazza il body HTML)

© A.Lioy - Politecnico di Torino (2009-2020) 21

Output tramite HTML: esempio

<!DOCTYPE html><html><head><title>Output tramite HTML: esempio</title>

</head><body><h1>Esempio del metodo document.writeln()</h1><script>var n = window.prompt("Nome?", "nessuno");document.writeln("<p>Ciao "+n+"</p>");

</script></body></html>

nome3.html

© A.Lioy - Politecnico di Torino (2009-2020) 22

Output tramite HTML: sovrascrittura

<!DOCTYPE html><html><head><title>Output tramite HTML: sovrascrittura</title>

</head><body><h1>Esempio sovrascrittura tutto HTML</h1><p onclick="document.writeln('<p>Ciao ciao</p>')">Clicca questo testo se vuoi vedere cambiaretutta la pagina.</p>

</body></html>

nome4.html

© A.Lioy - Politecnico di Torino (2009-2020) 23

Output su console a scopo di debug, si può anche fare output sull'oggetto

"console" tramite il metodo log() output visibile su un'apposita finestra del browser in generale nella console del browser appaiono non solo

questi messaggi ma anche errori, warning, … è quindi MOLTO utile darci un'occhiata quando uno script non funziona come ci aspetteremmo!

<body><h1>Esempio di output su console</h1><script>console.log("inizio del <body>")</script><p>Testo della pagina.</p>.<script>console.log("fine del <body>")</script>

</body>js_console.html

© A.Lioy - Politecnico di Torino (2009-2020) 24

Javascript "strict mode" JS è tollerante sui varie cose: es. permette di usare una variabile senza averla definita … ma così se sbagliamo a scrivere il nome di una variabile ne

generiamo una nuova (!) specificando "use strict" all'inizio di uno script, molte cose

non saranno permesse ma diventeranno errori segnalati

js_use_strict.html

© A.Lioy - Politecnico di Torino (2009-2020) 25

descrizione simbolouguaglianza (valore) ==

identità (valore e tipo) ===

disuguaglianza (valore) !=

non identità (valore e tipo) !==

maggiore di / maggiore o uguale a > >=

minore di / minore o uguale a < <=

appartenenza in

AND logico &&

NOT logico !

OR logico ||

Operatori relazionali e logici

© A.Lioy - Politecnico di Torino (2009-2020) 26

Operatori e valori Booleani i seguenti valori sono equivalenti a Falso: false 0 NaN la stringa vuota "" null undefined

qualunque altro valore è equivalente a Vero attenzione quindi ai confronti: (27 == true) fornisce valore Vero (27 === true) fornisce valore Falso

© A.Lioy - Politecnico di Torino (2009-2020) 27

Operatori aritmetici

descrizione simbolo

addizione +

incremento unitario ++

sottrazione –

decremento unitario ––

moltiplicazione *

elevamento a potenza **

divisione (floating-point) /

modulo (resto della divisione intera) %

© A.Lioy - Politecnico di Torino (2009-2020) 29

Operatori di assegnazione

descrizione simbolo esempio equivalenzaassegnazione = a = 5

assegn. con somma += a += 5 a = a + 5

assegn. con sottrazione -= a -= 5 a = a – 5

assegn. con prodotto *= a *= 5 a = a * 5

assegn. con divisione /= a /= 5 a = a / 5

assegn. con modulo %= a %= 5 a = a % 5

© A.Lioy - Politecnico di Torino (2009-2020) 30

Le stringhe di caratteri particolarmente importanti perché qualunque input fornito

dall'utente tramite browser è una stringa operatori: assegnazione ( = ) confronto in ordine alfabetico ( == != > >= < <= ) concatenazione ( + += )

attenzione! se un'istruzione contiene stringhe, numeri ed il simbolo +, tutto viene trattato come stringhe; si suggerisce perciò l'uso delle parentesi:

ris = "N=" + 5 + 2; // ris = "N=52"ris = "N=" + (5 + 2); // ris = "N=7"ris = "N=" + 5 – 2; // ris = NaN

© A.Lioy - Politecnico di Torino (2009-2020) 31

Conversioni stringhe – numeri (I) Number( oggetto ) restituisce una rappresentazione numerica dell'oggetto o NaN

String( oggetto ) restituisce una rappresentazione come stringa di caratteri

dell'oggetto o undefined o null

n = Number("2"); // n = 2n = Number("2.3"); // n = 2.3n = Number("2,3"); // n = NaNn = Number("2mila"); // n = NaNn = Number("2 mila"); // n = NaN

© A.Lioy - Politecnico di Torino (2009-2020) 32

Conversioni stringhe – numeri (II) parseInt( stringa [ , base ] ) restituisce un numero intero o NaN possibile specificare la base numerica (default: 10)

parseFloat( stringa ) restituisce un numero floating-point o NaN

parseInt e parseFloat considerano solo la parte iniziale, fermandosi al primo carattere non valido

n = parseInt("10",2); // n = 2n = parseInt("2.3"); // n = 2n = parseInt("2,3"); // n = 2n = parseInt("2mila"); // n = 2n = parseInt("duemila"); // n = NaN

© A.Lioy - Politecnico di Torino (2009-2020) 33

Proprietà e metodi dell'oggetto String (I) importanti perché usabili anche su variabili stringa length lunghezza N della stringa (indice da 0 a N-1)

charAt( pos ) il carattere in posizione pos

charCodeAt( pos ) il codice numerico Unicode del carattere in posizione pos

indexOf( searchString [ , start ] ) posizione della stringa cercata (a partire da start o dall'inizio) -1 se la stringa non viene trovata

© A.Lioy - Politecnico di Torino (2009-2020) 34

Proprietà e metodi dell'oggetto String (II) lastindexOf( searchString [ , start ] ) posizione della stringa cercata (a partire da start o dalla fine) -1 se la stringa non viene trovata

slice( begin [ , end ] ) crea una nuova stringa coi caratteri presenti da begin a end

(escluso) oppure alla fine usare end negativo per indicare posizioni dalla fine

substring( begin [ , end ] ) estrae i caratteri da begin a end (o alla fine)

substr( begin [ , length ] ) estrae i caratteri da begin per la quantità length

© A.Lioy - Politecnico di Torino (2009-2020) 35

Proprietà e metodi dell'oggetto String (III) toLowerCase( ) restituisce i caratteri convertiti in minuscolo

toUpperCase( ) restituisce i caratteri convertiti in maiuscolo

© A.Lioy - Politecnico di Torino (2009-2020) 36

Test su valori errati non si può fare un confronto con NaN o altri valori limite, ma

si possono usare funzioni che testano questi casi isFinite( number ) vero se il numero non è pari a +/– infinito o NaN

isNaN( number ) vero se il numero ha il valore NaN

typeof( x ) restituisce una stringa che esprime il tipo di dato attualmente

corrispondente a X risposte possibili: boolean, function, number, object, string,

undefined

© A.Lioy - Politecnico di Torino (2009-2020) 37

Controllo di flusso strutture di controllo utili per eseguire un programma in

modo non sequenziale if if/else while do/while for for/in

© A.Lioy - Politecnico di Torino (2009-2020) 38

Controllo di flusso "if" / "if-else" esecuzione condizionale di istruzioni in base al valore di

una condizione Booleana if if/else

if ( condizione ){... istruzioni}else{... istruzioni}

if ( condizione ){

... istruzioni}

© A.Lioy - Politecnico di Torino (2009-2020) 39

Esempio di costrutto "if-else"

<script type="text/javascript">var t_mis = window.prompt("Temperatura misurata?");if (t_mis <= 0)alert("l’acqua e' ghiacciata");

else if (t_mis >= 100)alert("l’acqua e' vapore");

elsealert("l’acqua e' allo stato liquido");

</script>

acqua2.html

acqua.html

© A.Lioy - Politecnico di Torino (2009-2020) 40

Selezione multipla: l'istruzione "switch" test su tanti possibili valori di un'espressione è una forma abbreviata di cascata di "if-else" "break" per non continuare col caso successivo "default" se non si ricade in nessun caso esplicito

switch ( espressione ){case valore1: ... istruzioni;break;

case valore2: ... istruzioni;break;

...default: ... istruzioni;}

© A.Lioy - Politecnico di Torino (2009-2020) 41

Esempio di costrutto "switch"

<script type="text/javascript">var frutto = window.prompt("Quale frutto vuole?");switch (frutto) {case "pera":alert ("pere a 2 Euro/kg"); break;

case "mela":alert ("mele a 1.5 Euro/kg"); break;

case "banana":alert ("banane a 1 Euro/kg"); break;

default:alert ("spiacenti, non abbiamo "+frutto);

}</script>

© A.Lioy - Politecnico di Torino (2009-2020) 42

Controllo di flusso "while" struttura per ripetere un blocco di istruzioni finché una

condizione è e rimane vera le istruzioni del ciclo possono quindi essere eseguite zero

o più volte

while ( condizione ){... istruzioni

}

© A.Lioy - Politecnico di Torino (2009-2020) 43

Esempio di ciclo "while"

<script type="text/javascript">// conto alla rovesciavar x = 5;while (x >= 0){

alert(x);x--;

}</script>

© A.Lioy - Politecnico di Torino (2009-2020) 44

Controllo di flusso "do-while" struttura simile al while con la differenza che il controllo si

fa alla fine del ciclo e quindi il ciclo viene sempre eseguito almeno una volta

do{... istruzioni

} while ( condizione );

© A.Lioy - Politecnico di Torino (2009-2020) 45

Esempio di ciclo "do-while"

<script>var ris;do {ris = window.prompt("Scrivi 'ciao' o resti bloccato qui");

} while (ris != "ciao");</script>

js_do_while.html

© A.Lioy - Politecnico di Torino (2009-2020) 46

Controllo di flusso "for" struttura per ripetere blocchi di istruzioni finché una

condizione rimane vera specifica:

un’azione di inizializzazione una condizione un’azione da ripetere alla fine di ogni ciclo (tipicamente un

incremento/decremento dell'indice associato al ciclo)

for ( inizializzazione ; condizione; azione_ripetitiva ){... istruzioni_da_ripetere

}

© A.Lioy - Politecnico di Torino (2009-2020) 47

Esempio di ciclo "for" numerico

<script type="text/javascript">/*calcolo della sommadei primi 10 numeri naturali*/var totale = 0;for (var i=1; i <= 10; i++){totale = totale + i;

}alert("Somma dei numeri [1...10] = "+totale);</script>

© A.Lioy - Politecnico di Torino (2009-2020) 48

Istruzioni "break" e "continue" l'istruzione "break" (oltre ad essere usata nello switch)

interrompe l'esecuzione del ciclo in cui è contenuta; l'esecuzione continua dalla prima istruzione successiva al ciclo

l'istruzione "continue" blocca l'esecuzione del passo corrente e fa iniziare immediatamente l'esecuzione del prossimo passo del ciclo in cui è contenuta

© A.Lioy - Politecnico di Torino (2009-2020) 49

Array (vettori) in JS sono oggetti e quindi devono essere istanziati (con

una dimensione iniziale che può essere cambiata dinamicamente)

possono essere indicizzati da un intero o da una stringa (array associativi)

possiedono proprietà e metodi per inserire, cancellare e reperire gli elementi

esempio:

var Vettore = new Array(10);for (var i=0; i<10; i++) {

Vettore[i] = "Test " + i;}

© A.Lioy - Politecnico di Torino (2009-2020) 51

Esempio vettore con indice numerico<script type="text/javascript">

// array per conversione// da voto italiano a voto europeovar it2eu = new Array(32) // 0 ... 30 30Lfor (var i=0; i<18; i++) it2eu[i] = "D"for (var i=18; i<24; i++) it2eu[i] = "C"for (var i=24; i<29; i++) it2eu[i] = "B" for (var i=29; i<=31; i++) it2eu[i] = "A"

var voto = prompt("Voto italiano?")alert("Voto europeo = " + it2eu[voto])

</script> voto.html

© A.Lioy - Politecnico di Torino (2009-2020) 52

Esempio vettore con indice non numerico

<script type="text/javascript">

// vocabolario italiano - inglesevar vocab = new Array()vocab["giallo"] = "yellow"vocab["rosso"] = "red"vocab["verde"] = "green"

var colore = prompt("Colore?")alert( colore + " = " + vocab[colore] )

</script>vocab1.html

© A.Lioy - Politecnico di Torino (2009-2020) 53

Esempio vettore con indice non numerico<script type="text/javascript">

// vocabolario italiano - inglesevar vocab = new Array()vocab["giallo"] = "yellow"vocab["rosso"] = "red"vocab["verde"] = "green"

var colore = prompt("Colore?")if (typeof(vocab[colore]) != "undefined")alert( colore + " = " + vocab[colore] )

elsealert("Spiacente, traduzione non disponibile")

</script>vocab2.html

© A.Lioy - Politecnico di Torino (2009-2020) 54

Controllo di flusso "for-in" scandisce gli elementi di un vettore (senza conoscerne la

dimensione) l'indice assume tutti i valori numerici (0 ... length-1)

scandisce le proprietà di un oggetto (senza conoscere il nome delle proprietà) l'indice assume tutti gli id delle proprietà, nell'ordine in cui

sono dichiarate

for (x in vettore) {// x è un indice... vettore[x] ...

}

for (x in oggetto) {// x è una proprietà... oggetto[x] ...

}

© A.Lioy - Politecnico di Torino (2009-2020) 55

Esempio di "for-in" con vettori

var vettore = new Array(10);

// ciclo esplicito su tutti gli elementifor (var i=0; i<vettore.length(); i++)vettore[i] = "test"+i;

// ciclo esplicito ma piu' efficientefor (var i=0, n=vettore.length(); i<n; i++)vettore[i] += "!";

// ciclo implicito su tutti gli elementifor (var i in vettore)document.writeln(vettore[i]+"<br>");

© A.Lioy - Politecnico di Torino (2009-2020) 56

Esempio di "for-in" con oggetti

var myObject = new Object(); myObject.name = "Antonio"; myObject.age = 24; myObject.phone = "5551234";

...

// ciclo implicito su tutte le proprietàfor (var prop in myObject){ document.writeln("<p>myObject." + prop

+ " = " + myObject[prop] + "</p>"); }

© A.Lioy - Politecnico di Torino (2009-2020) 57

Funzioni le informazioni passate alle funzioni si chiamano parametri i parametri vengono specificati tra parentesi dopo il nome

della funzione tra le istruzioni si può usare "return" per terminare

l'esecuzione della funzione, eventualmente restituendo un valore tramite "return(valore)"

function nome_funzione (par1, par2, ...){... istruzioni ...

}

© A.Lioy - Politecnico di Torino (2009-2020) 58

Esempi di funzioni

function somma (a, b) { return(a+b); }

document.write(somma(1,2));

function minoreDi (a, b) {if (a < b) return (true) else return (false);

}

var a=5;var b=2;if (!minoreDi(a,b))document.write(a + "non e’ minore di " + b);

© A.Lioy - Politecnico di Torino (2009-2020) 59

Variabili locali e globali variabile dichiarata all'interno di una funzione: accessibile solo alle istruzioni nella funzione stessa distrutta automaticamente al termine della funzione

variabile dichiarata all'esterno di qualunque funzione: accessibile a tutte le istruzioni dello script (incluse quelle nelle

funzioni richiamate dallo script) distrutta automaticamente al termine dello script

© A.Lioy - Politecnico di Torino (2009-2020) 60

Variabili locali e globali: esempio<script type="text/javascript">var i=2; // variabile globalefunction print_var(){var j=4; // variabile locale a print_var()alert("print_var(): i=" + i); alert("print_var(): j=" + j);

}print_var();alert("i=" + i); alert("j=" + j);document.writeln("<p>Fine dello script.</p>")

</script><p>Fine della pagina.</p>

glocal.html© A.Lioy - Politecnico di Torino (2009-2020) 61

Funzioni e parametri una funzione può essere richiamata con meno parametri di

quelli definiti i parametri mancanti sono undefined, ma (solo in questo caso)

il loro uso non genera errore hanno un valore non definito che si propaga se usato (es.

genera NaN in un calcolo aritmetico) una funzione può essere richiamata con più parametri di

quelli definiti i parametri in eccesso sono ignorati

una funzione può accedere a tutti i suoi parametri tramite il vettore arguments[ ] che contiene arguments.length valori distinti

© A.Lioy - Politecnico di Torino (2009-2020) 62

Argomenti variabili delle funzioni: esempio<script>function media()// calcola la media aritmetica di tutti// i numeri passati come parametri{var total = 0;var n = arguments.length;for (var i=0; i<n; i++)total += arguments[i];

return (total / n);}// esempio di uso (media di tre numeri)alert( media(11,12,16) );

</script>© A.Lioy - Politecnico di Torino (2009-2020) 63

Oggetti definizione di un oggetto: letterale (graffe contenenti coppie proprietà:valore o

metodo:funzione) tramite un costruttore (funzione che assegna valori alle

proprietà ed ai metodi dell'oggetto "this")

var studente1 = {nome:"Giovanni",cognome:"Pautasso",matricola:12345,mail:function(){return "s"+this.matricola+"@studenti.polito.it";

}}

© A.Lioy - Politecnico di Torino (2009-2020) 64

Oggetti: costruttorefunction Studente (n, c, m) {this.nome = n;this.cognome = c;this.matricola = m;this.mail = function(){return "s"+this.matricola+"@studenti.polito.it"

};}. . .var studente1 = new Studente ("Giovanni", "Pautasso", 12345);

var studente2 = new Studente ("Mario", "Rossi", 12346);

© A.Lioy - Politecnico di Torino (2009-2020) 65

Oggetti: proprietà e prototipi l'accesso alla proprietà avviene tramite notazione puntata o

come se fosse un array studente1.nome studente1[nome]

è possibile aggiungere una proprietà o un metodo agendo direttamente sull'oggetto ma se si vuole farlo sulla classe bisogna agire sulla proprietà "prototype" del costruttore

Studente.prototype.nomeCognome = function (){return this.nome+" "+this.cognome}

document.writeln(studente1.nomeCognome())document.writeln(studente2.nomeCognome())

js_obj_prototype.html

© A.Lioy - Politecnico di Torino (2009-2020) 66

Oggetti: accesso by reference oggetti acceduti by-reference, non by-value occhio quindi alle operazioni di assegnazione perché non

creano una copia ma un puntatore all'originale

var studente1 = new Studente ("Giovanni", "Pautasso", 12345);

// così non si crea una copia ma un riferimentovar studente2 = studente1;// queste istruzioni modificano anche studente1studente2.nome = "Mario";studente2.cognome = "Rossi";studente2.matricola = 12346;

js_obj_byRef.html

© A.Lioy - Politecnico di Torino (2009-2020) 67

Oggetti: richiamo di un metodo ricordarsi sempre le parentesi tonde (anche se il metodo non

richiede parametri) … altrimenti non si richiama il metodo ma la sua definizione

(!)

var studente1 = new Studente ("Giovanni", "Pautasso", 12345);

// stampo la maildocument.writeln("mail: "+studente1.mail())

// stampo la definizione del metodo mail (!)document.writeln("mail: "+studente1.mail)

js_obj_method.html

© A.Lioy - Politecnico di Torino (2009-2020) 68

L'oggetto Date new Date( ) data e ora attuale (sul sistema che esegue lo script)

new Date("Month day, year [ HH:MM:SS ]") data e ora indicata (es. "March 25, 2009 22:00:07")

new Date(YYYY, MM, DD [ , HH, MM, SS ] ) data e ora indicata (es. 2009, 2, 25, 22, 00, 07) numero del mese: 0=Gennaio, 11=Dicembre

se HH, MM o SS sono omessi allora sono zero attenzione! la rappresentazione della data come stringa

dipende dal S.O. su cui è eseguito lo script meglio quindi impostare individualmente i valori delle proprietà

(con setDay(), setHour(), ...)

© A.Lioy - Politecnico di Torino (2009-2020) 69

L'oggetto Date: metodi (I) getDay( ) / setDay( giorno_settimana ) giorno della settimana (0=Domenica, 6=Sabato)

getDate( ) / setDate( giorno_mese ) getMonth( ) / setMonth ( mese_num ) numero del mese (0=Gennaio, 11=Dicembre)

getFullYear( ) / setFullYear ( anno ) getHours( ) / setHours ( ora ) getMinutes( ) / setMinutes( minuti ) getSeconds( ) / setSeconds( secondi ) disponibili tutti questi metodi riferiti a UTC: getUTC...( ) / setUTC...( )

© A.Lioy - Politecnico di Torino (2009-2020) 70

L'oggetto Date: metodi (II) toString( ) converte in stringa secondo il formato nativo di JS (ossia

anglosassone) toLocaleString( ) converte in stringa secondo il formato locale impostato per

l'utenza che esegue lo script

© A.Lioy - Politecnico di Torino (2009-2020) 71

L'oggetto Math – proprietà proprietà statiche (da richiedere sull'oggetto Math): E, costante di Eulero (circa 2.718) LN2, ln(2) (circa 0.693) LN10, ln(10) (circa 2.302) LOG2E, log2(e) (circa 1.442) LOG10E, log10(e) (circa 0.434) PI, pi greco (circa 3.14159) SQRT1_2, radice quadrata di 1/2 (circa 0.707) SQRT2, radice quadrata di 2 (circa 1.414)

© A.Lioy - Politecnico di Torino (2009-2020) 72

L'oggetto Math – metodi metodi statici (da invocarsi sull'oggetto Math)

metodo definizioneabs(x) valore assolutoasin(x) acos(x) atan(x)

atan2(y,x) atan ( y / x )sin(x) cos(x) tan(x)

ceil(x) floor(x) ceiling, floorexp(x) pow(x,y) sqrt(x) ex xy xlog(x) ln(x)round(x) arrotondamentomax(x,y) min(x,y)

random(seed) valore casuale [0...1[

© A.Lioy - Politecnico di Torino (2009-2020) 73

L'oggetto Number – proprietà rappresenta tutti i numeri (interi e floating-point) proprietà statiche (da richiedere sull'oggetto Number): MAX_VALUE MIN_VALUE NaN NEGATIVE_INFINITY (overflow negativo) POSITIVE_INFINITY (overflow positivo)

© A.Lioy - Politecnico di Torino (2009-2020) 74

L'oggetto Number – metodi tofixed( num_cifre_frazionarie ) converte in formato non esponenziale

toexponential( num_cifre_frazionarie ) converte in formato esponenziale

toprecision( num_cifre_significative ) converte alla precisione indicata (eventualmente usando il

formato esponenziale se necessario) tutti questi metodi arrotondano il risultato se il numero di

partenza ha più cifre del necessario:

var num=5.126alert(num.toprecision(3)) // visualizza 5.13alert(num.toprecision(2)) // visualizza 5.1

© A.Lioy - Politecnico di Torino (2009-2020) 75

Interazione tra JS e HTML l’interazione tra JS client-side, lo UA e la pagina HTML è

definita da un’apposita appendice del DOM es. appendice E del DOM livello 1:

The HTMLDocument object has the following methods:. . .write(text)

This method returns a void.The text parameter is of type DOMString.

getElementById(elementId)This method returns a Element.The elementId parameter is of type DOMString.

getElementsByName(elementName)This method returns a NodeList.The elementName parameter is of type DOMString.

© A.Lioy - Politecnico di Torino (2009-2020) 76

JS e DOM JS può alterare gli oggetti del DOM alcuni esempi di proprietà: innerHTML il contenuto HTML

attribute_name il valore dell'attributo specificato

style . CSS_property il valore della proprietà CSS specificata

© A.Lioy - Politecnico di Torino (2009-2020) 77

Esempio di innerHTML (I)<!DOCTYPE html><html><head><meta charset="utf-8"><title>Esempio JS / innerHTML</title><script type="text/javascript">

state = "N";function change(x) {

m = document.getElementById(x);if (state == "N") {

state = "P"; m.innerHTML = "Buona Pasqua!";} else {

state = "N"; m.innerHTML = "Buon Natale!";}

}</script></head>

© A.Lioy - Politecnico di Torino (2009-2020) 78

Esempio di innerHTML (II)<body>

<p id="message">Buon Natale!</p>

<p>P.S. Fai click<span onclick="change('message')">QUI</span>per cambiare il messaggio di auguri.</p>

</body></html>

pana_color.html

pana.html

© A.Lioy - Politecnico di Torino (2009-2020) 79

Nuove API in HTML5 da usarsi con script client-side (es. Javascript) HTML Geolocation HTML Drag and Drop HTML Local Storage rimpiazzo per i cookie

HTML Application Cache file salvati in locale per usare pagina anche off-line

HTML Web Workers script client-side che eseguono in background

HTML SSE (Server-Sent Events) eventi mandati dal server verso la pagina web

© A.Lioy - Politecnico di Torino (2009-2020) 80

JQuery una libreria per facilitare l'interazione tra JS e DOM manipolazione di HTML, DOM e CSS azioni associate ad eventi HTML vari effetti ed animazioni AJAX

funziona su TUTTI i browser (nascondendone le differenze) usata dalla maggioranza dei siti più importanti (es. Google,

Microsoft, IBM, Netflix, …) tutorial: http://www.w3schools.com/jquery/

© A.Lioy - Politecnico di Torino (2009-2020) 81

Sintassi JQuery formato dell'istruzione base

$( selector ) . action( ) $ introduce un'istruzione JQuery il selettore usa la sintassi CSS per selezionare le parti di

DOM sui cui agire action è l'azione da svolgere sulle parti selezionate esempi:

$(this).hide() // nasconde l'elemento corrente

$("p").hide() // nasconde tutti i paragrafi

$(".bad").hide() // nasconde elementi class=bad

$("#bad").hide() // nasconde elemento id=bad

© A.Lioy - Politecnico di Torino (2009-2020) 82

JQuery CDN la libreria può essere fornita dal server web stesso … o molto meglio da una CDN: (Google) <script type="text/javascript"

src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

(MS) <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.2.min.js"></script>

vantaggi: il client potrebbe averla già in cache server della CDN più "vicino" al client

© A.Lioy - Politecnico di Torino (2009-2020) 85