45
Programmare in javaScript JavaScript è linguaggio di scripting orientato ad oggetti è un tipo di codice che viene interpretato dai browser. Questo linguaggio viene definito appunto un linguaggio lato client, perchè viene scaricato ed avviato direttamente sul browser che interpreta il linguaggio, questo è un vantaggio perchè evita al server di fare del lavoro in più. Per inserire javascript in una pagina html si devono usare i tag <script>, li si possono posizionare in qualsiasi punto della pagina sia dentro <head> che dentro <body>, comunque è sempre meglio inserire javascript nella <head> in un file esterno. Esempio di dichiarazione: <!-- se si vuole inserire del codice javascript in un documento con doctype xhtml bisogna purtroppo usare del codice in più --> <script type="text/javascript"> <!--//--><![CDATA[//><!-- istruzione1; istruzione2; //--><!]]> </script> <!-- questa sotto invece è la versione "normale" --> <script type="text/javascript"> istruzione1; istruzione2; //questo è un commento quando finisce questa riga finisce anche il commento /* anche questo è un commento ma non finisce a fine riga, ma solo alla chiusare dei simboli alla mia destra */ </script> <!-- javascript presente in un file esterno --> <script type="text/javascript" scr="js/mind.js"></script> Per indicare la fine di ogni istruzione si usa il punto virgola ";". Come abbiamo appena visto si possono richiamare file javascript esterni, questo ci permette di prendere del codice scritto da altri ed usarlo come preferiamo. Così alcuni si sono occupati di creare delle librerie o anche dette framework javascript che contengono degli script già pronti all'uso, man mano in questa guida offriremo alcuni esempi utili: 1. jQuery 2. Prototype 3. script.aculo.us 4. Dojo 5. MooTools 6. YUI Library Variabili Una variabile si definisce con la parola riservata var. Una volta definita la si può richiamare semplicemente utilizzando il nome della variabile.

Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

  • Upload
    trananh

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Programmare in javaScriptJavaScript è linguaggio di scripting orientato ad oggetti è un tipo di codice che viene interpretato dai browser. Questo linguaggio viene definito appunto un linguaggio lato client, perchè viene scaricato ed avviato direttamente sul browser che interpreta il linguaggio, questo è un vantaggio perchè evita al server di fare del lavoro in più. Per inserire javascript in una pagina html si devono usare i tag <script>, li si possono posizionare in qualsiasi punto della pagina sia dentro <head> che dentro <body>, comunque è sempre meglio inserire javascript nella <head> in un file esterno.

Esempio di dichiarazione:

<!-- se si vuole inserire del codice javascript in un documento con doctype xhtml bisogna purtroppo usare del codice in più --><script type="text/javascript"> <!--//--><![CDATA[//><!-- istruzione1; istruzione2; //--><!]]></script>

<!-- questa sotto invece è la versione "normale" --><script type="text/javascript"> istruzione1; istruzione2; //questo è un commento quando finisce questa riga finisce anche il commento /* anche questo è un commento ma non finisce a fine riga, ma solo alla chiusare dei simboli alla mia destra */</script>

<!-- javascript presente in un file esterno --><script type="text/javascript" scr="js/mind.js"></script>

Per indicare la fine di ogni istruzione si usa il punto virgola ";". Come abbiamo appena visto si possono richiamare file javascript esterni, questo ci permette di prendere del codice scritto da altri ed usarlo come preferiamo. Così alcuni si sono occupati di creare delle librerie o anche dette framework javascript che contengono degli script già pronti all'uso, man mano in questa guida offriremo alcuni esempi utili:

1. jQuery 2. Prototype 3. script.aculo.us 4. Dojo 5. MooTools 6. YUI Library

Variabili

Una variabile si definisce con la parola riservata var. Una volta definita la si può richiamare semplicemente utilizzando il nome della variabile.

Page 2: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Clicca Qui per eseguire il codice.

var nome = 'matteo';alert(nome);

Nell'esempio precedente abbiamo usato una funzione nativa di javaScript, che usava la variabile nome come argomento. L'argomento serve per passare dati ad una funzione, in questo caso il popupche apre, contiene i dati della variabile passati nell'argomento.Le variabili in javascript possono contenere differenti tipi di dati:

1. Numeri 2. Stringhe 3. Valori booleani 4. Array 5. Oggetti

Numeri

JavaScript può memorizzare numeri interi, decimali che siano sia positivi che negativi, è scontato dire inoltre che javaScript può usare gli operatori matematichi (+,-,*,/)

1. Numeri

var intero = 3;var decimale = 3.1454521;var intNegativo = -3;var floatNegativo = -3.1454521;var operazioniMatematiche = (4 + 2) * 6 / 10;

Una comoda funzionalità di javaScript è la possibilità di usare il valore corrente di una variabile perdescrivere il nuovo valore da asseganre alla variabile.

Clicca Qui per eseguire il codice.

var anni = 20;anni = anni + 3;

Incrementare una variabile è un azione comune in javaScript, infatti il codice precedente può essere abbreviato in questa maniera:

Clicca Qui per eseguire il codice.

var anni = 20;anni += 3;

Mnetre se si deve incrementare di un'unità ci viene in aiuto un'altra forma:

Clicca Qui per eseguire il codice.

var anni = 20;anni++;

L'operatore speciale ++, chiede al programma di incrementare di un'unità il valore della variabile e poi di assegnare il risultato al calcolo sempre alla stessa variabile. Nell'esempio seguente vedremo che in questo caso sarebbe meglio usare un'altra abbreviazione, ovvero var anniCopia = ++anni; se avviamo il codice vedremo come il risultato che esce è 26 e non 27, questo succede perchè la lettura viene fatta prima dell'incremento, per sviare questo problema bisogna appunto incrementareprima con ++anni, è buona norma però dividere questi due processi, scrivendo prima un'istruzione di incremento anni++; e poi assegnare il valore alla variabile var anniCopia = anni;.

Clicca Qui per eseguire il codice.

Page 3: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

var anni = 26;var anniCopia = anni++;

javaScript mette a disposizione alcune funzioni native come alert, ce ne sono alcune che lavorano sui dati numerici vediamole in ordine: parseInt(string, radix) analizza una stringa restituendo un numero intero senza stringhe e lo visualizza ignorando le parti decimali e l'eventuale virgola, è possibile aggiungere anche un secondo argomento facoltativo che può fare da base numerica. parseFloat(string) fa lo stesso lavoro di parseInt solo che conserva la virgola e i numeri decimali. La funzione is Not a Number, isNaN(string) restituisce un valore boleano a seconda della stringa che viene passata come argomento. Se il dato passato può essere elaborato restituisce false se è un dato che non può essere rielaborato come numero esce true.

Clicca Qui per eseguire il codice.

var pi = parseInt("111.5545word");var pf = parseFloat("111.5545word");var isN = isNaN("111.5545word");

Le stringhe

Le stringhe sono dati costituiti da caratteri di qualsiasi lunghezza e possono essere lettere, numeri, simboli, segni di punteggiatura o spazi, per devinirne una basta inserire i caratteri all'interno delle virgolette e possono essere sia doppie "" che semplici ''.

2. Stringhe

var semplici = 'Solo apici semplici';var doppi = "Solo apici doppi";var numeriFolli = "18 num3r1 f0ll1";var stranaPunteggiatura = '$7r@n@ pun7&99!@tur#@'

Le virgolette fungono da delimitatori, infatti non verranno utilizzate come dato, se vogliamo invece includerle si può ricorrere alla tecnica chiamata escape che consiste nel far precedere alle virgolette un segno di backslash / vediamo un esempio:

Clicca Qui per eseguire il codice.

var anni = 'le virgolette ai lati non si vedono ma quelle con \"l\'escape\" sì';

Valori booleani

I valori booleani comprendono solo due parole riservate che sono: true e false. Questo tipo di dato viene utilizzato principalmente per prendere decisioni.

3. Valori booleani

var bugiardo = true;var sincero = false;

Array

I numeri, le stringhe e i valori booleani sono utili per memorizzare singoli frammenti di dati, gli array si occupano di gestire questi dati, dandone un ordine preciso in modod che siano facilmente recuperabili. Un array è come una specie di casellario e per definirlo usaimo le parentesi quadre.

Page 4: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

4. Array

var casellario = [];casellario[0] = "Primo";casellario[1] = "Secondo";

Nell'esempio precedente abbiamo definito un array. Nela prima riga viene definito un array vuoto, in quelle successive vengono inserite degli elementi all'array "casellario", ogni posizione dell'array come si può vedere gli viene attribuito un indice, utile per poter recuperare i dati. Infatti è possibile aprire una finestra di dialogo in questo modo:

Clicca Qui per eseguire il codice.

var casellario = [];casellario[0] = "Primo";casellario[1] = "Secondo";

alert(casellario[1]);

Un'array lo si può definire anche inserendo subito gli elementi nella dichiarazione, inoltre possono contenere qualsiasi tipo di dato, stringhe, numeri, misti e pure altri array:

Array tipi di dati contenuti

var arrayDiStringhe = ["Primo", "Secondo", "Terzo", "Quarto"];var arrayNumerico = [1, 2, 3, 4, 5];var arrayMisto = ["via", "garibaldi", 12]

var subArray1 = ["Parigi","Lione","Nizza"];var subArray2 = ["Amstardam","Rotterdam","Utrecht"];var subArray3 = ["Madrid","Barcellona","Siviglia"];

var superArray = [subArray1, subArray2, subArray3];

Per prendere un elemento in array multi-dimensionale bisogna scrivere due indici il primo indice prende l'array che ci interessa, il secondo, l'elemento con l'indice contenuto nell'array scelto.

Clicca Qui per eseguire il codice.

var subArray1 = ["Parigi","Lione","Nizza"];var subArray2 = ["Amstardam","Rotterdam","Utrecht"];var subArray3 = ["Madrid","Barcellona","Siviglia"];var superArray = [subArray1, subArray2, subArray3];

var luogo = superArray[0][2];

Una proprietà che vi tornerà utile per questi tipi di elementi è la proprietà .length che definisce la lunghezza, per esempio se vogliamo sapere quanti elementi contiene un array con questa proprietà èpossibile scoprirlo:

Clicca Qui per eseguire il codice.

var subArray1 = ["Parigi","Lione","Nizza", "Quarto"];var subArray2 = ["Amstardam","Rotterdam","Utrecht"];var subArray3 = ["Madrid","Barcellona","Siviglia"];var superArray = [subArray1, subArray2, subArray3];

var numeroElementi = superArray[0].length;

Uno degl'ultimi tipi di Array è l'array associativo, quello che cambia dagl'altri è l'indice, che viene sostituito da una stringa che può essere utile per esempio per memorizzare i codici postali:

Page 5: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Clicca Qui per eseguire il codice.

var codAvvPost = [];codAvvPost["Armadale"] = 3143;codAvvPost["North Melbourne"] = 3051;codAvvPost["Camperdown"] = 2050;codAvvPost["Annandale"] = 2038;

alert("codice postale Armadale: " + codAvvPost["Armadale"]);

Prima di affrontare gli "oggetti" dobbiamo imparare ancora strutture di javaScript se no non riusciremmo a comprendere il significato di quest'ultimo.

Condizioni cicliche: controllare il flusso del programma

