Guida a Javascript
Transcript
Guida a Javascript
Guida a Javascript 1.Introduzione a Javascript Javascript (spesso abbreviato come JS) è il linguaggio di scripting più diffuso sul Web. Chi affronta per la prima volta questo argomento, almeno in questa sede, dovrebbe sapere che a differenza di HTML, che è un linguaggio di markup, Javascript è un vero e proprio linguaggio di programmazione (o di scripting che dir si voglia) orientato agli oggetti (seppur in modo "limitato") ed agli eventi. Attraverso Javascript è possibile scrivere veri e prori "programmi" (script) attraverso i quali interagire con l'utente e con il sistema attraverso l'ausilio del browser che, dopo aver scaricato il codice sorgente del programma, ne darà esecuzione. In questo senso si parla di linguaggio di scripting lato client per distinguerlo dai linguaggi lato server dove l'interpretazione del codice è compito del server e non del client. Linguaggio "lato client" Come detto Javascript è un linguaggio di scripting lato client nel senso che la sua interpretazione ed esecuzione è a carico del client (del browser) e non del server (come invece accade, ad esempio, con ASP e PHP). Essendo "lato client" il codice sorgente del programma deve essere prima scaricato dal browser per poter essere interpretato. Ciò comporta dei tempi di esecuzione più lunghi (anche se in realtà, con la diffusione delle connessioni veloci, questo problema si è assai ridotto) e l'impossibilità di eseguire (direttamente) operazioni che coinvolgono il server come, ad esempio, la scrittura di dati all'interno del database (in questi casi è necessario ricorrere all'intermediazione della tecnologia AJAX). Un vantaggio dello scripting lato client è che l'elaborazione di programmi anche complessi non comporta nessun sovraccarico per la capacità computazionale del server il quale si limiterà a "trasmettere" il sorgente un po' come accade coi comuni documenti HTML. Linguaggio di scripting (o di programmazione)? la differenza, in realtà, è più che altro terminologica. Da un punto di vista formale Javascript è tecnicamente un linguaggio di scripting in quanto si definisce "di programmazione" un linguaggio in grado di creare programmi stand-alone cosa che con Javascript non è possibile fare, essendo necessario un altro programma (il browser) per eseguirne i comandi. Un linguaggio di scripting, quindi, è un'esemplificazione di un linguaggio di programmazione, dove il codice viene interpretato da un browser e non è direttamente eseguibile. Perchè utilizzare un linguaggio di scripting? La risposta è semplice, ed i conoscitori dell'HTML dovrebbero saperlo. Questi si saranno di certo chiesti come fare a far apparire in automatico la data su di una pagina, oppure come creare un sistema che al caricamento di una pagina reindirizzi il visitatore verso un'altra pagina dopo un determinato numero di secondi, o qualsiasi altra cosa che non è stato possibile fare con il semplice markup HTML. Con l'utilizzo di Javascript, in poche parole, è possibile dinamizzare una pagina HTML, interagire con l'utente ed automatizzare alcuni processi sulla base del verificarsi di taluni eventi legati al comportamento dell'utente, alle caratteristiche del sistema o ad eventi temporali. Scopo della guida Nelle prossime lezioni di questa guida cercheremo di affrontare gli aspetti principali del linguaggio e di capirne il suo funzionamento al fine di creare script, più o meno complessi, coi quali rendere maggiormente coinvolgente l'espereinza di navigazione degli utenti del nostro sito. Javascript e la programmazione ad oggetti Come già accennato all'inizio di questa lezione, Javascript permette un approccio alla programmazione sia di tipo procedurale che orientata agli oggetti (o OOP). In ealtà non è corretto parlare di OOP per Javascript, in quanto questo linguaggio non conosce i concetti di classe e di interfaccia, tanto meno di polimorfismo e non è un linguaggio fortemente tipizzato. Pur non essendo munito delle caratteristiche citate, Javascript permette ugualmente di creare degli oggetti. In questa sede non è il caso di addentrarci in concetti avanzati e complessi in quanto, essendo l'obiettivo di questa guida quello di formare l'utente ad un utilizzo di base del linguaggio, l'approccio classico (o procedurale) appare, pertanto, decisamente più consono. Alcuni accenni alla programmazione OOP saranno affrontati nella parte conclusiva di questo mauale. 2.Implementare il codice Javascript all' interno di una pagina HTML Come già detto, il codice Javascript viene implementato direttamente all'interno delle pagine HTML, frequentemente all'interno della sezione <head>, con l'utilizzo dei tag <script> e </script>. In realtà, è bene precisarlo, codice Javascript può essere inserito in qualsiasi punto del documento HTML, sia nell'<head> che nel <body> della pagina. La scelta di "dove" implementare il codice dipende da una pluralità di fattori che è difficile approfondire a questo punto della guida. In linea di assoluta approssimazione possiamo dire che gli script che producono direttamente un output (ad esempio appraverso un document.write()) vengono solitamente inclusi nel corpo visibile della pagina, mentre eventuali librerie, funzioni nonchè i codici che effettuano operazioni come redirect o l'apertura di pop-up vengono inserite nell'intestazione del documento. Editor Javascript Se volete scrivere codice Javascript non avete bisogno di nessun software particolare. Sia ben inteso: esistono diversi editor Javascript ma il loro utilizzo non deve essere inteso come indispensabile in quanto la loro utilità è data esclusivamente da funzioni di auto-completamento, dizionari incorporati e strumenti di debug. Per carità, non è poco... ma se potete farne a meno sappiate che per scrivere codice Javascript è sufficiente utilizzare un editor plain-text come il Blocco Note di Windows o Notepad++. Il tag <script> All'inizio della lezione abbiamo accennato al tag <script>, vediamo ora in maniera completa come preparare la pagina a ricevere del codice Javascript. L'utilizzo "completo" e scolastico del tag script prevede l'indicazione dell'attributo type. Questa indicazione in HTML 4 è necessaria, mentre in HTML 5 è assolutamente facoltativa. In HTML 4, quindi, utilizzeremo: <script type="text/javascript"> /* codice ed istruzioni javascript */ </script> In HTML 5, invece, sarà sufficiente: <script> /* codice ed istruzioni javascript */ </script> In passato era frequente notare l'utilizzo dell'attributo language in questo modo: <script language="javascript"> ma oggi questa sintassi è da considerarsi obsoleta (e quindi da NON utilizzare). In passato, ancora, era considerata buona norma utilizzare sempre il markup per i commenti HTML per rinchiudere il codice Javascript al fine di evitare che i browser privi del supporto per Javascript interpretassero il codice come testo, stampandolo a video: <script type="text/javascript"> <!-document.write('... ... ...'); document.write('... ... ...'); document.write('... ... ...'); //--> </script> Anche questo approccio può essere considerato superato in quanto, ad oggi, tutti i browser moderni supportano Javascript (e conoscono il tag <script>) che è diventato un componente fondamentale della navigazione on-line. Includere file Javascript esterni Quella che abbiamo visto qui sopra è la sintassi per aggiungere codice Javascript direttamente all'interno del sorgente del documento HTML. In realtà questa non è l'unica via per aggiungere codice Javascript ad una pagina Web. E' molto frequente, infatti, includere nella pagina file Javascript esterni (file con estensione ".js") dove sono contenute le sole istruzioni di scripting. Questa tecnica permette di separare nettamente il codice HTML dal codice di scripting ed è molto utile quando è necessario implementare lo stesso blocco di codice all'interno di una pluralità di pagine web. Per effettuare l'inclusione di file Javascript esterni si usa sempre il tag <script> specificando, all'interno dell'attributo src, la URL del file Javascript che si desidera includere: <script src="file-esterno.js"></script> In questo caso tra l'apertura del tag <script> e </script> non si scrive nulla. Hello World in Javascript Scriviamo un primo semplice programmino che stamperà a video una stringa di testo: <script> document.write("Ciao a tutti!!!"); </script> Questo è un classico esempio di codice che va implementato nel <body> della pagina nel punto esatto in cui si vuole appaia la stringa, ad esempio in un paragrafo oppure nella cella di una tabella. Si noti che al termine della nostra istruzione è stato inserito un punto e virgola. In realtà inserire il punto e virgola a fine riga non è obbligatorio in quanto l'interprete Javascript riconosce la fine di una riga di codice e lo inserisce automaticamente in memoria; è comunque buona norma di programmazione inserirlo. E' indispensabile, invece, se diverse istruzioni vengono scritte sulla stessa linea, ad esempio: document.write("Benvenuto"); document.write(" su Mr.Webmaster"); Il Tag <noscript> Al fine di evitare errori all'interno di browser obsoleti o qualora il supporto per javascript sia stato volontariamente disattivato dall'utente è possibile implementare il tag <noscript>. Questo tag si include al di sotto dello script o nel punto della pagina in cui si visualizza la sua esecuzione. All'interno del tag <noscript>, solitamente, si scrive un avviso del tipo: "Il tuo browser non supporta Javascript", o un qualunque messaggio che avvisi l'utente che la pagina non sarà visualizzata ne sarà funzionale come dovrebbe per mancanza del supporto di Javascript. Come detto il testo contenuto tra i tag <noscript> e </noscript> viene mostrato a video solo se viene rilevato che il browser non supporta Javascript, o per qualunque motivo detta funzione è stato disattivata. 3.I commenti in Javascript E' buona norma di programmazione commentare il codice, cioè aggiungere, all'interno del codice sorgente dello script, annotazioni ed appunti. Si tratta, in pratica, di inserire porzioni di codice che non dovranno essere interpretate dal browser come comandi Javascript, ne dovranno essere stampate a video. I commenti Javascript al codice, infatti, sono "ad uso e consumo" dello sviluppatore e servono per annotare determinati passaggi, ragionamenti o altro utile per successive modifiche o per attività di manutenzione. L'aggiunta di commenti al codice è una buona prassi di programmazione che dovrebbe essere seguita da ogni buon sviluppatore a prescindere dal linguaggio utilizzato. L'utilizzo dei commenti, inoltre, è da ritensersi indispensabile quando si lavora in gruppo in quanto è un modo efficente per spiegare "il perchè" di alcuni passaggi logici anche ad altre persone del team di sviluppo. Una cosa da tenere in considerazione quando si aggiungono commenti al codice Javascript è che questi, diversamente da quanto accade nei linguaggi lato server, saranno visibili a chiunque acceda al codice sorgente dello script. Commenti su singola linea o multi-liea I commenti in Javascript possono scriversi su di una riga con l'utilizzo dei simboli // o su più righe tra i simboli /* e */. Vediamo un esempio di commenti su una o su più righe: //Questo è un commento su una sola riga mentre /* Questo è un commento su più righe. Questa è la seconda riga. Questa è l'ultima riga. */ javascript... e i commenti HTML E' bene ricordare che in Javascript, anche se il codice viene inserito direttamente all'interno di una pagina HTML, non deve essere utilizzata la sintassi dei commenti HTML la quale produrrebbe un errore (fatta eccezione per il caso segnalato alla lezione precedente dove la sintassi dei commenti HTML è utilizzata per racchiudere l'intero codice dello script per evitare errori coi browser obsoleti). 4.Variabili e tipi di dato in Javascript In un qualsiasi linguaggio di programmazione un ruolo indispensabile e di primo piano è occupato dal concetto di variabile. Col termine "variabile" s'intende una porzione di memoria (del client) all'interno della quale vengono conservate alcune informazioni necessarie per lo svolgimento delle operazioni del programma. L'assegnazione di un valore ad una variabile in Javascript è molto semplice: var nomeVariabile; nomeVariabile = "contenuto"; Oppure: var nomeVariabile = "contenuto"; Attraverso var abbiamo creato la variabile ed in seguito l'abbiamo valorizzata. In realtà la dichiarazione della variabile (attraverso la clausola var) avrebbe potuto essere omessa in quanto Javascript non prevede la dichiarazione obbligatoria delle variabili. Quindi avremmo potuto scrivere semplicemente: nomeVariabile = "contenuto"; La sintassi dell'assegnazione del valore ad una variabile è elementare, da sinistra a destra abbiamo: il nome della variabile; l'operatore di assegnazione (=); il valore assegnato. Seguono alcune considerazioni importanti: Javascript è case-sensitive, questo significa che una variabile chiamata "miavariabile" sarà differente da un'altra variabile chiamata "MiaVariabile"; il nome della variabile: o non deve coincidere con una delle parole chiave del linguaggio; o non può iniziare con un numero; o non può contenere uno spazio; o non può contenere caratteri speciali come, ad esempio, il punto (.) ed il trattino (-). il valore assegnato deve essere contento all'interno di doppi apici (") o apici singoli (') se si tratta di una stringa; non servono se il valore della variabile è numerico, è null o booleano. NOTA: abbiamo appena detto che le stringhe vanno sempre racchiuse tra doppi apici (") o apici singoli ('). Ma come possiamo fare se è la stessa stringa a dover contenere uno di questo due caratteri? Le soluzioni sono due: 1) se la nostra stringa contiene apaci singoli racchiudiamola all'interno di doppi apici, o viceversa; 2) più correttamente impariamo ad utilizzare il carattere backslash in questo modo: var str1 = 'Oggi serve l\'ombrello'; var str2 = "Marco ha detto: \"ciao a tutti\""; In pratica abbiamo anteposto una backslash prima del carattere che avrebbe potuto essere interpretato da Javascript come "speciale" (nel nostro caso sarebbe stato identificato come il terminatore della stringa); così facendo il carattere viene semplicemente stampato a video e non interpretato. Tipi di dato: il valore delle variabili Le variabili in Javascript possono assumere differenti valori: stringa di testo; valore numerico (intero o decimale); valore booleano (true/false); valore NULL; Un tipo particolare di variabile è rappresentato dai vettori o array ma questo argomento verrà affrontato in una lezione successiva di questa nostra guida. Altri operatori di assegnazione Se si lavora con variabili numeriche, oltre all'uguale è possibile usare anche altri operatori di assegnazione, e cioè: += E' un operatore incrementale e viene usato così: x += y; Questa sintassi euqivale a: x = x + y; NOTA: Questo operatore può essere utilizzato anche per le variabili stringa che, ovvaimente, non vengono sommate ma concatenate. -= E' un operatore decrementale e viene usato così: x -= y; Questa sintassi euqivale a: x = x - y; *= E' un operatore di moltiplicazione e viene usato così: x *= y; Questa sintassi euqivale a: x = x * y; /= E' un operatore divisionale e viene usato così: x /= y; Questa sintassi euqivale a: x = x / y; %= E' un operatore modulare e viene usato così: x %= y; Questa sintassi euqivale a: x = x % y; variabili locali e variabilio globali Le variabili possono essere locali o globali, le prime servono a dichiarare un valore che verrà conservato in memoria per l'utilizzo della funzione o della routine in cui viene dichiarata, le seconde, al contrario, vengono dichiarate all'inizio di un blocco di script e possono essere utilizzate da una molteplicità di funzioni e routine. Vediamo un esempio di variabile locale: function mia_funzione() { var miaVariabile = 123; alert(miaVariabile); } In questo caso la nostra variabile miaVariabile esiste solo all'interno della funzione. Vediamo adesso un esempio di variabile globale: var miaVariabile = 123; function mia_funzione() { alert(miaVariabile); } In questo caso la variabile miaVariabile sarà accessibile ovunque ed è quindi definita "globale". 5.Le costanti in Javascript Le costanti, come lascia intuire il nome, servono a memorizzare dei valori che non possono cambiare durante l'esecuzione dello script. Javascript, storicamente, non ha mai supportato le costanti. Da un punto di vista prettamente convenzionale, molti sviluppatori Javascript sono soliti definire i valori costanti all'interno di comuni variabili caratterizzate da un nome in maiuscolo. var miavariabile = 123; var MIACOSTANTE = 456; Nelle nuove versioni del linguaggio (ECMAScript 6) si sta valutando la possibilità di consentire agli sviluppatori Javascript di creare vere e proprie costanti attraverso la keyword const in questo modo: const MIACOSTANTE = 456; In questo modo il valore sarà accessibile solo in lettura e non sarà modificabile ed eventuali operazioni di modifica o riassegnazione produrranno un errore Javascript. E' bene precisare, tuttavia, che si tratta - ad oggi - di una "proposta" (EMAScript 6 è, al momento in cui si scrive, nello stato di bozza) e che pertanto l'utilizzo di questa sintassi non è da considerarsi universalmente supportato ed è pertanto sconsigliato. 6.Gli operatori di Javascript In una precedente lezione abbiamo visto come defininire e valorizzare delle variabili in Javascript ed abbiamo visto che queste possono assumere diversi valori corrispondenti a diversi tipi di dato (stringa, numerico, booleano, ecc.). Se è vero che le variabili svolgono un ruolo da primo iano in un qualsiasi programma, è altrettanto vero che lo è altrettanto saper svolgere su di esse determinate operazioni come, ad esempio, operazioni matematiche, confronti, concatenazioni, ecc. Tutte queste operazioni sono fondamentali all'interno di un programma in quanto è attraverso di esse che il flusso di codice riesce a raggiungere il risultato (l'elaborazione) che il programmatore si è prefissato. In realtà alcuni operatori li abbiamo già incontrati nella lezione dedicata alle variabili, si tratta dei cosidetti operatori di assegnazione che sono utilizzati, come il nome lascia intendere, appunto per assegnare un valore ad una variabile. In questa lezione vedremo altre "famiglie" di operatori, più precisamente: operatori di concatenazione, operatori matematici, operatori di confronto e operatori logici. Operatori di concatenazione Gli operatori di concatenazione agiscono sulle stringhe e servono, come il nome lascia intendere, a concatenare due o più variabili stringa. Operatore + Attraverso il simbolo matematico del + è possobile concatenare due variabili stringa. Ad esempio: var str1 = 'Mr.'; var str2 = 'Webmaster'; document.write(str1 + str2); stamperà a video "Mr.Webmaster". Operatore += Attraverso l'operatore += viene concatenato il valore della variabile di sinistra all'espressione di destra: var str1 = 'Mr.'; str1 += 'Webmaster'; document.write(str1); stamperà a video "Mr.Webmaster". Operatori matematici Si tratta dei comuni operatori utilizzati per effettuare operazioni matematiche tra variabili numeriche. Questi sono: + Esegue un'addizione - Esegue una sottrazione * Esegue una moltiplicazione / Esegue una divisione % (modulo) calcola il resto intero della divisione tra due numeri Oltre a questi devono essere ricordati gli operatori ++ e -- utilizzati, rispettivamente, per incrementare e decrementare di una unità un valore numerico passato per una routine. Ad esempio: var num = 7; num++; documenti.write(num); stamperà a video: 8 var num = 7; num--; documenti.write(num); stamperà a video: 6 Operatori di confronto Questi operatori possono agire su diversi tipi di variabili (stringa, numerica, booleana, ecc.) e sono utilizzati per effettuare, appunto, dei confronti. L'esito del confronto genera un valore booleano (TRUE o FALSE). == Uguaglianza != Diversità < Minore <= Minore o uguale > Maggiore >= Maggiore o uguale Questo tipo di operatori assume un'importanza centrale all'interno delle strutture di controllo (o strutture condizionali) quando, cioè, l'esito del confronto tra due o più variabili diventa determinante al fine del comportamento del programma stesso. Vediamo qualche esempio di utilizzo degli operatori di confronto: var a = 10; var b = 3; if if if if (a (a (a (a == b) { ... } // il controllo restituisce FALSE != b) { ... } // il controllo restituisce TRUE < b) { ... } // il controllo restituisce FALSE > b) { ... } // il controllo restituisce TRUE Operatori logici Un altra serie molto importante di operatori è costituita da quella simbologia che consente di effettuare operazioni logiche di associazione (AND), alternanza (OR) e negazione (NOT). Anche questi operatori sono utilizzati nelle strutture di controllo del flusso di programma. && - L'operatore "AND" è utilizzato per creare condizioni complesse composte da una pluralità di sotto- condizioni; affinché la routine si verifichi è necessario che tutte le sotto-condizioni siano vere. || - L'operatore "OR" è utilizzato per creare condizioni complesse composte da una pluralità di sottocondizioni; affinché la routine si verifichi è necessario che almeno una delle sotto-condizioni sia vera. ! - L'operatore "NOT" indica una negazione all'interno di una routine. In sostanza si usa per invertire il significato di una condizione. Vediamo qualche esempio: var var var var if if if if a b c d = = = = 10; 3; 9; 24; (a == b && c < d) { ... } // il controllo restituisce FALSE (a != b && c < d) { ... } // il controllo restituisce TRUE (a > b || c == d) { ... } // il controllo restituisce TRUE (!(a > b)) { ... } // il controllo restituisce FALSE 7.Strutture condizionali in Javascript: if, else if e else Da questa lezione, sulla scorta delle nozioni apprese finora, inizieremo finalmente a scrivere qualche programmino degno di nota, per farlo dobbiamo, prima di tutto, prendere confidenza con le cosiddette strutture di controllo del flusso di programma o, più banalmente, le condizioni. Come in ogni linguaggio di programmazione che si rispetti, anche in Javascript, infatti, è possibile definire delle condizioni al verificarsi delle quali deve o meno accadere qualcosa. Per fare ciò ci si serve degli operatori if, else if, else i quali corrispondono alle locuzioni condzionali "se", "oppure se" e "oppure". La sintassi Javascript per eseguire un'istruzione if è la seguente: if (condizione) { istruzioni; } La condizione segue l'istruzione if e viene racchiusa tra parentesi tonde, mentre le istruzioni da eseguire - se la condizione si verifica - vengono racchiuse tra parentesi graffe. Se vi è una sola istruzione e questa viene scritta su una singola riga è possibile omettere le parentesi graffe come nell'esempio: if (condizione) istruzione; Possiamo anche dire al programma come comportarsi in caso la condizione non si verifichi, con l'ausilio di else: if (condizione) { istruzioni; }else{ istruzioni; } Utilizzando else non c'è bisogno di specificare tra parentesi tonde la condizione, dato che il programma valuterà tutte le altre situazioni possibili, all'infuori di quella specificata nell'istruzione if. Quindi se la condizione non si verifica il programma eseguirà quanto specificato nel blocco else. Quella che abbiamo visto è una struttura condizionale relativamente semplice: se la condizione X si verifica esegui questa operazione, in caso contrario esegui quest'altra. In realtà, però, è possibile creare strutture condizionali molto più complesse introducendo la clausola else if che in sostanza introduce N nuove possibiltà in quanto, a differenza di if e else che possono essere usate una volta soltanto, può essere utilizzata più volte per creare infinite nuove possibilità. if (condizione 1) { istruzioni; } else if (condizione 2) { istruzioni; } else if (condizione 3) { istruzioni; } else if (condizione N) { istruzioni; }else{ istruzioni; } Come avete visto i blocchi "else if" possono essere più di uno. Vediamo di seguito un esempio di una semplice struttura di controllo "scolastica" finalizzata a stampare a video un messaggio differente a seconda della risoluzione dello schermo dell'utente. var screenwidth = screen.width; if (screenwidth < 400) { document.write('Stai usando uno smartphone'); } if (screenwidth < 800) { document.write('Stai usando un tablet'); }else{ document.write('Stai usando un computer'); } Nel nostro esempio, molto banalmente, intercettiamo la larghezza dello schermo dell'utente e, attraverso una struttura condizionale a tre blocchi mostriamo un messaggio differente a seconda che la risoluzione lasci intendere l'utilizzo di uno smarphone, di un tablet o di un comune computer. Vediamo di seguito un esempio che mostra come costruire istruzioni condizionali composite. Più precisamente vedremo come utilizzare l'operatore logico AND (&&) per creare blocchi condizionali composti da più condizioni: // creo un oggetto data var saluto = new Date(); // individuo l'ora corrente var oo = saluto.getHours(); if (oo > 06 && oo <= 12) { document.write("Buon giorno!"); } else if (oo > 12 && oo <= 18) { document.write("Buon pomeriggio!"); } else if (oo > 18 && oo <= 22) { document.write("Buona sera!"); } else { document.write("Buona notte!"); } Creare condizioni complesse Quando si concatenano due o più condizioni è necessario stare molto attenti all'uso delle parentesi tonde. Se si concatenano diverse condizioni sempre col medesimo operatore l'uso di parentesi tonde (ulteriori a quelle "esterne" che racchiudono l'intera condizione) non è necessario: if (a == true && b == true && c == true) { ... } In questo caso il blocco if si realizzerà se tutte e tre le condizioni sono vere. L'uso delle parentesi diventa indispensabile, invece, se si costruiscono condizioni complesse utilizzando una pluralità di operatori logici: if ((a == true && b == true) || c == true) { ... } In quest'ultimo esempio il blocco if si realizzerà se "a" e "b" sono true oppure se è true la sola variabile "c". 8.L'istruzione switch di Javascript Nella precedente lezione abbiamo visto come creare una struttura condizionale utilizzando le clausole if, else if e else. In realtà questo costrutto non è l'unico tipo di struttura di controllo disponibile in Javascript. In questa lezione, infatti, vedremo come orientare il flusso di programma attraverso l'utilizzo del costrutto switch. Attraverso lo switch viene presa in esame una data variabile e vengono definiti una serie di comportamenti (casistiche) a seconda che quesa abbia un determinato valore. La sintassi di switch è la secuente: switch(variabile) { case valore1: istruzioni; break; case valore2: istruzioni; break; ... case valoreN: istruzioni; break; default: istruzioni; } Come potete notare: il costrutto si apre con la parola switch seguita da una parentesi tonda al cui interno è specificata la variabile da valutare; vengono definiti una serie di casistiche attraverso la parola case seguita dai due punti (:) e poi da un possibile valore della variabile presa in esame; all'interno di ogni blocco case sono inserite delle istruzioni al termine delle quali deve essere inserito il comando break al fine di interrompere il flusso dello switch; l'ultimo blocco è contraddistinto dalla parola default seguita dai due punti (:) che definisce le istruzioni da eseguire qualora nessuno dei casi si sia verificato. Come avrete capito si tratta di una sintassi che, in alcune circostanze, può essere usata in alternativa al classico if. Vediamo un esempio: // creo un oggetto data var oggi = new Date(); // individuo il mese corrente var mese = oggi.getMonth(); switch (mese) { case 0: alert("Gennaio"); break; case 1: alert("Febbraio"); break; case 2: alert("Marzo"); break; case 3: alert("Aprile"); break; case 4: alert("Maggio"); break; case 5: alert("Giugno"); break; case 6: alert("Luglio"); break; case 7: alert("Agosto"); break; case 8: alert("Settembre"); break; case 9: alert("Ottobre"); break; case 10: alert("Novembre"); break; case 11: alert("Dicembre"); break; } E' evidente come un simile risultato si sarebbe potuto raggiungere anche utilizzando una serie di if ed else if. Evidentemente la scelta su quale sintassi utilizzare dipende esclusivamente dalle preferenze del programmatore. 9.L'operatore ternario di Javascript Oltre ai costrutti if ... else if ... else ... e switch esiste anche una terza sintassi attraverso la quale è possibile incanalare il flusso di programma a seconda che una data condizione si verifichi oppure no. Questa sintassi è nota come operatore ternario e consiste in un modo "compatto" attraverso il quale scrivere un'istruzione condizionale. E' bene precisare che questo tipo di sintassi è molto comoda ed utile se si devono affrontare condizioni semplici del tipo if... else... mentre è assolutamente meno adatta a controlli complessi ed articolati, anche perchè questo tipo di sintassi si scrive su una linea singola e non si può andare a capo. Vediamo la sintassi dell'operatore ternario in Javascript: condizione ? istruzione1; : istruzione2; Possiamo tradurre questa sintassi in questo modo: se la condizione è vera esegui l'istruzione n1., in caso contrario esegui l'istruzione n2. Possiamo dire, dunque, che il simbolo punto interrogativo (?) che segue alla condizione equivale ad una if ed i due punti (:) ad un else. Vediamo un esempio pratico: var piove = false; document.write(piove == true ? 'Fuori piove' : 'Non server l\'ombrello'); Nell'esempio qui sopra abbiamo utilizzato una sola condizione (piove == true) ma nessuno ci vieta di utilizzare, anche con l'operatore ternario, delle comdizioni composite, ad esempio: var piove = false; var freddo = true; document.write(piove == true && freddo == true ? 'Piove e fa freddo' : 'Ho visto giornate peggiori'); Da segnalare, infine, che è possibile combinare tra loro due o più operatori ternari per gestire situazioni più complesse, ad esempio: var piove = false; var sole = true; document.write(piove == true ? 'Fuori piove' : (sole == true ? 'Che bella giornata!' : 'Piuttosto nuvoloso')); In questo caso il primo operatore (cioè quello più esterno) verifica il valore della variabile "piove", mentre il secondo (che si attiva solo se questa prima variabile è false) effettua un controllo sulla seconda variabile "sole" per decidere quale frase stampare a video. 10.I cicli in Javascript: for, while e do-while Per una serie di motivi che scopriremo nel corso di questa lezione, nonchè nelle successive, può nascere l'esigenza di dover ripetere una serie di istruzioni un determinato numero di volte, o finchè non si verifichi una data condizione. In tali circostanze è necessario ricorrere alle iterazioni o, più comunemente, ai cicli. Javascript supporta diverse strutture iterative: for while do while Vediamole una ad una cercando di illustrarne il funzionamento anche facendo ricorso ad esempi pratici di utilizzo. Il ciclo for() Un ciclo for() serve a ripetere una serie di istruzioni un determinato numero determinato di volte. Per definire un ciclo for() si imposta: una variabile contatore a cui si assegna un valore di partenza arbitrario (solitamente 0); la condizione di terminazione (cioè un valore della variabile contatore che, una volta raggiunto, blocca il ciclo); ed uno step (cioè l'incremento - o decremento - da applicare alla variabile contatore ad ogni passaggio del ciclo). La dichiarazione della variabile contatore è opzionale, ma le buone norme di programmazione gradiscono che venga dichiarata. Vediamo un esempio: var i; for (i=0; i<3; i++) { /* istruzioni che verranno ripetute 3 volte */ } Come potete vedere abbiamo definito una variabile "i" che svolge il ruolo di contatore. All'interno delle parentesi tonde che seguono a for abbiamo definito il valore di partenza (i=0), la condizione che termina il ciclo (i<3) ed il nostro step (i++). In pratica for eseguirà le istruzioni contenute tra le parentesi graffe per tre volte in quanto al primo passaggio "i" avrà valore 0, al secondo 1, al terzo 2 ed a questo punto si stopperà in quanto la condizione di terminazione ci dice che il ciclo dovrà continuare sino a quanto "i" è minore di 3. Più avanti, nel corso di questa guida, ritroveremo i cicli for() nella lezione dedicata agli array dove assumono un ruolo determinante nell'esplorazione del contenuto del vettore. L'articolo continua dopo la pubblicità Il ciclo while() A differenza di for(), il ciclo while() non prevede l'utilizzo di alcun contatore ma semplicemente l'indicazione di una condizione di terminazione: il ciclo terminerà non appena la condizione impostata si realizza. La sintassi è la seguente: while (condizione) { istruzioni; } Vediamo un esempio banale: var i = 0; while (i < 10) { document.write('Conto: ' + i); i++; } che equivale a: var i; for (i=0; i<10; i++) { document.write('Conto: ' + i); } Nell'esempio qui sopra, come in for(), il ciclo è determinato da una variabile numerica, in realtà nulla vieta di impostare un ciclo while() che utilizza come condizione un altro tipo di variabile come, ad esempio, un valore booleano. Il ciclo do while() La struttura do while() è una variante di while(). La differenza tra le due sintassi consiste nel fatto che il controllo della condizione avviene dopo l'esecuzione dell'istruzione e non prima; la differenza, da un punto di vista pratico, è che l'istruzione viene eseguita sempre almeno una volta. Questa la sintassi: do { istruzioni; } while (condizione); Vediamo un esempio pratico: var i = 0; do { document.write('Conto: ' + i); i++; } while (i < 10); Attenzione ai loop! In chiusura di questa lezione dedicata i cicli ritengo doveroso un avvertimento: quando impostate un ciclo abbiate sempre cura di impostare con attenzione la condizione conclusiva che deve SEMPRE verificarsi. Ricordatevi, infatti, che se la condizione non si realizza mai... il ciclo continua all'infinito (cosidetto loop). Da un punto di vista pratico un loop comporta un esaurimento delle risorse del client ed un blocco del browser, quindi si tratta di una situazione che non deve mai potersi verificare! 11.I comandi break e continue di javascript In tema di cicli è importante citare due fondamentali comandi del Javascript, ovvero break e continue. break Il comando break lo abbiamo già visto quando abbiamo analizzato la struttura di controllo switch; in realtà i suoi ambiti di impiego non si esauriscono li, in quanto break può essere utilizzato anche all'interno di strutture iterative come, ad esempio, for(). Vediamo un esempio: var i; for (i = 0; i < 10; i++) { if (i == 3) break; document.write('Conto: ' + i); } Come facile intuire, il comando break ha la funzione di interrompere il ciclo in un momento arbitrario; così facendo l'interprete Javascript blocca l'esecuzione del ciclo e riprende l'interpretazione del codice a partire dalle istruzioni successive al ciclo stesso. continue Il comando continue serve, invece, per stoppare una singola iterazione del ciclo o, più semplicemente, per saltare un passaggio. Si supponga, ad esempio, di voler stampare a video una serie di numeri ad esclusione di uno specifico valore: var i; for (i = 0; i < 10; i++) { if (i == 3) continue; document.write('Conto: ' + i); } Nel nostro esempio verranno stampati tutti i numeri da 0 a 9 ad esclusione del 3. Attraverso continue, in pratica, l'interprete Javascript "salta" una specifica iterazione passando alla successiva. Se con break il ciclo terminava anzitempo, con continue questo procede sino alla sua fine naturale. 12. Gli eventi in Javascript Perchè accada un qualcosa, sia nella vita che in programmazione, c'è bisogno che "questo qualcosa" sia scatenato da un evento: nella vita, ad esempio, un incontro può far accadere qualcosa di piacevole (si spera!), in programmazione il click del mouse, la pressione di un pulsante, il resize della finestra, ecc. su possono scatenare una determinata routine. In poche parole possiamo definire un evento Javascript come qualcosa che accade all'interno del documento HTML che è il nostro contesto. Nella maggior parte dei casi a scatenare l'evento è un comportamento ell'utente (ad esempio un click su un dato elemento della pagina) altre volte, invece, è una situazione contingente che prescinde da una qualsivoglia azione dell'utente (come ad esempio il caricamento della pagina). Javascript supporta moltissimi eventi che, con l'evolversi del linguaggio, sono andati via via arricchendosi. In questa lezione vedremo gli eventi principali e più utilizzati e, soprattutto, vedremo come utilizzarli al fine di indirizzare il comportamento dei nostri script. la sintassi degli eventi Javascript L'evento si richiama direttamene all'interno dell'elemento HTML che lo riguarda, incorporando un attributo nel codice dell'elemento stesso; la seguente è la sintassi: <elemento attributoEvento="istruzione Javascript"> Vediamo un esempio pratico implementando un evento onclick su un pulsante: <input type="button" value="Invia" onclick="alert('Hai cliccato!')"> Dato che l'HTML non è un linguaggio case-sensitive (sensibile alle maiuscole ed alle minuscole) è indifferente scrivere onClick, onclick oppure ONCLICK, ma è necessario specificare i parametri (ad esempio il nome della funzione) con le giuste maiuscole e minuscole all'interno di un evento (Javascript, infatti, è case-sensitive). I principali eventi Javascript Riporto qui sotto un elenco degli eventi e dei relativi gestori, con opportuna descrizione. Gli eventi del tag <body>: onload, onunload, onresize e onscroll Due eventi molto utilizzati in associazione al corpo della pagina sono onload e onunload attraverso i quali si intercetta, rispettivamente, l'apertura e la chiusura della pagina. Vediamo qualche esempio: <body onload="alert('Benvenuto!');"> <body onunload="alert('Torna a trovarci!');"> Da segnalare che l'evento onload può essere efficacemente applicato anche al tag <img> per identificare il momento in cui la data immagine viene effettivamente scaricata dal browser. Altri eventi associabili al corpo della pagina sono onresize e onscroll che servono, rispettivamente, ad intercettare il ridimensionamento della finestra e lo scrolling al suo interno. Quest'ultimo evento, oltre che al tag <body>, può essere associato anche ad altri elementi della pagina come, ad esempio, un DIV con overflow:scroll. Gli eventi legati al mouse: onclick, onmouseover, onmouseout, ecc. L'attività del mouse è, solitamente, uno dei fattori più rilevanti all'interno di buona parte delle applicazioni web. Un click su un elemento o il passaggio del cursore in una determinata porzione della pagina, infatti, sono tra gli eventi più comunemente utilizzati. I più importanti di questi sono: onclick - click col tasto sinistro del mouse; ondblclick - doppio click col tasto sinistro del mouse; oncontextmenu - click col tasto destro del mouse; onmouseover - ingresso del mouse su un dato elemento; onmouseout - uscita del mouse da un dato elemento; onmousemove - il cursore del mouse si sta muovendo sopra un dato elemento; Questi eventi possono essere associati ad una molteplicità di tag HTML come, ad esempio, immagini, div, paragrafi, bottoni, ecc. Vediamo di seguito alcuni esempi: <img src="foto.jpg" onclick="alert('Hai cliccato la foto!')"> <img src="foto.jpg" ondblclick="alert('Hai fatto doppio click sulla foto!')"> <img src="foto.jpg" onmouseover="alert('Sei passato col mouse sulla foto!')"> <img src="foto.jpg" onmouseout="alert('Hai spostato il mouse fuori dalla foto!')"> Gli eventi legati alla tastiera: onkeypress, onkeydown e onkeyup Un altra serie importante di eventi è scatenata dalla pressione, da parte degli utenti, dei tasti della tastiera del computer. Gli eventi rilevanti sono tre: onkeypress - generica pressione di un tasto; onkeydown - l'evento si scatena mentre l'utente sta premendo un tasto; onkeyup - l'evento si scatena quando l'utente rilascia un tasto che ha premuto; Vediamo un esempio: <input type="text" onkeydown="alert('hai premuto un tasto!')"> Eventi legati ai form: onsubmit, onreset, onchange, ecc. Una altra fitta serie di eventi Javascript è quella che riguarda i form ed i loro elementi. I due eventi che riguardano il tag <form> sono onsubmit e onreset utilizzati, rispettivamente, per intercettare l'invio ed il reset di un modulo HTML. Esempi: <form onsubmit="alert('Hai inviato il modulo!')"> <form onreset="alert('Hai cancellato il modulo!')"> Gli eventi che riguardano i singoli elementi dei form (input, textarea, select, ecc.) sono, invece, molteplici. I più utilizzati sono: onfocus - l'elemento viene selezionato (e quindi attivato); onblur - l'elemento perde il focus (e quindi disattivato); onchange - l'elemento viene modificato nel contenuto; Per fare un esempio: un campo input acquista il focus quando ci si clicca sopra per iniziare a scriverci dentro, viceversa lo perde quando si clicca su un altro elemento. Per quanto riguarda l'evento change questo è tipico delle selectbox, dei campi input e delle textarea e si verifica quando, a seguito dell'azione dell'utente, si ha un cambiamento del loro contenuto.. Altri eventi Oltre a quelli menzionati, Javascript supporta molteplici altri eventi legati, ad esempio, al trascinamento di un elemento draggable o alla riproduzione di elementi multimediali. In questa sede, tuttavia, non ritengo opportuno affrontare tematiche ulteriori a quelle "di base" e pertanto rinvio il lettore a futuri ad ulteriori approfondimenti. 13. Creare funzioni in Javascript Uno degli elementi chiave di un programma, in questo caso di un programma Javascript, sono la funzioni. Una funzione raccoglie in se tutte le istruzioni per assolvere ad un determinato compito all'interno di un programma. Una funzione, quindi, è una parte (relativamente) autonoma di un programma in quanto assolve ad un compito specifico che può essere ripetuto più volte in diversi punti del programma stesso. Organizzare un programma in funzioni consente una maggiore pulizia del codice sorgente e, soprattutto, facilita il riutilizzo del codice e, di conseguenza, consente di creare programmi più snelli e semplici di mantenere ed aggiornare. La sintassi per creare una funzione in Javascript è la seguente: function nomeFunzione(argomenti) { istruzioni; } Utilizziamo la parola chiave function, assegniamo un nome alla funzione, in questo caso "nomeFunzione" e, come si può constatare, utilizziamo le parentesi tonde subito dopo per passare alla funzione eventuali argomenti (cioè dei dati che la funzione potrà utilizzare per la sua elaborazione). Si noti che il passaggio di argomenti è del tutto facoltativo, in mancanza il nome della funzione sarà seguito da delle parentesi vuote (non essendo possibile ometterle). Il contenuto della funzione, ovvero le istruzioni che compongono il programma, viene racchiuso tra parentesi graffe { e }. E' importante non dare alle funzioni nomi che indicano parole chiave utilizzate da Javascript, ad esempio non è possibile utilizzare write() come nome di una funzione: "write", infatti, è un metodo dell'oggetto document e creando una funzione con questo nome (o con altre parole riservate) ci verrà restituito un errore. E' tuttavia possibile utilizzare il nome Write() oppure WRITE(), dato che javascript è un linguaggio case-sensitive, ovvero riconosce differenze tra maiuscolo e minuscolo: in questo modo l'interprete non riconoscerà la funzione Write() come nome di un metodo, ma come parola "estranea" alla sintassi Javascript e la considererà valida. Valgono, inoltre, per i nomi delle funzioni le stesse considerazioni fatte in occasione dei nomi delle variabili. Parametri nelle funzioni Un parametro è in genere un valore soggetto a variazioni, ad esempio una stringa di testo o un numero. I parametri vengono "passati" alla funzione all'interno delle parentesi tonde che seguono al nome della funzione. Se sono più di uno, i parametri delle funzione devono essere separati da una virgola. function nomeFunzione(arg1, arg2, ..., argN) { istruzioni; } Facciamo un esempio di una semplice funzione per il calcolo dell'IVA su un prezzo. function calcolaIVA(prezzo,aliquota){ var iva = (prezzo/100)*aliquota; alert(iva + ' Euro'); } Per richiamare la funzione: <span onclick="calcolaIVA(100,22)">clicca qui</span> Facendo click apparirà un alert con il valore dell'IVA applicata al prezzo passato in argomento (nel nostro caso il risultato sarà "22 Euro"). Impostare un valore di ritorno con return Nel nostro esempio il risultato della funzione viene mostrato all'interno di una finestra di avviso. Molto spesso, in realtà, il frutto dell'elaborazione di una funzione viene restituito attraverso l'utilizzo della keyword return, viene cioè restituito sotto forma di valore di ritorno. Così facendo la funzione non si interessa del modo in cui il valore verrà eventualmente mostrato a video... ma si limita ad effettuare la sua elaborazione ed a restituirne il risultato alla routine principale. Vediamo, quindi, l'esempio del nostro calcolatore di IVA modificato: function calcolaIVA(prezzo,aliquota){ var iva = (prezzo/100)*aliquota; return iva; } Per ottenere lo stesso risultato di prima, quindi, avremmo dovuto impostare l'alert() direttamente nell'evento onclick del tag <span> in questo modo: <span onclick="alert(calcolaIVA(100,22))">clicca qui</span> L'utilizzo di return è molto utile quando la funzione viene utilizzata in diversi punti del programma ed il suo risultato manipolato in modi differenti. Utilizzando return, inoltre, il risultato di una funzione può essere utilizzato anche per valorizzare una variabile: var tax = calcolaIVA(100,22); 14. Oggetti nativi di Javascript Come detto nella lezione introduttiva, Javascript è un linguaggio orientato agli oggetti, questo significa che allo sviluppatore è consentito creare degli oggetti personalizzati (come vedremo in una delle lezioni conclusive di questa guida) e che nelle stesse API del linguaggio sono già presenti degli oggetti nativi che vengono messi a disposizione dello sviluppatore. In quest'ultima accezione possiamo, dunque, definire un oggetto come la parola chiave che permette di richiamare una libreria incorporata nel browser: ma un oggetto da solo serve a poco... bisogna, infatti, che un metodo o una proprietà vi facciano riferimento. La sintassi corretta per separare il nome di un oggetto da un metodo o da una proprietà è: oggetto.metodo(parametri) oppure oggetto.proprietà dunque con l'utilizzo del carattere punto (.) quale elemento di concatenazione tra l'oggetto ed il metodo o la proprietà. I nomi dei metodi sono seguiti da parentesi tonde all'interno delle quali si "passano" dei parametri, diversi (per numero e tipo) a seconda del caso. Le proprietà, invece, restituiscono (GET) o settano (SET) dei valori propri dell'oggetto in questione. Nel corso delle prime lezioni di questa guida abbiamo già visto all'opera un metodo, più precisamente il metodo write dell'oggetto document: document.write('Scrivo qualcosa...'); Vediamo ora un esempio circa il funzionamento delle proprietà sia per recuperare un valore (GET) che per settarne uno nuovo (SET). Per il nostro esempio faremo riferimento alla proprietà href dell'oggetto location: /* Estraggo la URL della pagina corrente /* var pagina = location.href; /* Setto una nuova URL per un redirect */ location.href = 'http://www.sito.com/nuova-pagina.html'; Gli oggetti nativi più importanti di Javascript sono: window - questo oggetto rappresenta la finestra del browser; fanno parte dell'oggetto window altri due (sotto)oggetti: o location - questo oggetto rappresenta la URL corrente; o history - questo oggetto contiene la cronologia delle URLs visitate dall'utente; navigator - questo oggetto contiene una serie di informazioni riguardo al browser utilizzato dall'utente; screen - questo oggetto contiene una serie di informazioni relative alla risoluzione dello schermo dell'utente; document - questo oggetto fa riferimento al documento aperto nel browser o, più precisamente, al suo nodo radice; appartengono all'oggetto document tutti gli oggetti corrispondenti a ciascun (sotto)nodo del documento HTML; A ciascun elemento, ancora, appartengono tutti gli oggetti corrispondenti ad eventuali attributi; Come avrete capito l'oggetto document è il più complicato in quanto è strutturato in vari livelli, quindi abbiamo diversi oggetti tra loro concatenati, ad esempio: /* Accedo ad uno specifico nodo del documento HTML Ad esempio recupero tutto il suo contenuto attraverso la proprietà innerHTML */ var contenuto = document.getElementById('mioParagrafo').innerHTML; /* Accedo ad uno specifico attribito di un dato nodo HTML Ad esempio recupero il valore dell'attributo alt di un'immagine attraverso la proprietà value */ var stile = document.getElementById('miaImmagine').alt.value; In realtà la manipolazione del DOM è assai complicata e torneremo più avanti sull'argomento. Per il momento ci si limiti a questi semplici esempi giusto per capire in che modo è strutturato l'oggetto document. Altri oggetti di Javascript: Date, Math, Array, RegExp Oltre a quelli citati, Javascript dispone di altri oggetti integrati nelle API del linguaggio. Questi oggetti sono utilizzati per svolgere operazioni comuni come, ad esempio, operazioni sulle date, calcoli matematici, la creazione di vettori ed eseguire controlli tramite espressioni regolari. Date, Array, RegExp necessitano di un costruttore per poter essere utilizzati: var data = new Date(); var vettore = new Array(); var re = new RegExp(); L'oggetto Math, invece, non necessità di un costruttore. Ad esempio: var n = 0.97; var i = Math.ceil(n); document.write(i); Vedremo più approfonditamente in seguito il funzionamento di ciascuno di questi oggetti. 15. L'oggetto this di Javascript Una parola molto importante nella programmazione Javascript è this, grazie a questo particolare identificatore, infatti, è possibile far riferimento "a se stesso" (in inglese "this" vuol dire letteralmente "questo"). L'utilizzo di this in Javascript differisce rispetto ad altri linguaggi orientati agli oggetti. Come detto, infatti, Javascript non conosce il concetto di classe e pertanto non è sempre facile identificare l'oggetto al quale this si riferisce. Il problema principale, quindi, è identificare il contesto al quale this fa riferimento. Utilizzare this inline L'utilizzo più comune di this è inline all'interno cioè di un tag HTML; vediamo un esempio: <span onclick="alert(this.tagName.toLowerCase());">clicca qui</span> Nel nostro esempio, cliccando si aprirà un alert con all'interno la dicitura "span". Il contesto di this, infatti, è rappresentato dal tag a cui è applicato l'evento, quindi, nel nostro esempio, il tag <span>. Utilizzare this all'interno di una funzione L'oggetto this, però, può essere utilizzato anche all'interno di una funzione, ma in questo caso le cose si fanno più complesse. facciamo un esempio: function faccioQualcosa() { alert(this.style.color); } Richiamando la funzione senza associarla ad alcun oggetto: <script>faccioQualcosa();</script> Questa produrrebbe un errore! In mancanza di un'associazione esplicita con un oggetto, infatti, il this si presume riferito al generico oggetto window e, pertanto, nel caso concreto finirebbe col produrre un errore. Vediamo un altro esempio: document.getElementById('mioDiv').onclick = faccioQualcosa(); In questo caso la funzione, invece, produrrebbe il risultato atteso, cioè mostrerebbe - all'atto del click - un alert con il valore della proprietà CSS "color" settata nell'attributo "style" dell'elemento selezionato. In questo caso, infatti, il contesto di this sarebbe lo specifico oggetto relativo all'elemento selezionato. Il contesto, infatti, sarebbe: document.getElementById('mioDiv') e non più il generigo oggetto window. Utilizzare this all'interno di un oggetto Un altro ruolo importante di this è all'interno di un oggetto. Nell'ottica di una programmazione orientata agli oggetti, infatti, l'oggetto this assume un significato particolare. Dentro ad un oggetto, infatti, this fa riferimento all'oggetto stesso. 16. L'oggetto window di Javascript E' l'oggetto principale di Javascript ed è rappresentato dall'intera "finestra" del browser. Se la finestra è composta da una pluralità di frames (ad esempio perchè nella pagina sono presenti degli <iframe>) il browser creerà un'oggetto window per la finestra e tanti altri oggetti window per quanti sono i frame attivi nella pagina. L'oggetto window è ricco di proprietà e metodi, vediamo di seguito i più utilizzati: Proprietà dell'oggetto window frames - (GET) restituisce un array contenente tutti i frames presenti nella pagina; innerHeight e innerWidth - (GET) restituisce l'altezza e la larghezza interna della finestra del browser; lenght - (GET) restituisce il numero dei frames presenti nella finestra; opener - (GET) restituisce il riferimento alla finestra madre che ha aperto la finestra corrente (se esiste); outerHeight e outerWidth - (GET) restituisce l'altezza e la larghezza esterna della finestra del browser (comprende toolbar e scrollbar); pageXOffset e pageYOffset - (GET) restituisce il valore (in pixel) dell'eventuale scroll suall'asse orizzontale e verticale; parent - (GET) restituisce il riferimento alla finestra che contiene il frame corrente; self - (GET) restituisce un riferimento alla finestra corrente; top - (GET) restituisce un riferimento alla finestra principale (utile in caso di frames incapsulati); Metodi dell'oggetto window alert() - mostra una finestra di avviso; close() - chiude la finestra corrente; confirm() - mostra una finestra di dialogo con un messaggio di richiesta conferma; open() - apre una nuova finestra; print() - stampa (invia alla stampante) il contenuto della finestra corrente; prompt() - apre una finestra di dialogo dove l'utente è invitato a scrivere qualcosa in un campo testo; scrollTo() - esegue uno scrolling automatico del documento verso le coordinate specificate. setInterval() e clearInterval() - imposta (ed annulla) una serie di istruzioni da eseguirsi ad intervalli di tempo prestabiliti; setTimeout() e clearTimeout() - imposta (ed annulla) una serie di istruzioni da eseguirsi una volta dopo un dato intervallo di tempo; Molti metodi dell'oggetto window saranno approfonditi in seguto all'interno di lezioni dedicate come nel caso delle finestre di dialogo (alert, confirm e prompt) e delle temporizzazioni (setInterval, clearInterval, setTimeout, clearTimeout). Nella prossima lezione, invece, approfondiremo l'utilizzo del metodo open() vedendo come creare e gestire finestre a comparsa (pop-up). 17. Gestire finestre pop-up con Javascript In questa lezione approfondiremo la tematica legata all'oggetto window, in particolare vedremo come creare e gestire finestre pop-up. Con questo termine si intende una finestra del browser aperta attraverso un comando Javascript. Tali finestre possono, inoltre, avere un aspetto particolare in quanto, con Javascript, è possibile personalizzare alcune caratteristiche della finestra come le dimensioni, la presenza o meno della statusbar, della scrollbar, ecc. Iniziamo col dire che per aprire una finestra pop-up con javascript si utilizza il metodo open() dell'oggetto window. Questa la sua sintassi: window.open('URL', 'Nome della finestra', 'Stile') Tutti gli argomenti del metodo open() sono facoltativi quindi, in teoria, se volessimo aprire una finestra vuota del browser basterebbe utlizzare: window.open(); Se volessimo semplicemente impostare una URL: window.open('http://www.mrwebmaster.it/'); Personalizziamo l'aspetto del pop-up Attraverso il terzo parametro del metodo open() abbiamo la possibilità di personalizzare l'aspetto della nostra finestra a comparsa. Vediamo un esempio: function ApriPopUp(pagina) { var stile = "top=10, left=10, width=250, height=200, status=no, menubar=no, toolbar=no scrollbars=no"; window.open(pagina, '', stile); } All'interno della variabile stile abbiamo definito una serie di parametri di personalizzazione, che sono: top e left - definiscono (in pixel) la posizione della finestra impostando una distanza dal margine superiore e sinistro dello schermo; width e height - definiscono larghezza ed altezza (in pixel) della finestra; status - mostra o meno la barra di stato (yes/no); menubar - mostra o meno la barra dei menu (yes/no); toolbar - mostra o meno la barra degli strumenti (yes/no); scrollbars - mostra o meno le barre di scorrimento (yes/no); Aprire un pop-up centrato nella pagina Una delle esigenze più comuni quando si lavora con le finestre a comparsa consiste nel centrare il pop-up nella pagina. Per farlo non esistono trucchi particolari ma è sufficiente fare quattro conti e settare, nel modo corretto, i valori di top e di left: function ApriPopUp(pagina,w,h) { var t = Math.floor((screen.height-h)/2); var l = Math.floor((screen.width-w)/2); var stile = "top="+t+", left="+l+", width="+w+", menubar=no, toolbar=no scrollbars=no"; height="+h+", status=no, window.open(pagina, '', stile); } Come potete vedere, in questa funzione vengono passati tre parametri: la URL della pagina da aprire nel pop-up; la larghezza del pop-up (in pixel); l'altezza del pop-up (in pixel); All'interno della funzione vengono, poi, calcolati dinamicamente i valori di scostamento (top/left) sulla base di un semplice conto matematico: scostamento da sinistra = (larghezza dello schermo - larghezza del pop-up) / 2 Il medesimo calcolo è fatto per la determinazione dello scostamento dal margine superiore. 18. L'oggetto history di Javascript L'oggetto history fa parte dell'oggetto window e contiene informazioni relative alla cronologia delle URL visitate all'interno della finestra corrente. Proprietà dell'oggetto history Questo oggetto dispone della sola proprietà lenght che restituisce il numero delle URL presenti nella cronologia. Metodi dell'oggetto location I metodi supportati dall'oggetto history sono tre: back() - carica la URL precedente a quella corrente (corrisponde cliccare il tasto back del browser); forward() - carica la URL successiva a quella corrente (corrisponde cliccare il tasto next del browser); go() - caraica una specifica URL tra quelle presenti in cronologia; Vediamo qualche esempio: <span onclick="window.history.back()">vai alla pagina precedente</span> <span onclick="window.history.forward()">vai alla pagina successiva</span> Ovviamente questi metodi non funzionano se la cronologia è vuota o mancano, rispettivamente, una pagania precedente o una successiva. <span onclick="window.history.go(-2)">Torna indietro di due pagine</span> Attraverso il metodo go() è posibile passare dei valori negativi (per tornare indietro) o positivi (per spostarsi in avanti nella cronologia). Vale per il metodo in questione la stessa considerazione fatta per i metodi back e forward. 19. L'oggetto location di Javascript Attraverso l'oggetto location è possibile accedere ad informazioni relativamente alla URL corrente, cioè la URL attualmente caricata nella finestra del browser. L'oggetto location, come history, è figlio dell'oggetto window da cui discende direttamente. Proprietà dell'oggetto location Di seguito un elenco delle principali proprietà supportate dall'oggetto location: hash - (GET/SET) restituisce o setta eventuale ancora (#) presente nella URL; hostname - (GET/SET) restituisce o setta l'hostname della URL; href - (GET/SET) restituisce o setta l'intera URL; pathname - (GET/SET) restituisce o setta il path (cartella / file) della URL; protocol - (GET/SET) restituisce o setta il protocollo della URL; Qualche esempio: // estraggo l'ancora di una url come questa: // http://www.mrwebmaster.it/pagina.html#javascript document.write(location.hash); // estraggo l'hostname dalla URL corrente document.write(location.hostname); // estraggo l'intera URL document.write(location.href); // faccio un redirect utilizzando location.href function vai() { location.href = 'http://www.mrwebmaster.it/'; } Metodi dell'oggetto location assign() - carica una nuova URL all'interno della finestra reload() - ricarica la pagina corrente; replace() - sostituisce la URL corrente con una nuova; Qualche esempio: // carico una nuova URL location.assign('http://www.mrwebmaster.it/'); // ricarico la pagina corrente location.reload(); // sostituisco la URL corrente con una nuova URL location.replace('http://www.mrwebmaster.it/'); A prima vista i metodi asign() e replace() potrebbero apparire identici in realtà vi è una differenza rilevante: con il primo viene caricata una nuova URL (e quella precedente resta nella cronologia) mentre col secondo la URL corrente viene sostituita (e pertanto non è più raggiungibile attraverso il tasto "back"). 20. L'oggetto navigator di Javascript Attraverso l'oggetto navigator è possibile accedere ad una serie di informazioni sul browser utilizzato dall'utente. Proprietà dell'oggetto navigator Di seguito un elenco delle principali proprietà supportate dall'oggetto navigator: appVersion - (GET) restituisce informazioni complete sulla versione del browser in uso; cookieEmanbled - (GET) determina se il browser accetta o meno i cookie; geolocation - (GET) restituisce un oggetto geolocation che può essere utilizzato per determinare la posizione geografica dell'utente; language - (GET) restituisce il linguaggio di default impostato nel browser; userAgent - (GET) restituisce l'user-agent completo che il browser ha inviato al server; Qualche esempio: // stampo a video la versione del browser document.write(navigator.appVersion); // stampo a video se i cookie sono abilitati var c = (navigator.cookieEmanbled ? 'attivi' : 'disabilitati'); document.write('I cookie sono ' + c); // verifico se il browser supporta la geolocalizzazione if (navigator.geolocation) { document.write('Il tuo browser supporta la geolocalizzazione'); }else{ document.write('Il tuo browser NON supporta la geolocalizzazione'); } // stampo a video il linguaggio settato nel brwoser document.write(navigator.language); // stampo a video l'user-agent document.write(navigator.userAgent); Metodi dell'oggetto navigator L'oggetto navigator dispone dell'unico metodo: javaEnabled() che viene utlizzato per verificare se il browser supporta o meno Java; restituisce un valore booleano (true/false) a seconda che il supporto di java sia attivo oppure no. if (navigator.javaEnabled()) { document.write('Il tuo browser supporta Java'); 21. L'oggetto screen di Javascript L'oggetto screen contiene una serie di informazioni relative allo schermo del device utilizzato dall'utente. Questo oggetto ha la particolarità di disporre solo di proprietà e di nessun metodo. Proprietà dell'oggetto screen availWidth e availHeight - (GET) restituisce le dimensioni dello schermo esclusa la taskbar; colorDepth - (GET) restituisce la profondità del colore (bits x pixel); pixelDepth - (GET) restituisce la risoluzione colore dello schermo (bits x pixel); width e height - (GET) restituisce le dimensioni dello schermo; Vediamo un esempio di utilizzo delle proprietà <em<width< em=""> e height per stampare a video la risoluzione dello schermo del'utente:</em<width<> var w = screen.width; var h = screen.height; document.write(w + 'x' + h); NOTA: La proprietà colorDepth e pixelDepth sono, nella pratica, equivalenti. La prima è supportata quasi universlamente mentre la seconda lo è solo dai browser più recenti. 22.L'oggetto document di Javascript e l'interazione col DOM Il Document Object Model (o, più brevemente, DOM) è uno standard ufficiale del W3C attraverso il quale la struttura di un documento (come ad esempio una pagina HTML) è rappresentata sotto forma di un modello orientato agli oggetti. In pratica ogni elemento della struttura del documento è rappresentato sotto forma di nodo di un elemento padre creando una sorta di "albero" in cui si creano una serie di ramificazioni. facciamo un esempio partendo da una semplicissima struttura HTML: <html> <head> <title>titolo del documento</title> </head> <body> <h1>titolo H1</h1> <p>testo testo testo</p> </body> </html> La rappresentazione del DOM di questa pagina sarebbe: documento o head title titolo del documento (text node) o body h1 titolo H1 (text node) p testo testo testo (text node) Il DOM e javascript Attraverso Javascript è possibile manipolare il DOM della pagina; ogni elemento della pagina viene rappresentato come un oggetto il quale può essere manipolato attraverso metodi e proprietà. L'oggetto di base per la manipolazione del DOM è document il quale rappresenta la radice del documento nel suo complesso (cioè la pagina web). L'oggetto document è il genitore di tutti gli altri elementi della pagina web. L'articolo continua dopo la pubblicità Selezionare gli elementi della pagina Attraverso l'oggetto document è possibile accedere a tutti gli elementi della pagina. Per identificare il o gli elementi sui quali agire è necessario fare ricorso ad uno di questi metodi: getElementByID() - identifica un solo elemento della pagina attraverso l'attributo ID (univoco); getElementByTagName() - identifica un set di elementi della pagina attraverso l'indicazione dello specifico tag (ad esempio tutti i paragrafi o tutti i link); getElementByClassName() - identifica un set di elementi della pagina attraverso l'indicazione di una specifica classe; Vediamo qualche esempio: // identifico uno specifico elemento della pagina var testo = document.getElementById('articolo'); // all'interno di questo elemento posso selezionare, ad esempio, tutti i link var links = testo.getElementByTagName('a'); Come potete vedere ho applicato il metodo getElementById all'oggetto document creando, a mia volta, un nuovo oggetto (che ho chiamato "testo"). In seguito ho applicato il metodo getElementByTagName al nuovo oggetto "testo" per identificare tutti i link presenti in quello specifico elemento della pagina. Modificare l'HTML del documento Attraverso la proprietà innerHTML posso "scrivere" codice HTML all'interno di un qualsiasi nodo della pagina. Poco sopra, infatti, abbiamo visto come effettuare la selezione degli elementi e come, una volta selezionati, anche questi si trasformino in oggetti. A questo punto non resta che applicare la proprietà innerHTML all'oggetto corrispondente al nodo il cui contenuto vogliamo modificare. var testo = document.getElementById('articolo'); testo.innerHTML = 'Scrivo codice <b>HTML</b>...'; Così facendo l'eventuale contenuto dell'elemento selezionato verrà sostituito da quello specificato col metodo innerHTML. Modificare il valore di un attributo Nella lezione dedicata agli oggetti di javascript abbiamo accennato al fatto che ogni attributo si "trasforma" in una proprietà dello specifico oggetto element a cui ri riferisce. Ne consegue che abbiamo la possibilità di manipolare gli attributi a nostro piacimento. Si supponga, ad esempio, di voler cambiare l'immagine sorgente (attributo src) di un tag <img>: document.getElementById('miafoto').src = 'nuovafoto.jpg'; Modificare lo stile CSS di un elemento L'attributo style di un oggetto element può diventare a sua volta un oggetto ed essere manipolato attraverso una serie di proprietà corrispondenti alle proprietà dei fogli di stile. vediamo un esempio: // imposto il colore rosso per il testo document.getElementById('articolo').style.color = '#FF0000'; Da notare che in Javascript i nomi di alcune proprietà CSS variano leggermente quando vengono utilizzati sotto forma di proprietà. La proprietà background-image, ad esempio, corrisponde alla proprietà Javascript backgroundImage. In linea di massima possiamo dire che il nome delle proprietà CSS composto da più parole separate dal trattino (come ad esempio "border-color") viene trasformato in una stringa unica in cui la parola che segue al trattino (che viene omesso) ha la prima lettera maiuscola (ad esempio "borderColor"). Gestire gli eventi utilizzando il DOM Attraverso l'utilizzo del DOM è anche possibile assegnare un evento ad un dato elemento della pagina. Ad esempio: document.getElementById('miafoto').onclick = function(){ ... }; In questo caso l'evento Javascript si trasforma in una proprietà dell'oggetto element e, come tale, può essere settato a piacimento. Sempre attraverso il DOM è possibile creare degli event listener cioè dei "rilevatori di eventi" associati a specifici elementi della pagina. Facciamo un esempio: // assegno una funzione esterna foto.addEventListener('click', miafunzione); // definisco internamente al metodo le istruzioni da eseguire document.getElementById('miafoto').addEventListener('click', alert('...'); }); function() { E' possibile associare una molteplicita di event handler (anche dello stesso tipo) a ciascun oggetto. Ad esempio, quindi, possiamo associare diverse funzioni al medesimo evento "click" sul medesimo oggetto con ID "miafoto". var foto = document.getElementById('miafoto'); foto.addEventListener('click', miafunzione); foto.addEventListener('click', suafunzione); foto.addEventListener('click', tuafunzione); Volendo è anche possibile compiere l'operazione inversa, cioè disassociare una funzione da un dato evento su un oggetto. Per farlo si utilizza il metodo removeEventListener in questo modo: foto.removeEventListener('click', tuafunzione); Creare un nuovo elemento della pagina Per aggiungere un nuovo elemento nell'albero della pagina sarà necessario prima crearlo e poi appenderlo al nodo nel quale o si desidera inserire. Per creare un nuovo elemento nel DOM si utilizza il metodo createElement() specificando, come attributo, che tipo di elemento si desidera creare. Una volta creato l'elemento sarà, ovviamente, vuoto. Nell'esempio che segue, dopo aver creato un nuovo paragrafo, andremo a riempirlo creando un textnode al suo interno. // creo il nuovo elemento (un paragrafo) var nuovo = document.createElement('p'); // creo un nuovo nodo di testo per "riempire" il nuovo elemento var testo = nuovo.createTextNode('Nuovo testo da inserire'); // appendo il nodo di testo al nuovo elemento nuovo.appendChild(testo); // seleziono il nodo nel quale voglio aggiungere il nuovo elemento var articolo = document.getElementById('articolo'); // ora aggiungo il nuovo elemento al nodo selezionato all'inizio articolo.appendChild(nuovo); Utilizzando il metodo appendChild(), il nuovo elemento viene posizionato in fondo all'elemento selezionato. Se non vogliamo che ciò accada ma vogliamo inserire il nuovo elemento in un punto ben preciso abbiamo a disposizione il metodo insertBefore(). Questo metodo richiede due parametri: il primo corrisponde al nuovo elemento da inserire, il secondo corrisponde all'oggetto che identifica il l'elemento prima del quale effettuare l'inserzione. Si supponga, ad esempio, che il nostro articolo sia così strutturato: <div id="articolo"> <p id="frase1">...</p> <p id="frase2">...</p> <p id="frase3">...</p> </div> e si supponga di voler inserire il nuovo paragrafo subito dopo il primo. Questo il codice del nostro esempio: // creo il nuovo elemento (un paragrafo) var nuovo = document.createElement('p'); // creo un nuovo nodo di testo per "riempire" il nuovo elemento var testo = nuovo.createTextNode('Nuovo testo da inserire'); // appendo il nodo di testo al nuovo elemento nuovo.appendChild(testo); // seleziono il nodo nel quale voglio aggiungere il nuovo elemento var articolo = document.getElementById('articolo'); // seleziono il sotto-elemento prima del quale voglio inserire quello nuovo var frase = articolo.getElementById('frase1'); // ora aggiungo il nuovo elemento al nodo selezionato subito prima dell'elemento "frase" articolo.insertBefore(nuovo,frase); Se al posto di insertBefore() avessimo utilizzato replaceChild() avremmo sostituito la frase con ID "frase1" con quella generata dinamicamente. Eliminare un elemento dal DOM Per eliminare un elemento dall'albero del DOM si utilizza il metodo removeChild(). Come lascia intuire il nome, viene utilizzato per rimuovere un elemento figlio dell'oggetto selezionato. Volendo tornare all'esempio visto sopra e supponendo di voler eliminare la frase con id "frase1" avremmo utilizzato il seguente codice: // seleziono il nodo nel quale voglio lavorare var articolo = document.getElementById('articolo'); // seleziono il sotto-elemento che desidero cancellare var frase = articolo.getElementById('frase1'); // ora procedo all'eliminazione articolo.removeChild(frase); Una particolarità del DOM è che per rimuovere un elemento dalla pagina è sempre necessario conoscere l'elemento genitore. Un "trucchetto" per ovviare a questa procedura è offerto da questo codice: var elimina = document.getElementById('frase1'); elimina.parentNode.removeChild(elimina); Muoversi tra gli elementi del DOM Come abbiamo detto il DOM è come un albero rappresentato da diversi rami, ogni punto di origine di uno o più rami è detto nodo. Javascript disponde di diverse proprietà per muoversi all'interno dei vari nodi di un documento HTML. Questa sono: parentNode childNodes[indice] firstChild lastChild nextSibling previousSibling E' importante sottolineare che nel modello del DOM ogni blocco di testo corrisponde a un noto (Text Node) quindi per accedere, ad esempio, al testo contenuto all'interno di una tag <p> sarà necessario far riferimento ad un ulteriore nodo (il nodo di testo, appunto) e poi applicare la proprietà nodeValue: var testo = document.getElementById('frase1').firstChild.nodeValue; In realtà, per raggiungere il nostro scopo, avremmo potuto scrivere più semplicemente: var testo = document.getElementById('frase1').innerHTML; Tuttavia era necessario sottolineare come, nel DOM, i blocchi di testo siano qualificati come nodi a se stanti. parentNode la proprietà parentNode consente di accedere al nodo genitore dell'oggetto element corrente. Abbiamo già visto questa proprietà all'opera poco sopra, nell'ultimo esempio relativo all'eliminazione di un elemento dal DOM (cui vi invito a fare riferimento). firstChild e lastChild Queste tre proprietà consentono di accedere, rispettivamente, al primo nodo e all'ultimo elemento figlio dell'oggetto element corrente. childNodes la proprietà childNodes consente di accedere ad un determinato nodo figlio specificandone l'indice numerico (ricordiamoci che la numerazione degli indici parte da 0 e NON da 1!). In sostanza possiamo dire che childNodes[0] è l'equivalente di firstChild. nextSibling e previousSibling Queste due proprietà consentono di muoversi tra i nodi "fratelli" e più precisamente consento di accedere a quello precedente e quello successivo. La radice del documento Per accedere alla radice della nostra pagina HTML possiamo utilizzare la proprietà documentElement dell'oggetto document. Se desideriamo selezionare solo il corpo del documento, invece, possiamo utilizzare semplicemente la proprietà body. var radice = document.documentElement; var corpo = document.body; 23. Gli Array in Javascript Gli Array(), come le variabili, sono una porzione di memoria all'interno delle quali vengono immagazzinati dei dati. Se nella variabile viene immagazzinata una specifica informazione (ad esempio un numero, una stringa, un valore booleano, ecc.) nell'array possono essere incapsulati una pluralità di informazioni all'interno di una sorta griglia astratta. Javascript, come tutti i linguaggi di programmazione che si rispettino, supporta e gestisce gli array. Definire un array Vediamo la sintassi per la creazione di un oggetto Array() in Javascript: var esempio = new Array(); Così facendo abbiamo definito un'array vuota. Inserire dati nell'array Per inserire i dati (che prendono il nome di item, elementi) in questo particolare tipo di variabile si possono seguire due strade, la prima consiste nel dichiarare i singoli dati su più righe passando tra parentesi quadre un numerico intero univoco identificativo di ogni singole voce, da zero a n. Ad esempio: var esempio = new Array(); esempio[0] = "primo dato"; esempio[1] = "secondo dato"; esempio[2] = "terzo dato"; Il secondo metodo, più sintetico, consiste nel passare i dati tra parentesi come parametri dell'oggetto avendo cura di seprararli con una virgola: var esempio = new Array("primo dato", "secondo dato", "terzo dato"); La differenza consiste sostanzialmente in una questione di ordine e di preferenze nello stile di programmazione. N.B. E' solo il caso di ricordare che se si tratta di stringhe sarà necessario utilizzare le virgolette per racchiudere ogni item dell'Array, mentre se si tratta di numeri ciò non è necessario. L'articolo continua dopo la pubblicità Leggere i dati contenuti in un array Per estrarre un singolo elemento da un'array è necessario richiamare il nome dell'array seguita dall'indice dell'elemento di nostro interesse: document.write(esempio[1]); Per leggere tutti i dati di un Array(), invece, occorre ciclarlo con l'istruzione for(), ipotizziamo il caso precedente: var esempio = new Array(); esempio[0] = "primo dato"; esempio[1] = "secondo dato"; esempio[2] = "terzo dato"; // ciclo for for (var i = 0; i < 3; i++) { document.write(esempio[i] + "<br>"); } Per stampare l'output a video ci siamo serviti, come sempre, del document.write() passandogli la variabile di tipo Array() associata al contatore [i] del ciclo, ecco l'output di questo esempio: primo dato secondo dato terzo dato La proprietà length Si noti che nell'esempio sapevamo esattamente quanti erano gli elementi contenuti nel nostro Array(); tuttavia può capitare di non conoscere a priori questo valore. In questo caso è possibile calcolare dinamicamente il numero di elementi contenuti nell'array attraverso la proprietà lenght (la stessa proprietà può essere applicata anche ad una stringa per contarne i caratteri, nel caso degli Array() viene calcolato il numero di indici presenti). Vediamo un esempio: var frutta = new Array(); frutta[0] = "Mele"; frutta[1] = "Pere"; frutta[2] = "Banane"; frutta[3] = "Pesche"; // ciclo for con limite calcolato dinamicamente for (var i = 0; i < frutta.length; i++) { document.write(frutta[i] + "<br>"); } Vediamo un ulteriore esempio che credo sia molto esplicativo circa il funzionamento della proprietà length: document.write("Ci sono " + frutta.length + " tipi di frutta"); L'output sarà: Ci sono 4 tipi di frutta Aggiungere ed eliminare elementi: push, pop, shift, unshift Grazie ai metodi push e pop è possibile, rispettivamente, aggiungere ed eleiminare un elemento in coda ad un array. Per prima cosa vediamo come utilizzare push() per aggiungere un elemento alla fine di un array: var frutta = new Array(); frutta[0] = "Mele"; frutta[1] = "Pere"; frutta[2] = "Banane"; frutta[3] = "Pesche"; // aggiungo un elemento in coda all'array frutta frutta.push("fragole"); La nostra array avrà i seguenti elementi: Mele, Pere, Banane, Pesche, Fragole Supponendo, invece, di voler eliminare l'ultimo elemento di un array si utilizza il metodo pop(): var frutta = new Array(); frutta[0] = "Mele"; frutta[1] = "Pere"; frutta[2] = "Banane"; frutta[3] = "Pesche"; // elimino un elemento in coda all'array frutta frutta.pop(); La nostra array avrà ora i seguenti elementi: Mele, Pere, Banane Allo stesso modo i metodi shift e unshift consentono di eliminare ed aggiungere elementi in cima ad un array. Vediamo come aggiungere un elemento in cima ad un array con unshift: var frutta = new Array(); frutta[0] = "Mele"; frutta[1] = "Pere"; frutta[2] = "Banane"; frutta[3] = "Pesche"; // aggiungo un elemento in cima all'array frutta frutta.unshift("fragole"); La nostra array avrà i seguenti elementi: Fragole, Mele, Pere, Banane, Pesche Supponendo, invece, di voler eliminare il primo elemento di un array useremo shift: var frutta = new Array(); frutta[0] = "Mele"; frutta[1] = "Pere"; frutta[2] = "Banane"; frutta[3] = "Pesche"; // elimino un elemento in cima all'array frutta frutta.shift(); La nostra array avrà ora i seguenti elementi: Pere, Banane, Pesche Ordinamento di un array: sort e reverse Lavorando con gli Array() si ha casisticamente l'esigenza di manipolare i dati in maniera diversa da quella nativa, ad esempio ordinando i dati secondo un certo criterio o manipolandoli come una stringa, occupiamoci ora di definire i principali metodi e le proprietà che ci permettono di stabilire questi controlli. Possiamo decidere di ordinare un Array() in ordine alfabetico grazie al metodo sort, vediamo un esempio: var nominativi = new Array(); nominativi[0] = "Gianni Rivera"; nominativi[1] = "Paolo Rossi"; nominativi[2] = "Claudio Gentile"; // ordinamento nominativi.sort(); // ciclo for for (var i=0; i<nominativi.length; i++) { document.write(nominativi[i] + "<br>"); } Nonostante l'ordine stabilito all'atto della creazione dell'Array(), ci troveremo di fronte ad una situazione del genere: Claudio Gentile Gianni Rivera Paolo Rossi Siamo in questo modo riusciti ad ordinare i dati dell'Array() in ordine alfabetico in considerazione della prima lettera che viete trovata nella lettura delle singole stringhe rappresentanti i valori associati ai singoli indici dell'Array(). Grazie al metodo reverse, invece, possiamo invertire l'ordine di un Array() in senso contrario, se riprendiamo l'esempio appena proposto e lo modifichiamo come segue: var nominativi = new Array(); nominativi[0] = "Gianni Rivera"; nominativi[1] = "Paolo Rossi"; nominativi[2] = "Claudio Gentile"; // ordinamento nominativi.reverse(); // ciclo for for (var i=0; i<nominativi.length; i++) { document.write(nominativi[i] + "<br>"); } otterremo il seguente risultato: Claudio Gentile Paolo Rossi Gianni Rivera Concatenare due array Il metodo concat ci permette di concatenare due o più Array(). Vediamo un esempio: // definisco due array var lettere = new Array('A','B','C'); var numeri = new Array(1,2,3,4,5,6); // unisco le due array var nuova = lettere.concat(numeri); // ciclo for for (var i=0; i<nuova.length; i++) { document.write(nuova[i] + ","); } Otterremo A,B,C,1,2,3,4,5,6 Convertire un array in stringa Simili tra loro sono i metodi toString e join, la loro funzione è quella di convertire un Array() in una stringa. Mentre toString() crea un elenco di elementi separati da una virgola, il metodo join() permette di scegliere il o i caratteri da utilizzare per la separazione, vediamo un esempio di entrambi: var lettere = new Array(); lettere[0] = "A"; lettere[1] = "B"; lettere[2] = "C"; document.write(lettere.toString()); che ci restituirà: A,B,C var lettere = new Array(); lettere[0] = "A"; lettere[1] = "B"; lettere[2] = "C"; document.write(lettere.join('-')); che ci restituirà A-B-C 24. Gestire le date con Javascript Javascript, grazie all'oggetto Date() offre una serie di potenti e preziosi strumenti per manipolare date e orari. Prima di addentrarci nell'analisi dei vari metodi supportati dall'oggetto Date() è bene ricordare che attraverso Javascript è possibile lavorare facendo riferimento alla data e orario settati sul browser dell'utente. Non è possibile, invece, utilizzare come riferimento temporale la data e l'ora settata sul nostro server web. Il perchè di questa caratteristica è di semplice comprensione: Javascript è un linguaggio lato-client è pertanto il suo ambito di esecuzione corrisponde al browser dell'utente e non al web server. Per utilizzare l'oggetto Date() è, prima di tutto, necessario creare una variabile a cui assegnare l'oggetto attraverso l'apposito costruttore: var miadata = new Date(); Tutti i metodi dell'oggetto saranno ora associati alla variabile al cui interno abbiamo istanziato, appunto, l'oggetto Date(). I metodi dell'oggetto Date() L'oggetto Date() è davvero molto ricco di metodi per la manipolazione di date e orari, in questa sede crercheremo di analizzare i principali, ovvero: Metodi GET I metodi della famiglia "get" sono quelli utilizzati per recuperare un dato valore relativo ad una data o ad un orario, i più usati sono: getDate() - restituisce il numero del giorno corrente nel mese (1 -31); getDay() - restituisce il numero del giorno corrente nella settimana (0 = domenica; 1 = lunedì; 2 = martedì; ecc.); getMonth() - restituisce il numero del mese corrente (0 = gennaio; 1 = febbraio; 2 = marzo; ecc.); getFullYear() - restituisce l'anno corrente; getHours() - restituisce l'ora corrente (0 - 23); getMinutes() - restituisce il minuto corrente (0 - 59); getSeconds() - restituisce il secondo corrente (0 - 59); getTime() - restituisce il valore corrente del timestamp; Vediamo un esempio: var miadata = new Date(); var gg = miadata.getDate(); var mm = miadata.getMonth(); var yyyy = miadata.getFullYear(); document.write(gg + '/' + (mm+1) + '/' + yyyy); Metodi SET I metodi della famiglia "set" sono quelli utilizzati per modificare (nel nostro script) uno o più valori relativi alla data o all'orario impostati nel browser, i più usati sono: setDate() - imposta arbitrariamente il numero del giorno corrente nel mese; setDay() - imposta arbitrariamente il numero del giorno corrente nella settimana; setMonth() - imposta arbitrariamente il numero del mese corrente; setFullYear() - imposta arbitrariamente l'anno corrente; setHours() - imposta arbitrariamente l'ora corrente; setMinutes() - imposta arbitrariamente il minuto corrente; setSeconds() - imposta arbitrariamente il secondo corrente; Vediamo un esempio di come settare, ai fini del nostro script, una data arbitraria: var miadata = new Date(); // imposto arbitrariamente il giorno corrente al 25 del mese... miadata.setDate(20); // ...il mese a dicembre... Buon Natale ;-) miadata.setMonth(11); /* Ora svolgo una serie di operazioni sulle date avendo come riferimento la data impostata arbitrariamente /* Metodi di conversione Si tratta di una serie di metodi utilizzati per convertire un oggetto data in qualcos'altro. I più noti sono: toISOString() - converte l'oggetto data in una stringa di testo utiizzando lo standard ISO per la definizione delle date; toLocaleDateString() - converte l'oggetto data in una stringa di testo contenente la sola data (non verrà compreso l'orario) utilizzando le impostazioni locali del vostro browser (in poche parole vdrete una data scritta in italiano, se questa è la vostra lingua ovviamente); toLocaleString() - converte l'oggetto data in una stringa di testo con data e orario utilizzando le impostazioni locali del vostro browser; toString() - converte l'oggetto data in una stringa di testo; Altri metodi dell'oggetto Date() Oltre a quelli citati, l'oggetto date() dispone di altri metodi che non rientrano nelle categorie viste sopra; il più importante di questi è sicuramente parse() il quale converte una stringa contenente una data in un valore di timestamp. Il metodo parse() non necessità che l'oggetto Date() venga istanziato in una variabile: var ts = Date.parse('11 November, 2014'); 25. Operazioni matematiche con Javascript Eseguire le più comuni operazioni matematiche in Javascript è molto semplice e intuitivo. Abbiamo già visto, in una precedente lezioni della nostra guida, quali sono e come funzionano gli operatori matematici ma volendo fare un breve ripasso vediamo alcuni esempi di semplici calcoli effettuati su due variabili numeriche: var a = 12; var b = 3; // somma var somma = (a + b); // sottrazione var sottrazione = (a - b); // moltiplicazione var moltiplica = (a * b); // divisione var divisione = (a / b); // modulo var modulo = (a % b); Se effettuare semplici operazioni matematiche è estremamente intuitivo, grazie all'oggetto Math() ci è consentito eseguire in modo piuttosto semplice anche calcoli ben più complessi come il calcolo di logaritmi, seno, tangente, ecc. L'oggetto Math(), infatti, dispone di una moltitudine di metodi in grado di soddisfare le esigenze dei matematici più incalliti. Prima di passare all'analisi di detti metodi, tuttavia, vediamo la sintsassi prevista dall'oggetto. L'articolo continua dopo la pubblicità Come già detto in una lezione precedente, infatti, l'oggetto Math() - a differenza di Date() - non necessita di essere istanziato ma può essere utilizzato "direttamente" in questo modo: Math.metodo(attributo/i); I metodi dell'oggetto Math() Anche in questo caso i metodi sono davvero parecchi, in questa lezione passeremo in rassegna solo i più importanti essendo alcuni di questi davvero poco utilizzati nell'esperienza della comune programmazione. abs(n) - restituisce il valore assoluto di un valore numerico; ceil(n) - arrotonda un numero decimale all'intero superiore; floor(n) - arrotonda un numero decimale all'intero inferiore; max(a,b,c,...,n) - restitusice il valore maggiore tra tutti quelli passati in argomento; min(a,b,c,...,n) - restitusice il valore minore tra tutti quelli passati in argomento; pow(a,b) - restituisce il valore di a alla potenza di b; random() - restituisce un valore numero casuale compreso tra 0 e 1 round(n) - arrotonda un numero decimale all'intero più vicino; sqrt(n) - calcola la radice quadrata; Vediamo qualche esempio: Math.abs(-4.5); // 4.5 Math.ceil(3.7); // 4 Math.floor(3.7); // 3 Math.max(3,11,67,5); // 67 Math.min(3,11,67,5); // 3 Math.pow(3,2); // 9 Math.random(); // 0.4300545122190121 Math.sqrt(9); // 3 26. Le espressioni regolari in Javascript Le regular expressions (espressioni regolari) sono un potente strumento per il controllo formale della sintassi di una stringa al fine di verificare che questa corrisponda ad un modello (pattern) predefinito. Le espressioni regolari sono una tecnica trasversale a quasi tutti i linguaggi di programmazione, tant'è che alcuni sono arrivati a definire questa tecnica come uno pseudo-linguaggio vero e proprio. La definizione di pattern richiede la conoscenza di una sintassi piuttosto complessa, abbastanza familiare, tuttavia, a coloro che conoscono il Perl. Pur avendo tratti comuni a vari linguaggi, le espressioni regolari variano a seconda del linguaggio utilizzato quindi modelli creati per PHP, ad esempio, non funzionano necessariamente in Javascript (seppur vi sia una grande somiglianza). Esempi di espressioni regolari utilizzate frequentemente Un classico esempio di controllo di espressione regolare è rappresentato dalla verifica della corretta formattazione sintattica dell'indirizzo email; tale verifica, in estrema sintesi, controlla che l'indirizzo sia composto da una username, seguito dalla chiocciola (@) e dal dominio del sito/provider. [email protected] Altro esempio di espressione regolare piuttosto utilizzata riguarda il controllo formale dell codice fiscale: questo è composto da 16 caratteri alfanumerici, in una sequenza "predefinita" del tipo: AAABBB12C21D345E Ovviamente ci sono molti altri esempi in cui è frequente ricorrere alle espressioni regolari per controllare una stringa, normalmente si tratta di esigenze di validazione di informazioni ricevute in input dagli utenti attraverso una querystring o un form. Dichiarare un'espressione regolare in Javascript Esistono due sistemi con cui è possibile dichiarare il pattern (sequenza di caratteri di controllo) di un'espressione regolare; il primo è attraverso una semplice stringa contenuta in una coppia di caratteri slash (/) ed il secondo attraverso l'oggetto RegExp. La sintassi attraverso la quale definire il pattern per un'espressione regolare è la seguente: var espressione = /pattern/; Vediamo un esempio di pattern per verificare che una stringa sia composta solo da caratteri alfabetici senza fare distinzione tra maiuscole e minuscole: var espressione = /^[a-z]+$/i; Vedremno più avanti in che modo è stato composto questo pattern, per ora limitiamoci ad osservare come questo sia racchiuso tra i caratteri di slash e che dopo lo slash di chiusura è stata aggiunta una "i". Questa lattera (i) è detta modificatore ed indica al nostro programma di effettuare una ricerca NON case sensitive (la "i" sta per ignore case), cioè di non fare differenze tra maiuscole e minuscole. I modificatori supportati sono tre: i - non distingue tra maiuscole e minuscole; g - esegue ricerche globali, cioè non si ferma alla prima occorrenza; m - esegue ricerche multiline (il pattern viene confrontato con ogni linea del testo); Come detto esiste un secondo modo per la creazione di espressioni regolari e consiste nell'utilizzo dell'oggetto RegExp. Questo viene istanziato in una variabile un po' come accade per l'oggetto Date(): var espressione = new RegExp('pattern'); Volendo riprodurre l'esempio visto sopra avremmo scritto: var espressione = new RegExp('^[a-z]+$','i'); Come vedete il pattern è il primo attributo atteso dal metodo mentre l'eventuale modificatore è il secondo. In sostanza non ci sono differenze tra questi due sistemi dichiarativi. Negli esempi che seguiranno, per semplicità, utilizzeremo il primo dei due sistemi descritti. Effettuare un controllo tramite espressione regolare: il metodo test() Per impostare il controllo di un'espressione regolare si utilizza il metodo test() dell'oggetto RegExp il quale restituirà true in caso di successo o false in caso contrario. Vediamo la sintasi: if (espressione.test(stringa)) { // "stringa" è conforme all'espressione } else { // "stringa" NON è conforme all'espressione } Naturalmente possiamo impostare il controllo in modo inverso attraverso l'operatore logico di negazione. Se vogliamo che il nostro programma faccia qualcosa solo se l'espressione regolare non è verificata scriveremo così: if (!espressione.test(stringa)) { // avviso dell'errore... } il che equivale a: if (espressione.test(stringa) == false) { // avviso dell'errore... } Vediamo un esempio concreto: supponiamo di voler verificare che l'username inserito dall'utente sia composto solo da letteri e numeri avvisandolo (con un alert) in caso di errore: // definisco in una variabile un username in modo arbitrario // nella realtà recupereremo questo valore da un campo input di un form var username = 'mario.rossi'; // imposto un modello var re = /^[a-z0-9]+$/i; // faccio la verifica if (!re.test(username)) { alert('Puoi inserire solo lettere e numeri!'); } Estrarre le stringhe corrispondenti al pattern: il metodo exec() Se il metodo test() restuisce semplicemente true o false, il metodo exec() restuisce la stringa corrispondente al pattern (se trovata) oppure null (in caso di match non riuscito). Vediamo un esempio: // definisco una stringa var str = 'Mr.Webmaster'; // definisco un semplice pattern per verificare // che la stringa inizi per "Mr" var re = /^Mr/; var res = res.exec(str); document.write(res); Questo esempio stamperà a video: Mr Costruire il pattern: la sintassi delle espressioni regolari Veniamo adesso alla parte più difficile dell'argomento espressioni regolari, ovvero la definizione dei pattern (sequenze di caratteri di controllo), dei costrutti sintattici e semantici. Una volta entrati nei vari meccanismi che regolano la definizione di un'espressione regolare, più o meno semplice o generica, risulterà molto semplice risolvere problemi apparentemente diffici, risolvibili altrimenti con lunghe routine di controllo attraverso il linguaggio di programmazione o di scripting utilizzato. Abbiamo già visto più sopra un esempio che verifica che una stringa sia composta esclusivamente da caratteri alfanumerici: var espressione = /^[a-z0-9]+$/i; Analizziamo la sintassi utilizzata all'interno di questa espressione regolare: ^ - indica che la stringa deve iniziare con...; [ e ] - indicano qualsiasi carattere tra quelli al loro interno; a-z e 0-9 - indica che la stringa può contenere tutti i caratteri che vanno da "a" a "z" e da 0 a 9; + - indica che la stringa deve contenere almeno uno dei caratteri tra le parentesi quadre; $ - indica il termine della stringa; Ipotiziamo che uno dei caratteri da controllare in un'espressione regolare sia, accidentalmente, un metacarattere delle espressioni regolari o altro carattere speciale (come ad esempio una parentesi quadra). Per farlo utilizzeremo il carattere back-slash (\) per isolarlo. Facciamo un esempio supponendo di dover verificare che una data stringa contenga il carattere "^": /\^/ Se il carattere da controllare è proprio un back-slash, utilizzeremo un doppio back-slash: /\\/ Il primo back-slash fungerà da literal escape ed il secondo verrà interpretato come carattere semplice e non come speciale. Passiamo a qualcosa di più complesso. Ipotizziamo di voler verificare che in una stringa sia presente il carattere punto che separi due blocchi alfanumerici. Ecco l'espressione regolare da utilizzare:>/p> var espressione = /^[a-z]+\.[a-z]/; var stringa = "mrwebmaster.it"; if (!espressione.test(stringa)) { document.write("La stringa non è valida!"); } Anche in questo caso abbiamo utilizzato un backslash in quanto il carattere punto (.) ha un valore "speciale" nella sintassi delle espressioni regolari e, se non preceduto da un backslash, euqivale a dire "qualsiasi carattere". Fino ad ora, nei pochi esempi trattati, abbiamo visto alcuni caratteri speciali ma in relatà ne esistono parecchi. Vediamo di seguito un riepilogo dei caratteri speciali, dei metacaratteri e delle strutture sintattiche utilizzati nelle espressioni regolari: Marcatori di inizio e termine stringa: ^ - verifica l'inizio di una stringa (attenzione! se utilizzato all'interno di una parentesi quadra indica una negazione); $ - verifica la fine di una stringa; Metacaratteri: . - qualsiasi carattere ad esclusione del ritorno a capo; \w - verifica che una stringa sia alfanumerica, minuscola \W - verifica che una stringa sia alfanumerica, maiuscola \d - indica qualsiasi cifra numerica; \D - indica qualsiasi carattere che non sia una cifra numerica; \s - indica uno spazio vuoto; \S - indica qualsiasi carattere che non sia uno spazio vuoto; \t - indica una tabulazione; \r - indica un carriage return; \n - indica un linefeed; Parentesi quadre: [...] - le parentesi quadre identificano range e classi di caratteri; [abc] - identifica qualsiasi carattere tra quelli tra parentesi quadra; [^abc] - identifica qualsiasi carattere ad esclusione di quelli tra quelli tra parentesi quadra (^ funge da negazione); [a-z] o [0-9] - il trattino all'interno della parentesi quadra identifica un range di caratteri; Parentesi tonde: (...) - le parentesi tonde identificano dei gruppi di caratteri (i gruppi diventamo fondamentali se si deve effettuare una sostituzione mediante espressioni regolari); (a|b) - il simobolo | identifica un alternanza (o "a" o "b") all'interno del gruppo; Ripetizioni di caratteri: {x} - indica il carattere precedente per x volte (x,} - indica il carattere precedente per x o più volte {x,y} - il carattere precedente si ripetere x volte ma non più di y ? - indica il carattere precedente per 0 o 1 occorrenza * - equivale a {0,} + - equivale a {1,} Usare le espressioni regolari per effettuare ricerche e sostituzioni Attraverso le espressioni regolari è possibile utilizzare anche i metodi search() e replace() tipici delle stringhe. Nella lezione successiva vedremo, appunto, come manipolare le stringhe attraverso i metodi e le proprietà ad esse associate. 27. Gestire le stringhe con Javascript In occasione della lezione dedicata alle variabili, abbiamo già visto cosa sono le stringhe e come si definisce una variabile di tipo stringa in Javascript. Nel corso di questa lezione vedremo come manipolare la strighe attraverso le proprietà ed i metodi che Javascript mette a disposizione degli sviluppatori. E' bene ricordare, infatti, che l'interprete Javascript, quando ha a che fare con una stringa, la trasforma dinamicamente in un oggetto e, pertanto, come tale può essere gestita. La proprietà length Esiste una sola proprietà utile par la manipolazione delle stringhe, si tratta di length che, come la sua traduzione dall'inglese lascia ad intendere, calcola la lunghezza della stringa, nello specifico il numero di caratteri che la compone: var miaStringa = "Mr.Webmaster"; document.write("La stringa è composta da " + miaStringa.length + " caratteri."); Il suo impiego torna utile, ad esempio, in fase di validazione dei form per calcolare il numero di caratteri presenti in un campo input o in una textarea. I metodi per la manipolazione delle stringhe I metodi utili per la manipolazione delle stringhe sono tantissimi, in questa lezione esamineremo i principali tra i metodi standard mentre tralasceremo volutamente tutti i metodi "non standard" (come blink(), bold(), ecc.). Tutti i metodi delle stringhe seguono la forma sintattica: variabile.metodo() pertanto non riporterò esempi per tutti i metodi essendo il costrutto identico per ognuno di essi. Vediamo ora i metodi più utilizzati: chartAt() - restituisce il carattere corispondente all'indice numerico specificato; vediamo un esempio: var miaStringa = "Mr.Webmaster"; document.write(miaStringa.charAt(0)); // stampa a video: M concat() - equivale all'operatore + per concatenare all'oggetto la stringa passata in argomento; indexOf() - restituisce la posizione della prima occorrenza di uno specifico valore all'interno dell'oggetto stringa (restituisce -1 se non trovato); vediamo un esempio: var miaStringa = "Mr.Webmaster"; var trova = miaStringa.indexOf("W"); if (trova != -1) alert("Il carattere è presente"); else alert("Il carattere non è presente"); lastIndexOf() - restituisce la posizione dell'ultima occorrenza di uno specifico valore all'interno dell'oggetto stringa (restituisce -1 se non trovato); è possibile specificare, come secondo argomento del metodo, il carattere di partenza; vediamo un esempio: var miaStringa = "Mr.Webmaster"; miaStringa.lastIndexOf("e"); // Inizia dall'ultimo carattere miaStringa.lastIndexOf("e", 7); // Inizia dall'ottavo carattere match() - effettua una ricerca all'interno dell'oggetto stringa attraverso l'espressione regolare passata come parametro; restituisce i risultati sotto forma di array; replace() - sostituisce all'interno dell'oggetto la stringa passata come primo argomento con quella passata come secondo; come secondo argomento può essere passata anche una espressione regolare; vediamo due esempi: /* Esempio N.1 */ var miaStringa = "Visita Google" // effettuo una sostituzione semplice document.write(miaStringa.replace('Google','Mr.Webmaster')); /* Esempio N.2 */ var miaStringa = "Ho un giubbotto blu, un maglione rosso e un cappello blu"; // effettuo una sostituzione attraverso espressione regolare document.write(str.replace(/blu/g, "verde")); search() - effettua una ricerca della stringa passata in argomento all'interno dell'oggetto e ne restituisce la posizione (restituisce -1 se non trovata); come argomento può essere passata anche una espressione regolare; vediamo un esempio: var miaStringa = "Evviva Mr.Webmaster" document.write(miaStringa.search('Mr.Webmaster')); // restuirà: 7 slice() - consente di tagliare la stringa specificando il carattere di partenza e quello finale (che sono compresi); vediamo un esempio: var miaStringa = "Mr.Webmaster"; document.write(miaStringa.slice(3,5)); // Verrà visualizzato ".We" split() - divide una stringa sulla base di un separatore e restituisce un array; vediamo un esempio: var miaStringa = "divido la stringa in base agli spazi vuoti!"; document.write(miaStringa.split(" ")); substr() - consente di estrarre dall'oggetto una sottostringa specificando il carattere di partenza (che verrà incluso) ed il numero di caratteri da estrarre; vediamo un esempio: var miaStringa = "Mr.Webmaster"; document.write(miaStringa.substr(3,5)); // Verrà visualizzato ".Webm" substring() - consente di estrarre dall'oggetto una sottostringa specificando il carattere di partenza (che verrà incluso) ed il carattere finale (che non verrà incluso nella sottostringa); vediamo un esempio: var miaStringa = "Mr.Webmaster"; document.write(miaStringa.substr(3,5)); // Verrà visualizzato ".W" toLowerCase() - converte una stringa in minuscolo; toUpperCase() - converte una stringa in maiuscolo;