Per prendere decisioni occorre utilizzare particolari strutture chiamate condizioni e cicli che aiutanoa controllare le parti di un programma. La prima istruzione condizionale che andremo a trattare si chiama if per definirla serve inserire una condizione ed un codice che verrrà utilizzato nel caso la condizione è vera, la sintassi che si utilizza è la seguente:

Istruzione if

Istruzione if

if (condizione) { codice condizionale;}

Nel caso la condizione è falsa il programma va avanti ignorando il codice condizionale. Ora analizziamo le condizioni che si possono utilizzare, quelle che vengono più spesso utilizzate sono quelle di confronto, che utilizzano i seguenti operatori:

Operatore Esempio Risultato> A > B true se A è maggiore di B>= A >= B true se A è maggiore o uguale di B< A < B true se A è minore di B< A <= B true se A è minore o uguale di B< A == B true se A è uguale di B< A != B true se A non è uguale di B< !A true se il valore booleani di A è falseDopo aver visto gli operatori di confronto passiamo agli operatori logici AND (&&) e OR (||), questi operatori possono essere utilizzati per combinare insieme più test condizionali, AND richiedeche tutte le condizioni siano vere mentre OR si accontenta che sia vera almeno una codinzione.

Clicca Qui per eseguire il codice.

var anni = 27;if (anni > 17 && < 29) { alert("la condizione è verificata");}

Istruzione else ed else if

Le condizioni if dispongono solo di un codice nel caso la condizione sia verificata, se invece non si verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco

Page 6: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

proponendo un codice condizionale nel caso la condizione non sia vera

if e else

if (condizione) { codice condizionale;}else { codice condizionale alternativo;}

In questo modo abbiamo un codice sia per quando è vera sia per quando è falsa. Ma se vogliamo aggiungere un'altra condizione ad applicargli un'altro codice da eseguire useremo un'altro sistema ovvero else if. Come si può vedere questa istruzione può avere delle parentesi tonde dove si devinisce una nuova condizione e si possono creare tante else if quante se ne vogliono sempre lasciandole tra l'istruzione "if" e l'istruzione "else"

else if

if (condizione) { codice condizionale;}else if (condizione) { codice condizionale alternativo;}else { codice condizionale alternativo;}

Cicli while

I cicli sono istruzioni che ripetono il codice fintanto che la loro condizione è vera, while si compartain questo modo

ciclo while

while (condizione) { codice condizionale;}

I cicli sono utili quando si vogliono eseminare tutti gli elementi di un array e si vogliono applicare delle modifiche, usando una variabile che farà da contatore, ad ogni ciclo dell'istruzione si incrementerà quella variabile fino a quando la condizione resistuirà false, proprio perchè la condizione impostata definisce che la condizione è vera finchè il numero contatore è minore al numero degli elementi nell'array.

ciclo while

var numeri = [1, 2, 3, 4, 5];var contatore = 0;while (contatore < numeri.length) { numeri[contatore] *= 2; contatore++;}

Cicli do-while

Un ciclo do-while si comporta in modo simile al ciclo while, l'unica differenza sta nell'eseguire prima il codice condizionale e dopo controllare la condizione, questo permette di eseguire almeno una volta il codice anche se la condizione risulta falsa

Page 7: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

ciclo do-while

do { codice condizionale;}while (condizionale)

Cicli for

I cicli for permettono di realizzare costrutti molto compatti. Prendiamo ad esempio un ciclio while, il ciclo for rende più sintetico due aspetti, la dichiarazione della variabile contatore (var i = 0;) e l'incremento della variabile contatore (i++). Nel ciclo for vengono devinite contemporaneamente treistruzionioltre alle due già citate c'è anche la condizione che ci permette di uscire dal ciclo quando la condizione viene restituita come falsa.

confronto ciclo do-while con ciclo for

//Arrayvar numeri = [1, 2, 3, 4, 5];

//ciclo do-whilevar i = 0;while (i < numeri.length) { numeri[i] *= 2; i++;}

//ciclo forfor(var i = 0; i < numeri.length; i++) { numeri[i] *= 2;}

Switch

L'istruzione switch è come una combinazione di tante if. Si inserisce nella parentesi condizionale una variabile, che può avere diversi valori, mentre nelle graffe si distinguono i vari casi con l'istruzione case ed infine si definisce default che è paragonabile all'istruzione else.

Scrivi e per eseguire il codice.

var value = form1.text.value;switch (value){ case "a": alert("hai inserito a"); break

case "b": alert("hai inserito b"); break

case "c": alert("hai inserito c"); break

default: alert("non hai inserito ne a, ne b, ne c"); break}

Page 8: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Espressioni regolari

Le espressioni regolari sono un potente strumento di analisi delle stringhe, si compongono di semplici caratteri come questo /abc/ o in combinazione a semplici e speciali caratteri come questi /ab*c/ o /Chapter(\d+)\.\d*/. Questo linguaggio è possibile utilizzarlo in combinazione con altre funzioni come split(), replace(), search() e match() rispettivamente si occupano di dividere, sostituire, trovare la posizione e memorizzare. Un metodo molto comune è anche la funzione test() utilizzata spesso nelle istruzioni condizionali. Ci sono due modi per creare un espressione regolare il primo utilizzando l'oggetto RegExp l'altro è utilizzare il simbolo slash "/" per racchiudere l'espressione.

Espressione regolare

var pattern1 = new RegExp ("Espressione regolare", "parametri");

var pattern2 = /Espressione regolare/parametri;

La parte dove c'è scritto parametri è un parte opzionale dove è possibile inserire alcune lettere:

Pattern Modifiers

Carattere Descrizione

gindica un abbinamento globale (ovvero verranno abbinate tutte le istanze che corrispondono all'espressione regolare e non solo la prima).

ila ricerca diventa case-insensitive, cioè maiuscole e minuscole vengono considerate uguali.

mle ricerca verrà considerate "per riga", cioè le ancore tipo "^" e "$" verranno applicate per ogni riga di testo.

sil testo viene considerato un'unica riga e "." ora identifica anche i caratteri di fine riga, che normalmente non troverebbe.

u vengono abilitati i caratteri Unicode estes, come \x{10FFFFF}.

U

attiva l'opzione ungreedy (Quasi tutti inciampano prima o poi in questo problema: se utilizzo una espressione del tipo /".*"/ troverò tutte le parole racchiuse tra doppi apici?Purtroppo no! Questo perché i quantificatori normali sono "golosi" (in inglese greedy),cioè cercano l'occorrenza il più grande possibile.) a tutti i quantificatori.

Ora però passiamo alla sintassi, come dicevamo l'espressione regolare è uno strumento usato per le stringhe si potrebbe creare una espressione regolare senza alcun carattere speciale come /javascript/ però il suo uso sarebbe parecchio limitato perchè abbinerà solo le stringhe "javascript".Per rendere più intelligente la ricerca utilizziamo dei caratteri che rendono la ricerca più intelligente. I primi caratteri che presenteremo sono quelli di ripetizione, si occupano di quante volte si ripete il termine che li precede:

Quantifiers

Carattere Descrizione Esempio* 0 o più /s*/ sssstringa osso o osso sssstringa+ 1 o più /s+/ sssstringa osso o osso sssstringa? 0 o 1 /s?/ sssstringa osso o osso sssstringa{3} esattamente 3 /s{3}/ sssstringa osso o osso sssstringa{3,} 3 o più /s{3,}/ sssstringa osso o osso sssstringa{1,3} 1, 2 o 3 /s{1,3}/ sssstringa osso o osso sssstringa*? 0 o più, ungreedy /s*?/ sssstringa osso o osso sssstringa

Page 9: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Carattere Descrizione Esempio+? 1 o più, ungreedy /s+?/ sssstringa osso o osso sssstringa?? 0 o 1, ungreedy /s??/ sssstringa osso o osso sssstringa{3,5}? 3, 4 o 5, ungreedy /s{3,5}?/ sssstringa osso o osso sssstringa

I prossimi che presenteremo si chiamano caratteri di posizione o anche chiamate Anchors, che nonspecificano un particolare tipo di caratteri, bensì una particolare posizione nella stringa:

Anchors

Carattere Descrizione Esempio^ Inizio linea /^str/ stringa$ Fine linea /nga$/ stringa\A Inizio della stringa /\Astr/ stringa\Z Fine della stringa /nga\Z/ stringa\b confine di parola /\bs/ volpe stringa osso\B non confine di parola /\B/s/ volpe stringa osso\< inizio parola /\</ N.D.\> fine parola /\>/ N.D.Ora vedremo le classi di caratteri, che definiscono gruppi di tipi come le lettere, le cifre gli spazi.

Character Classes

Carattere Descrizione Esempio\c control character /\cstr/ stringa\s spazio /nga\s/ stringa\S nessuno spazi /\Sstr/ stringa\d cifre /nga\d/ stringa\D nessuna cifra /\Ds/ volpe stringa osso\w lettere /\B/s/ volpe stringa osso\W Nessuna lettera (non abbina a, 1, _ ) /\W/ volpe stringa osso?\xhh carattere esadecimale hh /\xhh/ N.D.\Oxxx carattere ottale xxx /\Oxxx/ N.D.I caratteri speciali sono tutti quei segni come il tab, il ritorno a capo ecc.

Special Characters

Carattere Descrizione Esempio\ Escape Character /\\/ strin\ga\n nuova linea /\n/ N.D.\r ritorno a capo /\A/ N.D.\t tab /\r/ N.D.\v tab verticale /\v/ N.D.\f form feed /\f/ N.D.\a alarm /\a/ N.D.[\b] backspace /[\b]/ N.D.\e escape /\e/ N.D.

Page 10: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Carattere Descrizione Esempio\N{name} nome carattere /\N{name}/ N.D.

Classe dei caratteri Posix definiscono altri tipi di caratteri alcuni sono complementari alle classi di caratteri visti precedentemente.

Posix Character Classes

Carattere Descrizione Esempio[:upper:] lettere maiuscole /[:upper:]/ N.D.[:lower:] lettere minuscole /[:lower:]/ N.D.[:alpha:] tutte le lettere /[:alpha:]/ N.D.[:alnum:] caratteri alfanumerici /[:alnum:]/ N.D.[:digit:] caratteri numerici /[:digit:]/ N.D.[:xdigit:] cifre esadecimali /[:xdigit:]/ N.D.[:punct:] punteggiatura /[:punct:]/ N.D.[:blank:] spazi e tab /[:blank:]/ N.D.[:cntrl:] control character /[:cntrl:]/ N.D.[:graph:] printed characters /[:graph:]/ N.D.[:word:] cifre, lettere ed underscore /[:word:]/ N.D.

I caratteri Range sono utilizzati per raggruppano o escludere gruppi di caratteri.

Range

Carattere Descrizione Esempio. qualsiasi carattere eccetto le rughe nuove (\n) /./ N.D.(a|b) a oppure b /(a|b)/ N.D.(...) le parentesi tonde identificano dei gruppi di caratteri /(...)/ N.D.[abc] raggruppa i termini che si possono accettare /[abc]/ N.D.[^abc] raggruppa i termini che non si possono accettare /[^abc]/ N.D.[a-q] raggruppa i termini che si possono accettare dalla a alla q /[a-q]/ N.D.

[A-Q]raggruppa i termini maiuscoli che si possono accettare dalla A alla Q

/[A-Q]/ N.D.

[0-7] spazi e tab /[0-7]/ N.D.\n nth group/subpattern /\n/ N.D.

Stringhe di sostituzione

String Replacement (Backreferences)

Carattere Descrizione Esempio$n nth non-passive group /$n/ N.D.$2 "xyz" in /^(abc(xyz))$/ /$2/ N.D.

$1"xyz" in /^(?:abc)(xyz)$/

/$1/ N.D.

$ Before matched string /$/ N.D.

Page 11: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Carattere Descrizione Esempio$' After matched string /$'/ N.D.$+ Last matched string /$+/ N.D.$& Entire matched string /$&/ N.D.$_ Entire input string /$/ N.D.$$ Literal "$" /$$/ N.D.

Un'asserzione è un predicato presente in un programma che indica che il predicato sia sempre vero.

Assertions

Carattere Descrizione Esempio?= lookahead assertion /?=/ N.D.?! Negative lookahead /?!/ N.D.?<= Lookbehind assertion /?<=/ N.D.?!= o ?<! Negative Lookbehind /?!=/ N.D.?> Once-only Subexpression /?>/ N.D.?() Condizione [se poi] /?()/ N.D.?()| Condizione [se poi altrimenti] /?()|/ N.D.?# commenti /?#/ N.D.\n control character /\n/ N.D.

Pattern Test

/

Le funzioni

Tutto il codice finora scritto, viene eseguito dall'inizio alla fine e poi termina, senza più essere utilizzato, certe volte però serve avere delle istruzioni che dobbiamo utilizzare più volte e che vogliamo richiamare in un secondo momento, le funzioni si occupano di questo, raccolgono delle istruzioni che possono essere richiamate anche più tardi. Vediamo come definire e richiamare una funzione:

Clicca Qui per eseguire il codice.

//definire una funzionefunction attenzione(testo) { testo += ' e poi viene aggiunto altro testo.'; alert(testo);}

//richiamare una funzioneattenzione("viene passato l'argomento");

Come abbiamo già avuto modo di vedere all'interno delle tonde possiamo inserire degli argomenti che vengono utilizzati come variabili all'interno della funzione, prima per esempio abbiamo richiamato la funzione in questo modo attenzione("viene passato l'argomento"); in questo caso l'argomento utilizzato è una stringa "viene passato l'argomento" questo dato viene utilizzato e

Page 12: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

sostituito alla parola "testo", la parola in questo caso "testo" è fondamentale perchè se non si definisce la possibilità di passare un argomento, non li si può utilizzare. Prima di passare al prossimo argomento bisogna mostrare una versiona alternativa della definizione delle funzioni, in questo caso la dichiarazione assomiglia molto all'assegnamento di valore di una variabile; importante ricordarsi di mettere il punto e virgola quando finisce la funzione, cosa che non è richiesta nel primo caso. Questi due stili di codici presentano anche un importante differenza, la prima forma sintattica può essere utilizzata in tutto il codice presente nel file, anche in quello che si trova prima della dichiarazione della funzione. Una funzione dichiarata con la seconda sintassi può essere utilizzata solo dal codice che viene eseguito dopo l'istruzione di assegnamento che dichiara la funzione. Se il codice è ben strutturato questa differenza non si dovrebbe notare:

Clicca Qui per eseguire il codice.

//definire una funzionevar attenzione = function(testo) { testo += ' e poi viene aggiunto altro testo.'; alert(testo);};

//richiamare una funzioneattenzione("viene passato l'argomento");

Array Arguments

è possibile trattare gli argomenti di una funzione come fossero degli elementi di un array, nel prossimo esempio vediamo come con la parola riservata arguments e l'indice [0] possiamo accedere agli argomenti che vengono passati alla funzione.

Clicca Qui per eseguire il codice.

function dibattito() { var primoArgomento = arguments[0]; var secondoArgomento = arguments[1]; alert("arguments: (\"" + primoArgomento + ", " + secondoArgomento + "\")");}

dibattito("affermativo", "negativo");

L'istruzione Return

Fino adesso abbiamo usato le funzioni per far comparire subito il nostro risultato, una finestra con dentro l'elaborazioni delle nostre istruzioni. Ma di solito un programma utilizza più funzioni, le quali svolgono ognuna un compito preciso, quindi per esempio potremmo avere la funzione che calcola le mele, una le pere ed un'altra che gestisce al suo interno queste due funzioni ottenendo il totale dei prodotti in magazzino. Le funzioni purtroppo gestiscono i loro dati solo all'interno della funzione quindi per far passare dei dati ad altre funzioni si utilizza l'istruzione return vediamo in che modo:

Clicca Qui per eseguire il codice.

function mele () { var meleGialle = 5; var meleRosse = 5; return meleGialle + meleRosse;}

function pere () {

Page 13: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

var pereScure = 10; var pereChiare = 10; return pereScure + pereChiare;}

function totale() { var totaleMagazzino = mele() + pere(); alert("totale delle merci: " + totaleMagazzino);}

totale();

Come avete potuto notare vengono definite tre fuzioni ed infine viene avviata la funzione totale che si occupa di gestire i totali di mele e pere, quando sono state inserite le funzioni sono diventate accessibili i risultati delle funzioni mele e pere, questo grazie all'istruzione return, inoltre bisogna sapere che tutto quello che si trova dopo return non viene considerato dalla funzione.

La visibilità

Fino adesso abbiamo definito le variabili sul piano più esterno, esse ottengono una visibilità globale, questo significa che possono essere utilizzate da tutto il codice javaScript. Questo può essere fastidioso quando abbiamo una variabile esterna uguale ad una variabile definta all'interno di una funzione, per evitare che la variabile presente nella funzione vada a modificare la variabile globale basta aggiungere la parola riservata var in modo da farla esistere localmente solo dentro allafunzione. Nel prossimo esempio dimostriamo che senza la parola var alla variabile dichiarata nella funzione si va a modificare il valore della variabile presente all'esterno della funzione.

Clicca Qui per eseguire il codice.

var a = 100;var b = 100;function fnA() { var a = 200; b = 200; //modifica la variabile globale alert("function a: " + a + "\nfunction b: " + b);}fnA();

alert("global a: " + a + "\n gloabal b: " + b);

Gli oggetti

Dopo aver parlato meglio di variabili e di funzioni, possiamo passare agli oggetti che non sono nient'altro che elementi "amorfi". Gli oggetti offrono un meccanismo di raggruppamento che contiene proprietà e metodi. Le proprietà sono variabili accessibili solo attraverso l'oggetto, mentre i metodi sono funzioni accessibili solo attraverso l'oggetto. Il prossimo esempio mostra come definirli, si inizia con la prima riga "var Robot = new Object();" dove creiamo un nuovo oggetto vuoto, in alternativa a questa dichiarazione si può usare anche la versione più compatta var Robot = {}; che ha la stesso valenza del primo. Con questo metodo non siamo rinchiusi all'interno delle parentesi graffe e così possiamo assegnare un metodo o una proprietà dell'oggetto in qualsiasi posizione a patto che si trovi dopo la dichiarazione dell'oggetto. Nella seconda riga vediamo l'operazione di assegnazione di una proprietà, per farlo basta scrivere il nome dell'oggetto seguito daun punto e dal nome della proprietà Robot.metallo = "Titanio";. Anche l'assegnamento di un metodo presenta una forma analoga alle proprietà Robot.sterminaUmani = function(argomento) {alert(argomento);};. Probabilmente l'avrete già notato, ma abbiamo usato una dichiarazione della funzione/metodo diversa dalla forma classica che abbiamo utilizzato fino adesso function

Page 14: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

sterminaUmani(argomento) {alert(argomento);}; purtroppo tutto questo è necessario, perchè altrimenti non sarebbe possibile assegnarla come metodo dell'oggetto "Robot" infatti assegnare un metodo in questa maniera non è sintatticamente corretto function Robot.sterminaUmani(argomento) {alert(argomento);};

Clicca Qui per eseguire il codice.

var Robot = new Object(); //oppure si può definire l'oggetto così var Robot = {};Robot.metallo = "Titanio";Robot.sterminaUmani = function(argomento) { alert(argomento);};

Robot.sterminaUmani(Robot.metallo);

Una variante della definizione dell'oggetto consiste nel definire subito tutti i metodi e le proprietà all'interno della dichiarazione (nelle graffe). I vantaggi di questa sintassi sono nella compattezza delcodice, infatti definendole all'interno non è più necessario scrivere prima di ogni proprietà o metodoil nome dell'oggetto al quale li associamo, questo succede perchè è scontato che li si assegnino all'oggetto al quale sono "ospiti". Non è l'unico cambiamento però, oltre alla definizione delle funzioni cambiano anche i segni usati per l'assegnamento ora si devono utilizzare i due punti al posto dell'uguale, mentre per far finire un assegnamento bisogna utilizzare la virgola al posto del punto e virgola:

Clicca Qui per eseguire il codice.

var Robot = { metallo: "Titanio", sterminaUmani: function(argomento) { alert(argomento); }};

Robot.sterminaUmani(Robot.metallo);

Come potete vedere il risultato non cambia.

Funzioni native

Ne abbiamo viste già alcune in questo capitolo come alert, parseInt ecc, in questa guida ne vedremomolte altre e normalmente saranno accompagnate dall'argomento. Tutte quelle senza argomento saranno presentate qua. La funziones eval(string) utilizza la stringa racchiusa tra parentesi come delle isruzioni JavaScript. L'operatore typeof invece restituisce il tipo di dato della variabile che analizza. I valori restituiti possono essere: string, boolean, number, function.

Clicca Qui per eseguire il codice.

//evalvar part1 = "nome = \"matteo\";";var part2 = "cognome = \"gilardoni\";";var part0 = "var resultEval = nome + \" \" + cognome;";eval(part1 + part2 + part0);

//typeofvar booleano = true;var prova = new Function();var numero = 1;var carattere = "Salve";

Page 15: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

var resulType = "Booleano: " + typeof booleano +"\n" + "prova: " + typeof prova + "\n" + "numero: " + typeof numero + "\n" + "carattere: " + typeof carattere + "\n";alert("EVAL \n" + resultEval +"\n\n"+ "TYPEOF: \n" + resulType);

Avviare javaScript al momento giusto

Il primo problema che troverete con javaScript sarà quello di aspettare che la pagina abbia caricato tutti gli oggetti del Dom (Document Object Model). Perchè senza di quelli javascript non può manipolarli, questo problema deriva dal fatto che la dichiarazione viene fatta nel tag head e quindi il parser quando analizza riga per riga la pagina analizza javascript e lo avvia, ma non avendo analizzato tutta la pagina javascript non ha gli elementi che la maggiorparte delle volte devemanipolare. Per aspettare che il dom sia completo ci sono alcune soluzioni, la prima è utilizzare l'oggetto wondow e l'evento onload:

windows.onload

window.onload = function() { //qui inseriamo tutte le nostre funzioni document.getElementById('google').onclick = function(){alert('Google');}; document.getElementById('yahoo').onclick = function(){alert('Yahoo!');};}

Questo sistema attende che l'oggetto window che rappresenta la finestra del browser carichi tutta la pagina che contiene. Questo può creare un'altro handicap perchè non attende soltanto che il dom venga caricato ma anche tutti i file multimediali ad esso associati creando un ritardato maggiore all'esecuzione dei nostri script. Per risolvere quest'ultimo problema ci viene in aiuto una delle librerie che abbiamo introdotto ad inizio capitolo, la libreria jQuery, con la sua funzione .ready()

$(document).ready(function(){//function});

$(document).ready(function(){ //qui inseriamo tutte le nostre funzioni document.getElementById('google').onclick = function(){alert('Google');}; document.getElementById('yahoo').onclick = function(){alert('Yahoo!');};});

Anche Prototype offre un metodo simile a quello di jQuery, che risolse i problemi presentati precedentemente.

document.observe("dom:loaded", function() {//function});

document.observe("dom:loaded", function() { //qui inseriamo tutte le nostre funzioni document.getElementById('google').onclick = function(){alert('Google');}; document.getElementById('yahoo').onclick = function(){alert('Yahoo!');};});

Page 16: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Accesso al Browser Object ModelPer poter andare a modificare la nostra pagina web bisogna conoscerne la struttura, per poter sapere quali elementi poter andare a manipolare. Il BOM è una struttura gerarchica che contiene tutti gli elementi del browser, nell'immagine seguente vediamo i più importanti. Il nodo più alto è window che rappresenta la finestra del browser, poi sotto abbiamo:

1. navigator (il browser) 2. screen (lo schermo) 3. location (l'indirizzo) 4. history (la cronologia) 5. document (il documento html)

Sempre su questo livello troviamo anche l'oggetto status e i frames, usati sempre meno.

Funzioni dell'oggetto windowOra vediamo quali funzioni native sono disponibili per gli elementi appena citati. alert(), confirm()e prompt() tutti questi sono metodi dell'elemento window e si richiamano in questa maniera window.alert() se avrete fatto attenzione però alert() come le altre tre funzioni non necessitano per forza della dichiarazione dell'oggetto window. Tutti e tre i metodi aprono un finistra, alert() apre unafinestra implicita ed il testo che usa è quello definto nell'argomento, confirm() apre una finestra modale significa che permette di scegliere tra due possibilità che restituiranno al programma true o false, nell'esempio abbiamo usato questa caratteristica per sfruttare il comportamento delle condizioni, cliccando sul pulsante ok che equivale a true si attiverà il codice condizionale, infine troviamo prompt() che è una finestra di dialogo, questo tipo di metodo apre un finestra dove poteteinserire del testo. Nell'esempio si è sfruttata la caratteristica di prompt di restituire il testo che viene inserito per aprire un finistra implicita con il vostro nome (almeno se non avete fatto i furbi ;)).

Clicca Qui per eseguire il codice.

window.alert("finestra implicita");

if (window.confirm("finestra modale")){ alert("hai scelto ok");};

var nome = window.prompt("Come ti chiami?","Scrivi qui il tuo nome");alert("Ciao " + nome);

I metodi blur() e focus() si occupano focalizzare un elemento in una pagina, quando clicchiamo peresempio su un campo di testo, oppure usiamo il tasto tab, si dice che il focus, si è spostato. Questi metodi si occupano così di toglierlo tramite blur() e di metterlo con focus(), ecco un esempio su come spostare il focus su un elemento document.getElementById('main').focus();. I prossimi metodi

Page 17: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

che spiegheremo presentano tutti due varianti, una che accetta dei valori assoluti e l'altra dei valori relativi. Iniziamo con il primo resizeTo() e resizeBy() queste due funzioni si occupano di ridimensionare la finestra del browser, moveTo() e moveBy() spostano la finestra a seconda dei valori inseriti, scrollTo() e scrollBy() si occupa di spostare la scroll bar della pagina. Se avete uno dei browser usciti recentemente vi accorgerete che il prossimo esempio non funziona. Questo non è dovuto a qualche errore nel codice ma è una nuova modifica che hanno adottato alcuni dei più recenti browser come Chrome, Opera e Firefox. I metodi apparte (scrollTo e scrollBy) funzionano solo se si utilizzati insieme al metodo open(). Infatti si sconsiglia l'uso di questi metodi se non nel caso di dover aprire una nuova finestra.

Clicca Qui per eseguire il codice.

alert("ridimensiona in modo assoluto e relativo"); window.resizeTo(900,800);window.resizeBy(-100,-100);

alert("muovi la pagina in modo assoluto e relativo");window.moveTo(100,200);window.moveBy(100,200);

alert("scrolla in modo assoluto e relativo");window.scrollTo(0,400);window.scrollBy(0,-100);

Siccome ne abbiamo parlato, ora vediamo la funzione open("url", "titolo", "parametro1=valore1, parametro2=valore2"), questo metodo si occupa di aprire una nuova pagina, e gli si possono inviare parecchi argomenti, il primo argomento si occupa di decidere l'url ovvero la pagina che vogliamo aprire, il secondo si occupa di dargli un titolo, mentre gli altri sono tutti parametri che si possono passare usando la forma parametro=valore ogni parametro deve essere diviso da una virgola. Di seguito vediamo i parametri che è possibile inserire:

Nome parametroPossibili

valoriDescrizione

copyhistory yes, noCopia o meno la cronologia della finestra padre nella finestra figlia

width, height, top, left

numero interoIndicano rispettivamente le dimensioni e la posizione sullo schermo della finestra

location yes, no Indica se mostrare la barra dell'indirizzomenubar yes, no Indica se mostrare la barra dei menuresizable yes, no Abilita il ridimensionamento della finestrascrollbars yes, no Mostra/nasconde le barre di scorrimento lateralistatus yes, no Mostra la barra di statotoolbar yes, no Mostra la barra degli strumenti

Insieme alla funzione open() esiste anche la funzione close() che si occupa di chiudere una finestra del browser. Quando ci si occupa di creare una nuova finestra è importante creare un riferimento alla finestra che si vuole aprire. Questo permette di avere il controllo sulla finestra appena creata e l'accesso alle sue proprietà ed ai suoi metodi. Nel prossimo esempio l'oggetto di riferimento è la variabile windowObjectReference.

Clicca Qui per eseguire il codice.

var windowObjectReference; //creiamo l'oggetto che conterrà la nostra referenzafunction openRequestedPopup(){ windowObjectReference =

Page 18: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

window.open("capitolo1.html","DescriptiveWindowName","resizable=yes,scrollbars=yes,status=yes");}function closeRequestedPopup(){ windowObjectReference.close();} openRequestedPopup();closeRequestedPopup();

alert("ho aperto e subito chiuso la finestra");

Navigator

Restituisce un riferimento all'oggetto navigator che può essere richiesto per informazioni sulle applicazioni in esecuzione.

Clicca Qui per eseguire il codice.

alert("You're using " + navigator.appName);

ProprietàStandard

Descrizione Esempio

navigator.appCodeName No

Restituisce il nome intero del nome del "codice" del browser corrente. Non fare affidamento su questa proprietà per avere un valore corretto.

Esegui

alert("You're using " +

navigator.appCodeName);

navigator.appName Si

Restituisce il nome uffiaciale del browser. Non fare affidamento su questa proprietà per avere un valore corretto.

Esegui

alert("You're using " +

navigator.appName);

navigator.appName Si

Restituisce la versione del browser in una stringa. Non fare affidamento su questa proprietà per avere un valore corretto.

Eseguialert(navigator.appVersion);

navigator.buildID No

Restituisce il build identifier del browser (esempio "2006090803").

Eseguiundefined

navigator.connection SiFornisce informazioni sulla connessione alla rete del dispositivo.

Eseguiundefined

navigator.cookieEnabled Si

Restituisce un valore booleano che indica se i cookie sono abilitati nel browser oppure no.

Eseguiundefined

navigator.doNotTrack No Riporta il valore della preferenza do-not-track

Esegui undefined

Page 19: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

ProprietàStandard

Descrizione Esempio

dell'utente. Quando questo valore è "Si , il tuo sito o applicazione non deve monitorare l'utente.

navigator.id No

Returns the id object which you can use to add support for BrowserID to your web site.

Eseguiundefined

navigator.language Si

Restituisce una stringa che rappresenta la versione della lingua delbrowser.

Eseguialert(navigator.language);

navigator.mimeTypes SiRestituisce una lista di tipi MIME supportati dalbrowser.

Eseguialert(navigator.mimeTypes);

navigator.mozApps NoRestituisce un ogggetto Apps che puoi installare,manipolare e controllare.

Eseguialert(navigator.mimeTypes);

navigator.mozBattery No

Returns a battery object you can use to get information about the battery charging status.

Eseguiundefined

navigator.mozNotification e navigator.webkitNotification

No

Returns a notification object you can use to deliver notifications to the user from your web application.

Eseguiundefined

navigator.mozSms No

Returns a SmsManager object you can use to manage SMS messagingin your web application.

Eseguiundefined

navigator.mozTelephony No

Returns a Telephony object you can use to create and manage telephone calls.

Eseguiundefined

navigator.onLine SiRestituisce un valore booleano se il browser sta lavorando online.

Eseguialert(navigator.onLine);

navigator.oscpu SiRestituisce una stringa che rappresenta il sistema operativo.

Eseguiundefined

navigator.platform SiRestituisce una stringa che rappresenta la piattaforma del browser.

Eseguialert(navigator.platform);

navigator.plugins Si Restituisce una array dei Esegui alert(navigator.plugins);

Page 20: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

ProprietàStandard

Descrizione Esempio

plug-in installti nel browser.

navigator.product NoRestituisce il nome del prodotto del browser.

Eseguialert(navigator.product);

navigator.productSub NoRestituisce il numero di produzione del browser.

Eseguialert(navigator.productSub);

navigator.securitypolicy No

Restituisce una stringa vuota. In Netscape 4.7x, restituisce "US & CA domestic policy" o "Export policy".

Eseguiundefined

navigator.userAgent SiReturns the user agent string for the current browser.

Eseguialert(navigator.userAgent);

navigator.vendor NoRestituisce il nome del fornitore del browser.

Eseguialert(navigator.vendor);

navigator.vendorSub NoRestituisce il numero della versione del fornitore del browser.

Eseguialert(navigator.vendorSub);

navigator.webkitPointer NoRestituisce un oggetto PointerLock per il mouse API Lock.

Eseguiundefined

Ora vedremo i metodi che ci vengono concessi:

MetodoStandard

Descrizione Esempio

navigator.javaEnabled Si

Indica se il browser host ha Java abilitato o no.

Eseguialert(navigator.javaEnabled);

navigator.mozIsLocallyAvailable No

Consente al codice di vedere se il documento determinato dall'URI è disponibile senza l'uso della rete.

Eseguiundefined

navigator.registerContentHandler Si

Permette ai siti di registrarsi come possibile gestore con un tipo di MIME.

Eseguiundefined

navigator.registerProtocolHandler Si

Permette ai siti web di registrarsi come un possibile

Eseguiundefined

Page 21: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

MetodoStandard

Descrizione Esempio

gestore con un determinato protocollo.

navigator.vibrate() Si

Provoca la vibrazione sui dispositivi che lasupportano.

Eseguiundefined

Screen

L'oggetto screen restituisce i riferimenti dello schermo è un oggetto speciale perchè ispeziona le proprietà dello schermo corrente e viene eseguito il rendering. Ora vediamo le seguenti proprietà supportate:

Proprietà Descrizione Esempio

availTopSpecifica la coordinata y del primo pixel chenon è assegnato alle permanenti o semipermanenti interfaccie utente.

Eseguialert(screen.availTop);

availLeftSpecifica il primo pixel disponibile a sinistra.

Eseguialert(screen.availLeft);

availHeight Specifica l'altezza dello schermo. Eseguialert(screen.availHeight);

availWidth Specifica la larghezza dello schermo. Eseguialert(screen.availWidth);

colorDepthSpecifica la profondità del colore dello schermo.

Eseguialert(screen.colorDepth);

height Restituisce l'altezza dello schermo in pixel. Eseguialert(screen.height);

leftRestituisce la distanza dei pixel dal lato sinistro dello schermo principale al lato sinistro dello schermo corrente.

Eseguiundefined

pixelDepth Prende i bit di profondità dello schermo. Eseguialert(screen.pixelDepth);

topRestituisce la distanza dei pixel Returns the distance in pixels from the top side of the current screen.

Eseguiundefined

width Restituisce la larghezza dello schermo. Eseguialert(screen.width);

Location

L'oggetto Location contiene informazioni sull'url del documento e fornisce anche dei metodi per cambiarlo. Nel prossimo esempio mostriamo come cambiare l'url del browser in modo da cambiare pagine:

Clicca Qui

window.location = "capitolo1.html";

Come possiamo vedere l'oggetto location contiene tutta la stringa dell'url, associandogli un valore diverso, come nell'esempio precedente il browser seguirà quel l'url.

Page 22: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Clicca Qui

alert(window.location);

Ora invece nella tabella seguente vedremo le proprietà che si posso associare all'oggetto location, ogni proprietà permette di selezionare una parte dell'url: http://[www.example.com]:80/search?q=devmo#test

Proprietà Descrizione Esempio

hashLa parte dell'url che segue dopo il simbolo #, includendo il simbolo stesso.

#test

host Il nome dell'host e il numero della porta. [www.example.com]:80hostname Il nome dell'host senza il numero della porta. www.example.com

href L'intero URL.http://[www.example.com]:80/search?q=devmo#test

pathname il percorso (relativo all'host). /searchport Il numero della porta. 80protocol Il protocollo dell'url. http:

searchLa parte dell'url che segue dopo il simbolo ?, includendo il simbolo stesso.

?q=devmo

Clicca Qui

alert(window.location.protocol);

Con queste proprietà possiamo assegnare valori specifici per ogni parte dell'url. Ora vedremo i metodi che ci vengono concessi:

Metodo Descrizioneassign(url) Carica il documento attraverso l'url fornito dall'argomento.

reload(forceget)

Ricarica il documento corrente. Forceget è un valore booleano che quando è vero, ricarica sempre la pagina dal server. Se è false o non specificato il browser ricaricherà la pagina attraverso le cache.

replace(url)Sostituisce il documento corrente con l'url fornito. La differenza con il metodo assign()è che dopo aver usato replace() la pagina corrente non sarà salvata nella cronologia.

toString() Restituisce la rappresentazionr in formato stringa del l'url dell'oggetto location.

il metodo toString() converte un oggetto in in una stringa. Questo metodo serve se si vuole lavoraresull'url come fosse una stringa, per poter usare altri metodi come charAt() che permette di sapere quale carattere c'è nell'url in una determinata posizione.

Clicca Qui

alert("url completo: \n" + window.location + "\n \n" + "quindicesimo carattere: \n" + window.location.toString().charAt(15));

History

Il BOW prevede l'accesso alla cronologia del browser tramite l'oggetto history. Con questo oggetto puoi disporre dei metodi e delle proprietà che ti lasciano andare avanti e indietro nella cronologia dell'utente. Vediamo le prime tre funzioni dell'oggetto history, il metodo back() fa andare alla pagina visitata precedentemente, forward() si occupa di fare l'opposto del metodo back.

Clicca Qui per eseguire back(), clicca Qui per eseguire forward().

Page 23: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

window.history.back();window.history.forward();

Con la funzione go() possiamo andare nel punto della cronologia che vogliamo.

Clicca Qui per eseguire il codice.

window.history.go(-1); //è come usare back()window.history.go(1); //è come usare forward()

Possiamo anche recuperare quante pagine abbiamo visto.

Clicca Qui per eseguire il codice.

var numberPageVisited = window.history.length;alert(numberPageVisited);

Document

L'elemento document contiene tutti gli elementi dell'html e presenta al suo interno un'altra sottoFunzioni dell'oggetto window

Ora vediamo quali funzioni native sono disponibili per gli elementi appena citati. alert(), confirm()e prompt() tutti questi sono metodi dell'elemento window e si richiamano in questa maniera window.alert() se avrete fatto attenzione però alert() come le altre tre funzioni non necessitano per forza della dichiarazione dell'oggetto window. Tutti e tre i metodi aprono un finistra, alert() apre unafinestra implicita ed il testo che usa è quello definto nell'argomento, confirm() apre una finestra modale significa che permette di scegliere tra due possibilità che restituiranno al programma true o false, nell'esempio abbiamo usato questa caratteristica per sfruttare il comportamento delle condizioni, cliccando sul pulsante ok che equivale a true si attiverà il codice condizionale, infine troviamo prompt() che è una finestra di dialogo, questo tipo di metodo apre un finestra dove poteteinserire del testo. Nell'esempio si è sfruttata la caratteristica di prompt di restituire il testo che viene inserito per aprire un finistra implicita con il vostro nome (almeno se non avete fatto i furbi ;)).

Clicca Qui per eseguire il codice.

window.alert("finestra implicita");

if (window.confirm("finestra modale")){ alert("hai scelto ok");};

var nome = window.prompt("Come ti chiami?","Scrivi qui il tuo nome");alert("Ciao " + nome);

I metodi blur() e focus() si occupano focalizzare un elemento in una pagina, quando clicchiamo peresempio su un campo di testo, oppure usiamo il tasto tab, si dice che il focus, si è spostato. Questi metodi si occupano così di toglierlo tramite blur() e di metterlo con focus(), ecco un esempio su come spostare il focus su un elemento document.getElementById('main').focus();. I prossimi metodiche spiegheremo presentano tutti due varianti, una che accetta dei valori assoluti e l'altra dei valori relativi. Iniziamo con il primo resizeTo() e resizeBy() queste due funzioni si occupano di ridimensionare la finestra del browser, moveTo() e moveBy() spostano la finestra a seconda dei valori inseriti, scrollTo() e scrollBy() si occupa di spostare la scroll bar della pagina. Se avete uno dei browser usciti recentemente vi accorgerete che il prossimo esempio non funziona. Questo non è dovuto a qualche errore nel codice ma è una nuova modifica che hanno adottato alcuni dei più recenti browser come Chrome, Opera e Firefox. I metodi apparte (scrollTo e scrollBy) funzionano solo se si utilizzati insieme al metodo open(). Infatti si sconsiglia l'uso di questi metodi se non nel caso di dover aprire una nuova finestra.

Page 24: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Clicca Qui per eseguire il codice.

alert("ridimensiona in modo assoluto e relativo"); window.resizeTo(900,800);window.resizeBy(-100,-100);

alert("muovi la pagina in modo assoluto e relativo");window.moveTo(100,200);window.moveBy(100,200);

alert("scrolla in modo assoluto e relativo");window.scrollTo(0,400);window.scrollBy(0,-100);

Siccome ne abbiamo parlato, ora vediamo la funzione open("url", "titolo", "parametro1=valore1, parametro2=valore2"), questo metodo si occupa di aprire una nuova pagina, e gli si possono inviare parecchi argomenti, il primo argomento si occupa di decidere l'url ovvero la pagina che vogliamo aprire, il secondo si occupa di dargli un titolo, mentre gli altri sono tutti parametri che si possono passare usando la forma parametro=valore ogni parametro deve essere diviso da una virgola. Di seguito vediamo i parametri che è possibile inserire:

Nome parametroPossibili

valoriDescrizione

copyhistory yes, noCopia o meno la cronologia della finestra padre nella finestra figlia

width, height, top, left

numero interoIndicano rispettivamente le dimensioni e la posizione sullo schermo della finestra

location yes, no Indica se mostrare la barra dell'indirizzomenubar yes, no Indica se mostrare la barra dei menuresizable yes, no Abilita il ridimensionamento della finestrascrollbars yes, no Mostra/nasconde le barre di scorrimento lateralistatus yes, no Mostra la barra di statotoolbar yes, no Mostra la barra degli strumentiInsieme alla funzione open() esiste anche la funzione close() che si occupa di chiudere una finestra del browser. Quando ci si occupa di creare una nuova finestra è importante creare un riferimento alla finestra che si vuole aprire. Questo permette di avere il controllo sulla finestra appena creata e l'accesso alle sue proprietà ed ai suoi metodi. Nel prossimo esempio l'oggetto di riferimento è la variabile windowObjectReference.

Clicca Qui per eseguire il codice.

var windowObjectReference; //creiamo l'oggetto che conterrà la nostra referenzafunction openRequestedPopup(){ windowObjectReference = window.open("capitolo1.html","DescriptiveWindowName","resizable=yes,scrollbars=yes,status=yes");}function closeRequestedPopup(){ windowObjectReference.close();} openRequestedPopup();closeRequestedPopup();

alert("ho aperto e subito chiuso la finestra");

Page 25: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Navigator

Restituisce un riferimento all'oggetto navigator che può essere richiesto per informazioni sulle applicazioni in esecuzione.

Clicca Qui per eseguire il codice.

alert("You're using " + navigator.appName);

ProprietàStandard

Descrizione Esempio

navigator.appCodeName No

Restituisce il nome intero del nome del "codice" del browser corrente. Non fare affidamento su questa proprietà peravere un valore corretto.

Esegui

alert("You're using " +

navigator.appCodeName);

navigator.appName Si

Restituisce il nome uffiaciale del browser. Non fare affidamento su questa proprietà peravere un valore corretto.

Esegui

alert("You're using " +

navigator.appName);

navigator.appName Si

Restituisce la versione del browser in una stringa. Non fare affidamento su questa proprietà peravere un valore corretto.

Eseguialert(navigator.appVersion);

navigator.buildID No

Restituisce il build identifier del browser (esempio "2006090803").

Eseguiundefined

navigator.connection Si

Fornisce informazioni sulla connessione alla rete del dispositivo.

Eseguiundefined

navigator.cookieEnabled Si

Restituisce un valore booleano cheindica se i cookie sono abilitati nel browser oppure no.

Eseguiundefined

navigator.doNotTrack No

Riporta il valore della preferenza do-not-track dell'utente. Quando

Eseguiundefined

Page 26: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

ProprietàStandard

Descrizione Esempio

questo valore è "Si ,il tuo sito o applicazione non deve monitorare l'utente.

navigator.id No

Returns the id object which you can use to add support for BrowserID to your web site.

Eseguiundefined

navigator.language Si

Restituisce una stringa che rappresenta la versione della lingua del browser.

Eseguialert(navigator.language);

navigator.mimeTypes Si

Restituisce una listadi tipi MIME supportati dal browser.

Eseguialert(navigator.mimeTypes);

navigator.mozApps No

Restituisce un ogggetto Apps che puoi installare, manipolare e controllare.

Eseguialert(navigator.mimeTypes);

navigator.mozBattery No

Returns a battery object you can use to get information about the battery charging status.

Eseguiundefined

navigator.mozNotification e navigator.webkitNotification

No

Returns a notification object you can use to deliver notificationsto the user from your web application.

Eseguiundefined

navigator.mozSms No

Returns a SmsManager objectyou can use to manage SMS messaging in your web application.

Eseguiundefined

navigator.mozTelephony No

Returns a Telephony object you can use to create and manage telephone calls.

Eseguiundefined

Page 27: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

ProprietàStandard

Descrizione Esempio

navigator.onLine Si

Restituisce un valore booleano se il browser sta lavorando online.

Eseguialert(navigator.onLine);

navigator.oscpu Si

Restituisce una stringa che rappresenta il sistema operativo.

Eseguiundefined

navigator.platform Si

Restituisce una stringa che rappresenta la piattaforma del browser.

Eseguialert(navigator.platform);

navigator.plugins SiRestituisce una array dei plug-in installti nel browser.

Eseguialert(navigator.plugins);

navigator.product NoRestituisce il nome del prodotto del browser.

Eseguialert(navigator.product);

navigator.productSub No

Restituisce il numero di produzione del browser.

Eseguialert(navigator.productSub);

navigator.securitypolicy No

Restituisce una stringa vuota. In Netscape 4.7x, restituisce "US & CA domestic policy" o "Export policy".

Eseguiundefined

navigator.userAgent SiReturns the user agent string for the current browser.

Eseguialert(navigator.userAgent);

navigator.vendor NoRestituisce il nome del fornitore del browser.

Eseguialert(navigator.vendor);

navigator.vendorSub No

Restituisce il numero della versione del fornitore del browser.

Eseguialert(navigator.vendorSub);

navigator.webkitPointer No

Restituisce un oggetto PointerLock per il mouse API Lock.

Eseguiundefined

Ora vedremo i metodi che ci vengono concessi:

Page 28: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

MetodoStandard

Descrizione Esempio

navigator.javaEnabled Si

Indica se il browser host ha Java abilitato o no.

Eseguialert(navigator.javaEnabled);

navigator.mozIsLocallyAvailable No

Consente al codice di vedere se il documento determinato dall'URI è disponibile senza l'uso della rete.

Eseguiundefined

navigator.registerContentHandler Si

Permette ai siti di registrarsi come possibile gestore con un tipo di MIME.

Eseguiundefined

navigator.registerProtocolHandler Si

Permette ai siti web di registrarsi come un possibile gestore con un determinato protocollo.

Eseguiundefined

navigator.vibrate() Si

Provoca la vibrazione sui dispositivi che lasupportano.

Eseguiundefined

Screen

L'oggetto screen restituisce i riferimenti dello schermo è un oggetto speciale perchè ispeziona le proprietà dello schermo corrente e viene eseguito il rendering. Ora vediamo le seguenti proprietà supportate:

Proprietà Descrizione Esempio

availTopSpecifica la coordinata y del primo pixel chenon è assegnato alle permanenti o semipermanenti interfaccie utente.

Eseguialert(screen.availTop);

availLeftSpecifica il primo pixel disponibile a sinistra.

Eseguialert(screen.availLeft);

availHeight Specifica l'altezza dello schermo. Eseguialert(screen.availHeight);

availWidth Specifica la larghezza dello schermo. Eseguialert(screen.availWidth);

Page 29: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Proprietà Descrizione Esempio

colorDepthSpecifica la profondità del colore dello schermo.

Eseguialert(screen.colorDepth);

height Restituisce l'altezza dello schermo in pixel. Eseguialert(screen.height);

leftRestituisce la distanza dei pixel dal lato sinistro dello schermo principale al lato sinistro dello schermo corrente.

Eseguiundefined

pixelDepth Prende i bit di profondità dello schermo. Eseguialert(screen.pixelDepth);

topRestituisce la distanza dei pixel Returns the distance in pixels from the top side of the current screen.

Eseguiundefined

width Restituisce la larghezza dello schermo. Eseguialert(screen.width);

Location

L'oggetto Location contiene informazioni sull'url del documento e fornisce anche dei metodi per cambiarlo. Nel prossimo esempio mostriamo come cambiare l'url del browser in modo da cambiare pagine:

Clicca Qui

window.location = "capitolo1.html";

Come possiamo vedere l'oggetto location contiene tutta la stringa dell'url, associandogli un valore diverso, come nell'esempio precedente il browser seguirà quel l'url.

Clicca Qui

alert(window.location);

Ora invece nella tabella seguente vedremo le proprietà che si posso associare all'oggetto location, ogni proprietà permette di selezionare una parte dell'url: http://[www.example.com]:80/search?q=devmo#test

Proprietà Descrizione Esempio

hashLa parte dell'url che segue dopo il simbolo #, includendo il simbolo stesso.

#test

host Il nome dell'host e il numero della porta. [www.example.com]:80hostname Il nome dell'host senza il numero della porta. www.example.com

href L'intero URL.http://[www.example.com]:80/search?q=devmo#test

pathname il percorso (relativo all'host). /searchport Il numero della porta. 80protocol Il protocollo dell'url. http:

searchLa parte dell'url che segue dopo il simbolo ?, includendo il simbolo stesso.

?q=devmo

Clicca Qui

alert(window.location.protocol);

Con queste proprietà possiamo assegnare valori specifici per ogni parte dell'url. Ora vedremo i

Page 30: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

metodi che ci vengono concessi:

Metodo Descrizioneassign(url) Carica il documento attraverso l'url fornito dall'argomento.

reload(forceget)Ricarica il documento corrente. Forceget è un valore booleano che quando è vero, ricarica sempre la pagina dal server. Se è false o non specificato il browser ricaricherà la pagina attraverso le cache.

replace(url)Sostituisce il documento corrente con l'url fornito. La differenza con il metodo assign() è che dopo aver usato replace() la pagina corrente non sarà salvata nella cronologia.

toString() Restituisce la rappresentazionr in formato stringa del l'url dell'oggetto location.

il metodo toString() converte un oggetto in in una stringa. Questo metodo serve se si vuole lavoraresull'url come fosse una stringa, per poter usare altri metodi come charAt() che permette di sapere quale carattere c'è nell'url in una determinata posizione.

Clicca Qui

alert("url completo: \n" + window.location + "\n \n" + "quindicesimo carattere: \n" + window.location.toString().charAt(15));

History

Il BOW prevede l'accesso alla cronologia del browser tramite l'oggetto history. Con questo oggetto puoi disporre dei metodi e delle proprietà che ti lasciano andare avanti e indietro nella cronologia dell'utente. Vediamo le prime tre funzioni dell'oggetto history, il metodo back() fa andare alla pagina visitata precedentemente, forward() si occupa di fare l'opposto del metodo back.

Clicca Qui per eseguire back(), clicca Qui per eseguire forward().

window.history.back();window.history.forward();

Con la funzione go() possiamo andare nel punto della cronologia che vogliamo.

Clicca Qui per eseguire il codice.

window.history.go(-1); //è come usare back()window.history.go(1); //è come usare forward()

Possiamo anche recuperare quante pagine abbiamo visto.

Clicca Qui per eseguire il codice.

var numberPageVisited = window.history.length;alert(numberPageVisited);

Document

L'elemento document contiene tutti gli elementi dell'html e presenta al suo interno un'altra sotto-gerarchia dal nome DOM (Document Object Model). Nel document è possibile la manipolazione dei cookie e delle applet. Come potrete vedere nell'immagine seguente anche gli attributi e gli elementi di testo sono considerati come dei nodi rispettivamente vegono chiamati nodi attributi e nodi di testo.

Page 31: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Ora che si è vista la struttura, vediamo come poter selezionare un elemento nel dom. Si può ottenereun riferimento ad un nodo tramite l'id getElementById(id) e attravarso il tag name getElementsByTagName(tag). Mentre con getElementById seleziona solo un elemento, con getElementsByTagName selezioniamo un elenco di nodi, come se fosse un array è possibile scegliere tra gli elementi selezionati. La proprietà nodeName permette di conoscere il nome di tag selezionato.

Clicca Qui per eseguire il codice.

var targetId = document.getElementById("main");var nameNode = targetId.nodeName; //nome del tag

var targetTags = document.getElementsByTagName("div");var numberTags = targetTags.length; //numero elementi selezionati

var targetTag = targetTags[0]; //seleziona il primo elemento della lista targetTags

alert(nameNode + "\n" + numberTags + "\n" + targetTags);

Ritorniamo sul metodo getElementsByTagName() è possibile restringere il campo degli elementi, utilizzando più volte questo metodo in questo modo:

Ridurre gli elementi selezionati:

Page 32: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

var unorderLists = document.getElementsByTagName('ul');var unorderList = unorderLists[0];var listItems = unorderList.getElementsByTagName('li');var listItem = listItems[0];var anchors = listItem.getElementsByTagName('a')[0];

Anche le librerie mettono a disposizione dei metodi di selezione degli elementi, che sono molto più potenti dei metodi nativi di javaScript. Prototype è il primo a sintetizzare la forma document.getElementById(id) con la forma più compatta $(id) e inoltre permette di aggiungere più id contemporaneamente in questo modo: $(id1,id2,id3), un metodo che prototype ha copiato da jQuery è quello della selezione tramite la sintassi dei css $$(cssRule) permette dappunto di semplificare enormemente la parte di selezione degli elementi.

Alternative con Prototype

$('header'); //selziona gli id$('header','main','footer');$$('body .container p');

jQuery come si accenava prima, ha creato un metodo che sfrutta la sintassi di css1,2,3 per selezionare gli elementi, il metodo utilizza il dollaro $(cssRule).

Alternative con jQuery

$('#main'); //seleziona id$('#main div.test'); //seleziona i div con class test$('#header div.test:nth-child(2)'); //css3

Muoversi nel DOM

Se vogliamo navigare nell'albero del DOM possiamo utilizzare anche delle proprietà create apposta per questo. Elenchiamole, parentNode seleziona il genitore, previousSibling seleziona il fratello che lo precede, nextSibling seleziona il fratello che lo segue, firstChild seleziona il primo figlio, childNodes seleziona i figli, utilizzando le quadre è possibile specificare quale nodo figlio childNodes[2], inserendo 2 nelle quadre selezioneremo il terzo nodo figlio (si conta anche lo zero), lastChild seleziona l'ultimo figlio.

Page 33: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

vedremo nel prossimo esempio come poter navigare nel dom, abbiamo utilizzato la proprietà nodeValue per permette di ottenere il valore del nodo, normalmente gli elementi danno come risultato null, apparte i nodi di testo, i commenti ed i nodi CDATA.

Clicca Qui per eseguire il codice.

var anchor = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];var valueTextAnchor = anchor.firstChild.nodeValue;alert(valueTextAnchor);

Come al solito le librerie ci vengono in aiuto mettendoci a disposizione delle funzioni sulla navigazione del dom. jQuery mette a disposizioni i seguenti metodi: .parent(), oppure :parent (quest'ultimo va usato come selettore) permette di selezionare l'elemento genitore, poi troviamo parents() che permette di memorizzare tutti i genitori fino ad arrivare alla radice. Il metodo next() si occupa di selezionare l'elemento fratello successivo, nextAll() seleziona tutti i fratelli successivi. Il metodo .prev() e prevAll() fa esattamente l'opposto di next() e nextAll() prende il fratello che lo precede. Per muoversi tra gli elementi figlio si utilizza il metodo children(), a supporto ci sono anche i selettori :first-child, :last-child che dal nome è facile capire cosa si occupano, mentre un'altro selettore utile è :nth-child() che permette inserendo un numero di selezionare gli elementi figlio saltando alcuni.

Alternativa jQuery

var genitore = $('#main').parent();var genitore = $('#main:parent');var genitori = $('#main').parents();var genitori = $('.test').next();var genitori = $('.test').nextAll();var genitori = $('.test').prev();var genitori = $('.test').prevAll();var genitori = $('.test:nth-child(2)'); //prende i figli a secondo del numero

Page 34: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Ottenere un riferimento agli attributi

Per ottenere un riferimento ad un attributo possiamo usare o il metodo getAttribute("attributo") oppure ottenerla considerandola come una proprietà dell'elemento, tipo se vogliamo ottenere l'attributo href bisogna fare così .href il primo caso dovrebbe essere il metodo da usare per essere conformi allo standard del W3c purtroppo è un metodo afflitto da vari problemi sui vari browser quindi è meglio utilizzare il secondo metodo:

Clicca Qui per eseguire il codice.

var linkNavigation = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];var linkNavigationAtt = linkNavigation.getAttribute('href'), linkNavigationAtt2 = linkNavigation.href;alert('getAttribute(\'herf\') \n' + linkNavigationAtt);alert('.href \n' + linkNavigationAtt2);

Per cambiare o aggiungere un attributo si può utilizzare il metodo .setAttribute(attributo,valore) sempre considerando l'attributo come una proprietà dell'elemento, si può per esempio assegnare allaproprietà .name un valore e questa oltre ad prendere quel valore, se l'elemento non ha quell'attributolo aggiungerà.

Clicca Qui per eseguire il codice.

var linkNavigation = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];//creare un attributolinkNavigation.setAttribute('title', 'valore-attributo');linkNavigation.name = 'valore-attributo2';

//controllare se il valore è stato aggiuntovar linkNavigationAtt = linkNavigation.getAttribute('title');var linkNavigationAtt2 = linkNavigation.name;alert('.setAttribute(\'title\', \'valore-attributo\'); \n' + linkNavigationAtt);alert('.name = \'valore-attributo2\' \n' + linkNavigationAtt2);

jQuery come alternativa ai metodi nativi propone il metodo .attr(elemento, attributo) sia per crearlo, leggerlo e modficarlo. Per eliminare invece viene usato .removeAttr().

alternativa jQuery

$('#main').attr('style','color:blue;'); //modifica o crea$('#main').attr('style'); //legge$('#main').removeAttr('style'); //elimina

Prototype writeAttribute(element, attributes) readAttribute(attributes) //legge .remove()

alternativa Prototype

$('main').writeAttribute('style','color:blue;'); //modifica o crea$('main').readAttribute('style');

Gestire gli stili

Ogni elemento ha una proprietà chiamata .style che permette di aggiungere un qualsiasi stile inline, basta inserire in più lo stile che si vuole modificare.

Aggiungere un stile:

var element = document.getElementById('id-element')[0];element.style.color = '#000000';

Page 35: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Per accedere a una determinata regola css, non basta trascrivere la regola css così come sono utilizzate nei fogli di stile, bisogna fare alcune modifiche per esempio alle regole come text-indent che hanno il trattino, esso infatti va eliminato usando quindi textIndent, comunque è abbastanza facile trovare la versione corretta online. Ora vediamo cosa ci offrono le librerie per aggiungere/modificare gli stili inline, jQuery ci propone il metodo .css()

alternativa jQuery

//inserire uno stile$('#main').css('background-color","yellow');

//inserirne più di uno richiede una sintassi diversa$('#main').css({ 'background-color':'yellow', 'font-weight':'bolder'});

Prototpe dal canto suo offre una versione ancora più fedele alla sintassi dei Css con il suo metodo

.setStyle().

alternativa Prototype

$('main').setStyle({ backgroundColor: '#900', fontSize: '12px'});

Il metodo più corretto per aggiungere un gruppo stili rimane comunque quello di aggiungere una class, questo permette di gestire la manutenzione del codice distinta, così gli stili li andremo semprea modificare nei fogli di stile, mentre javascript si occuperà solo del comportamento (aggiungere una class). Purtroppo in javascript non esistono funzione native che si occupa delle class così possiamo scegliere se crearcela da noi, oppure utilizzare le librerie come jQuery.

Lavorare sulle class con le librerie

Le funzioni che andremo a creare risolveranno dei problemi abbastanza comuni come selezionare degli elementi attraverso una class, controllare l'esistenza di una class, aggiunta di una classe, eliminazione di una class. Queste funzioni siccome dovrebbero essere riutilizzate abbastanza spesso è meglio integrarle in un oggetto, creando così una libreria. Quindi come potrete vedere nel codice di questa pagina abbiamo creato il file library.js che è la nostra libreria.

Selezionare

Aggiungiamo il metodo alla libreria per selezionare un gruppo di elementi tramite una class

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.getElementsByClass = function(theClass){ var elementArray = []; if (typeof document.all != "undefined") { elementArray = document.all; } else { elementArray = document.getElementsByTagName('*'); }

var matchedArray = []; var pattern = new RegExp("(^| )" + theClass + "( |$)");

Page 36: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

for (var i=0; i < elementArray.length; i++) { if (pattern.test(elementArray[i].className)) { matchedArray[matchedArray.length] = elementArray[i]; } } return matchedArray;};

//codice per attivare la funzione della libreriavar numeroClass = Library.getElementsByClass('test');

Se vogliamo affidarci alle librerie già consolidate come jQuery (scelta migliore) possiamo disporre delle stesse funzioni, anzi abbiamo degli strumenti molto più potenti. jQuery come spiegato prima utilizza il suo metodo $('.class') che può usare per selezionare qualsiasi metodo usando la sintassi dei css; con Prototype abbiamo a disposizione il metodo .getElementsByClassName(class) che permette anche un secondo argomento opzionale che restringe la ricerca, perchè usa il secondo come elemento genitore.

Alternativa Prototype

var test = document.getElementsByClass('test');var test2 = document.getElementsByClass('test', $('main'));

Controllare

Questo metodo che aggiungeremo alla libreria permette di verificare se un elemento possiede una class che inseriamo nell'argomento, restituisce true o false.

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.controlClass = function(target,theClass){ var pattern = new RegExp('(^| )'+theClass+'( |$)'); if (pattern.test(target.className)) { return true; } else { return false; }};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];alert(Library.controlClass(testElements,'test'));

Per controllare l'esistenza di una class, jQuery propone il metodo .hasClass(class)

alternativa jQuery

$('#main').hasClass('test')

Per controllare l'esistenza di una class, Prototype propone il metodo .hasClassName(class)

alternativa Prototype

$('main').hasClassName('test');

Aggiungere

Questo metodo si occupa di aggiungere una class.

Page 37: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.addClass = function(target,theClass){ if (!Core.hasClass(target,theClass)) { if (target.className == "") { target.className = theClass; } else { target.className += '' + theClass; } }};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];Library.addClass(testElements,'primo');alert('class="'+testElements.className+'"');

Per aggiungere una class, jQuery propone il metodo .addClass(class)

alternativa jQuery

$('#main').addClass('test')

Per aggiungere una class, Prototype propone il metodo .addClassName(class)

alternativa Prototype

$('main').addClassName('test');

Eliminare

Il metodo che creeremo servirà per cancellare una class, per vedere la sua efficacia prima aggiungeremo un class con il metodo .addClass e poi la elimeneremo.

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.removeClass = function(target,theClass){ var pattern = new RegExp('(^| )' + theClass + '( |$)'); target.className = target.className.replace(pattern,'$1'); target.className = target.className.replace(/ $/,'');};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];Library.addClass(testElements,'primo');alert('class="'+testElements.className+'"');Library.removeClass(testElements,'primo');alert('class="'+testElements.className+'"');

Per rimuovere una class, jQuery propone il metodo .removeClass(class)

alternativa jQuery

$('#main').removeClass('test')

Per rimuovere una class, Prototype propone il metodo .removeClassName(class)

alternativa Prototype

$('main').removeClassName('test');

Page 38: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Conclusione (ma non del tutto...)Questa è la fine della prima parte della mia guida su javaScript. Ho iniziato a creare questa guida per la necessità di avere un documento aggiornato e personalizzato da poter consultare. Visto che attualmente dovevo passare da un sito (o da un libro) all'altro per avere tutte le informazioni che mi servivano, ho iniziato questo esperimento. Essendo una prima versione, questa guida non sarà perfetta così se trovate degli errori oppure se volete dirmi la vostra potete scrivere a questa email ascolterò le vostre opinioni e se avrete delle richieste sullo sviluppo di questa guida, questo sarà il momento giusto per farlo, perchè ho intenzione di rifare tutto il mio sito e quindi dovrò valutare come inserire/impostare la mia guida nel cms. Per la continuazione di questa guida ho intenzione di affrontare questi argomenti:

1. Costruzione del Dom 2. Eventi 3. Animazioni 4. Ajax

Sto valutando inoltre di fare altre due guide per Html5 e Css3.Grazie di aver letto queste pagine alla prossima :).

-gerarchia dal nome DOM (Document Object Model). Nel document è possibile la manipolazione dei cookie e delle applet. Come potrete vedere nell'immagine seguente anche gli attributi e gli elementi di testo sono considerati come dei nodi rispettivamente vegono chiamati nodi attributi e nodi di testo.

Page 39: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Ora che si è vista la struttura, vediamo come poter selezionare un elemento nel dom. Si può ottenereun riferimento ad un nodo tramite l'id getElementById(id) e attravarso il tag name getElementsByTagName(tag). Mentre con getElementById seleziona solo un elemento, con getElementsByTagName selezioniamo un elenco di nodi, come se fosse un array è possibile scegliere tra gli elementi selezionati. La proprietà nodeName permette di conoscere il nome di tag selezionato.

Clicca Qui per eseguire il codice.

var targetId = document.getElementById("main");var nameNode = targetId.nodeName; //nome del tag

var targetTags = document.getElementsByTagName("div");var numberTags = targetTags.length; //numero elementi selezionati

var targetTag = targetTags[0]; //seleziona il primo elemento della lista targetTags

alert(nameNode + "\n" + numberTags + "\n" + targetTags);

Ritorniamo sul metodo getElementsByTagName() è possibile restringere il campo degli elementi, utilizzando più volte questo metodo in questo modo:

Page 40: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Ridurre gli elementi selezionati:

var unorderLists = document.getElementsByTagName('ul');var unorderList = unorderLists[0];var listItems = unorderList.getElementsByTagName('li');var listItem = listItems[0];var anchors = listItem.getElementsByTagName('a')[0];

Anche le librerie mettono a disposizione dei metodi di selezione degli elementi, che sono molto più potenti dei metodi nativi di javaScript. Prototype è il primo a sintetizzare la forma document.getElementById(id) con la forma più compatta $(id) e inoltre permette di aggiungere più id contemporaneamente in questo modo: $(id1,id2,id3), un metodo che prototype ha copiato da jQuery è quello della selezione tramite la sintassi dei css $$(cssRule) permette dappunto di semplificare enormemente la parte di selezione degli elementi.

Alternative con Prototype

$('header'); //selziona gli id$('header','main','footer');$$('body .container p');

jQuery come si accenava prima, ha creato un metodo che sfrutta la sintassi di css1,2,3 per selezionare gli elementi, il metodo utilizza il dollaro $(cssRule).

Alternative con jQuery

$('#main'); //seleziona id$('#main div.test'); //seleziona i div con class test$('#header div.test:nth-child(2)'); //css3

Muoversi nel DOM

Se vogliamo navigare nell'albero del DOM possiamo utilizzare anche delle proprietà create apposta per questo. Elenchiamole, parentNode seleziona il genitore, previousSibling seleziona il fratello che lo precede, nextSibling seleziona il fratello che lo segue, firstChild seleziona il primo figlio, childNodes seleziona i figli, utilizzando le quadre è possibile specificare quale nodo figlio childNodes[2], inserendo 2 nelle quadre selezioneremo il terzo nodo figlio (si conta anche lo zero), lastChild seleziona l'ultimo figlio.

Page 41: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

vedremo nel prossimo esempio come poter navigare nel dom, abbiamo utilizzato la proprietà nodeValue per permette di ottenere il valore del nodo, normalmente gli elementi danno come risultato null, apparte i nodi di testo, i commenti ed i nodi CDATA.

Clicca Qui per eseguire il codice.

var anchor = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];var valueTextAnchor = anchor.firstChild.nodeValue;alert(valueTextAnchor);

Come al solito le librerie ci vengono in aiuto mettendoci a disposizione delle funzioni sulla navigazione del dom. jQuery mette a disposizioni i seguenti metodi: .parent(), oppure :parent (quest'ultimo va usato come selettore) permette di selezionare l'elemento genitore, poi troviamo parents() che permette di memorizzare tutti i genitori fino ad arrivare alla radice. Il metodo next() si occupa di selezionare l'elemento fratello successivo, nextAll() seleziona tutti i fratelli successivi. Il metodo .prev() e prevAll() fa esattamente l'opposto di next() e nextAll() prende il fratello che lo precede. Per muoversi tra gli elementi figlio si utilizza il metodo children(), a supporto ci sono anche i selettori :first-child, :last-child che dal nome è facile capire cosa si occupano, mentre un'altro selettore utile è :nth-child() che permette inserendo un numero di selezionare gli elementi figlio saltando alcuni.

Alternativa jQuery

var genitore = $('#main').parent();var genitore = $('#main:parent');var genitori = $('#main').parents();var genitori = $('.test').next();var genitori = $('.test').nextAll();var genitori = $('.test').prev();var genitori = $('.test').prevAll();var genitori = $('.test:nth-child(2)'); //prende i figli a secondo del numero

Page 42: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Ottenere un riferimento agli attributi

Per ottenere un riferimento ad un attributo possiamo usare o il metodo getAttribute("attributo") oppure ottenerla considerandola come una proprietà dell'elemento, tipo se vogliamo ottenere l'attributo href bisogna fare così .href il primo caso dovrebbe essere il metodo da usare per essere conformi allo standard del W3c purtroppo è un metodo afflitto da vari problemi sui vari browser quindi è meglio utilizzare il secondo metodo:

Clicca Qui per eseguire il codice.

var linkNavigation = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];var linkNavigationAtt = linkNavigation.getAttribute('href'), linkNavigationAtt2 = linkNavigation.href;alert('getAttribute(\'herf\') \n' + linkNavigationAtt);alert('.href \n' + linkNavigationAtt2);

Per cambiare o aggiungere un attributo si può utilizzare il metodo .setAttribute(attributo,valore) sempre considerando l'attributo come una proprietà dell'elemento, si può per esempio assegnare allaproprietà .name un valore e questa oltre ad prendere quel valore, se l'elemento non ha quell'attributolo aggiungerà.

Clicca Qui per eseguire il codice.

var linkNavigation = document.getElementsByTagName('ul')[0].getElementsByTagName('li')[0].getElementsByTagName('a')[0];//creare un attributolinkNavigation.setAttribute('title', 'valore-attributo');linkNavigation.name = 'valore-attributo2';

//controllare se il valore è stato aggiuntovar linkNavigationAtt = linkNavigation.getAttribute('title');var linkNavigationAtt2 = linkNavigation.name;alert('.setAttribute(\'title\', \'valore-attributo\'); \n' + linkNavigationAtt);alert('.name = \'valore-attributo2\' \n' + linkNavigationAtt2);

jQuery come alternativa ai metodi nativi propone il metodo .attr(elemento, attributo) sia per crearlo, leggerlo e modficarlo. Per eliminare invece viene usato .removeAttr().

alternativa jQuery

$('#main').attr('style','color:blue;'); //modifica o crea$('#main').attr('style'); //legge$('#main').removeAttr('style'); //elimina

Prototype writeAttribute(element, attributes) readAttribute(attributes) //legge .remove()

alternativa Prototype

$('main').writeAttribute('style','color:blue;'); //modifica o crea$('main').readAttribute('style');

Gestire gli stili

Ogni elemento ha una proprietà chiamata .style che permette di aggiungere un qualsiasi stile inline, basta inserire in più lo stile che si vuole modificare.

Aggiungere un stile:

var element = document.getElementById('id-element')[0];element.style.color = '#000000';

Page 43: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

Per accedere a una determinata regola css, non basta trascrivere la regola css così come sono utilizzate nei fogli di stile, bisogna fare alcune modifiche per esempio alle regole come text-indent che hanno il trattino, esso infatti va eliminato usando quindi textIndent, comunque è abbastanza facile trovare la versione corretta online. Ora vediamo cosa ci offrono le librerie per aggiungere/modificare gli stili inline, jQuery ci propone il metodo .css()

alternativa jQuery

//inserire uno stile$('#main').css('background-color","yellow');

//inserirne più di uno richiede una sintassi diversa$('#main').css({ 'background-color':'yellow', 'font-weight':'bolder'});

Prototpe dal canto suo offre una versione ancora più fedele alla sintassi dei Css con il suo metodo .setStyle().

alternativa Prototype

$('main').setStyle({ backgroundColor: '#900', fontSize: '12px'});

Il metodo più corretto per aggiungere un gruppo stili rimane comunque quello di aggiungere una class, questo permette di gestire la manutenzione del codice distinta, così gli stili li andremo semprea modificare nei fogli di stile, mentre javascript si occuperà solo del comportamento (aggiungere una class). Purtroppo in javascript non esistono funzione native che si occupa delle class così possiamo scegliere se crearcela da noi, oppure utilizzare le librerie come jQuery.

Lavorare sulle class con le librerie

Le funzioni che andremo a creare risolveranno dei problemi abbastanza comuni come selezionare degli elementi attraverso una class, controllare l'esistenza di una class, aggiunta di una classe, eliminazione di una class. Queste funzioni siccome dovrebbero essere riutilizzate abbastanza spesso è meglio integrarle in un oggetto, creando così una libreria. Quindi come potrete vedere nel codice di questa pagina abbiamo creato il file library.js che è la nostra libreria.

Selezionare

Aggiungiamo il metodo alla libreria per selezionare un gruppo di elementi tramite una class

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.getElementsByClass = function(theClass){ var elementArray = []; if (typeof document.all != "undefined") { elementArray = document.all; } else { elementArray = document.getElementsByTagName('*'); }

var matchedArray = []; var pattern = new RegExp("(^| )" + theClass + "( |$)"); for (var i=0; i < elementArray.length; i++) {

Page 44: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

if (pattern.test(elementArray[i].className)) { matchedArray[matchedArray.length] = elementArray[i]; } } return matchedArray;};

//codice per attivare la funzione della libreriavar numeroClass = Library.getElementsByClass('test');

Se vogliamo affidarci alle librerie già consolidate come jQuery (scelta migliore) possiamo disporre delle stesse funzioni, anzi abbiamo degli strumenti molto più potenti. jQuery come spiegato prima utilizza il suo metodo $('.class') che può usare per selezionare qualsiasi metodo usando la sintassi dei css; con Prototype abbiamo a disposizione il metodo .getElementsByClassName(class) che permette anche un secondo argomento opzionale che restringe la ricerca, perchè usa il secondo come elemento genitore.

Alternativa Prototype

var test = document.getElementsByClass('test');var test2 = document.getElementsByClass('test', $('main'));

Controllare

Questo metodo che aggiungeremo alla libreria permette di verificare se un elemento possiede una class che inseriamo nell'argomento, restituisce true o false.

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.controlClass = function(target,theClass){ var pattern = new RegExp('(^| )'+theClass+'( |$)'); if (pattern.test(target.className)) { return true; } else { return false; }};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];alert(Library.controlClass(testElements,'test'));

Per controllare l'esistenza di una class, jQuery propone il metodo .hasClass(class)

alternativa jQuery

$('#main').hasClass('test')

Per controllare l'esistenza di una class, Prototype propone il metodo .hasClassName(class)

alternativa Prototype

$('main').hasClassName('test');

Aggiungere

Questo metodo si occupa di aggiungere una class.

clicca Qui per eseguire il codice.

Page 45: Programmare in javaScript - natalo.eu · verifica il programma si limita a saltare quest'ultima, con l'istruzione else viene riepito questo buco proponendo un codice condizionale

//codice nella libreriaLibrary.addClass = function(target,theClass){ if (!Core.hasClass(target,theClass)) { if (target.className == "") { target.className = theClass; } else { target.className += '' + theClass; } }};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];Library.addClass(testElements,'primo');alert('class="'+testElements.className+'"');

Per aggiungere una class, jQuery propone il metodo .addClass(class)

alternativa jQuery

$('#main').addClass('test')

Per aggiungere una class, Prototype propone il metodo .addClassName(class)

alternativa Prototype

$('main').addClassName('test');

Eliminare

Il metodo che creeremo servirà per cancellare una class, per vedere la sua efficacia prima aggiungeremo un class con il metodo .addClass e poi la elimeneremo.

clicca Qui per eseguire il codice.

//codice nella libreriaLibrary.removeClass = function(target,theClass){ var pattern = new RegExp('(^| )' + theClass + '( |$)'); target.className = target.className.replace(pattern,'$1'); target.className = target.className.replace(/ $/,'');};

//codice per attivare la funzione della libreriavar testElements = Library.getElementsByClass('test')[0];Library.addClass(testElements,'primo');alert('class="'+testElements.className+'"');Library.removeClass(testElements,'primo');alert('class="'+testElements.className+'"');

Per rimuovere una class, jQuery propone il metodo .removeClass(class)

alternativa jQuery

$('#main').removeClass('test')

Per rimuovere una class, Prototype propone il metodo .removeClassName(class)

alternativa Prototype

$('main').removeClassName('test');Conclusione (ma non del tutto...)

Questa è la fine della prima parte della mia guida su javaScript.