Originariamente sviluppato daBrendan Eich dellaNetscape Communications con il nome diMocha e successivamente diLiveScript, in seguito è stato rinominato "JavaScript" ed è stato formalizzato con unasintassi più vicina a quella del linguaggioJava diSun Microsystems (che nel 2010 è stata acquistata daOracle).Standardizzato per la prima volta il 1997 dallaECMA con il nomeECMAScript, l'ultimo standard, di giugno 2022, è ECMA-262 Edition 13[1] ed è anche uno standardISO (ISO/IEC 16262).
Le funzioni di script, utilizzati dunque nellalogica di presentazione, possono essere opportunamente inserite infileHTML, in pagineJSP o in appositi file separati conestensione.js poi richiamati nellalogica di business. Ultimamente il suo campo di utilizzo è stato esteso alle cosiddetteHybrid App (app ibride), con le quali è possibile creareapp per piùsistemi operativi utilizzando un unicocodice sorgente basato appunto su JavaScript,HTML eCSS.
Il cambio di nome da LiveScript a JavaScript si ebbe più o meno nel periodo in cui Netscape stava includendo il supporto per la tecnologia Java nel suo browserNetscape Navigator.[2] La scelta del nome si rivelò fonte di grande confusione. Non c'è una vera relazione tra Java e JavaScript; le loro somiglianze sono soprattutto nella sintassi (derivata in entrambi i casi dallinguaggio C); le loro semantiche sono piuttosto diverse e in particolare i loroobject model non hanno relazione e sono notevolmente incompatibili.
Dato il successo di JavaScript come linguaggio per arricchire lepagine web,Microsoft sviluppò un linguaggio compatibile, conosciuto comeJScript. La necessità di specifiche comuni fu alla base dello standard ECMA 262 perECMAScript, di cui sono state pubblicate otto edizioni da quando il lavoro iniziò, nel novembre1996[3].
Altri aspetti di interesse: in JavaScript lato client, il codice viene eseguito direttamente sulclient e non sulserver. Il vantaggio di questo approccio è che, anche con la presenza discript particolarmente complessi, ilweb server non rischia sovraccarichi, dato che il lavoro viene svolto dal client. Un rovescio della medaglia è che, nel caso di script particolarmente grandi, il tempo per il trasferimento dalla rete può diventare eccessivamente lungo. Inoltre ogni informazione che presuppone un accesso a dati memorizzati in unabase di dati remota deve essere rimandata a un linguaggio che effettui materialmente latransazione, per poi restituire i risultati a una o più variabili JavaScript; operazioni del genere richiedono un nuovo caricamento della pagina stessa. Questi limiti sono però stati superati in buona parte con la nascita diAJAX.
Alcune altre caratteristiche di JavaScript degne di nota:
Le varie implementazioni di JavaScript, come già accaduto per HTML, spesso non sono conformi agli standard, ma piuttosto sono costruite per funzionare con uno specifico browser web e con un insieme di versioni specifiche degli stessi. L'attuale standardECMAScript dovrebbe essere teoricamente la base di tutte le implementazioni JavaScript, ma in pratica i browserMozilla (eNetscape) usanoJavaScript,Microsoft Internet Explorer usaJScript, e altri browser comeOpera eSafari usano altre implementazioniECMAScript, spesso con ulteriori caratteristiche non standard, per permettere lacompatibilità con JavaScript e JScript.
JavaScript e JScript contengono molte caratteristiche che non sono parte dello standard ufficiale ECMAScript e possono anche essere privi di diverse caratteristiche. In tal modo, sono in parte incompatibili, il che porta gli autori di script a dovere sopperire a tali problemi durante la scrittura delsoftware. Tra i due, JavaScript è più conforme allo standard: ciò significa che uno script redatto secondo gli standard ECMA funzionerà con la maggior parte dei browser, soprattutto se in versioni recenti.
Un altro effetto è che ciascun browser potrebbe trattare lo stesso script in modo diverso, e ciò che funziona in un browser potrebbe non funzionare in un altro o in una diversa versione dello stesso browser. Come con l'HTML, è quindi raccomandabile scrivere codice conforme agli standard. Negli anni sono state realizzate varie librerie e framework, che possono essere usate per semplificare la scrittura di codice JavaScript che funzioni correttamente indipendentemente dal browser usato. Una delle librerie più conosciute e diffuse per semplificare la scrittura di semplici script all'interno di pagine HTML oPHP èjQuery, mentre esistono numerosi framework per scrivere applicativi in JavaScript anche estremamente sofisticati (lato client e/o lato server) ignorando del tutto la necessità di riconoscere quale browser utilizzerà l'utente finale.
Esistono due tecniche principali per gestire le incompatibilità:browser sniffing (letteralmente "annusare il browser") eobject detection ("rilevazione dell'oggetto"). Quando esistevano solo due browser che supportavano lo scripting, ovvero Netscape e Internet Explorer, il browser sniffing era la tecnica più diffusa. Controllando un certo numero di proprietà del client, che restituivano informazioni su piattaforma, browser e versione, era possibile per il codice discernere esattamente in quale browser veniva eseguito. in seguito le tecniche disniffing divennero più difficili da implementare, dato che Internet Explorer cominciò a dissimulare le proprie informazioni, per esempio fornendo informazioni sul browser sempre più inaccurate (i motivi per questo comportamento della Microsoft sono da tempo oggetto di disputa). Più tardi ancora, il browser sniffing divenne una sorta di complicata forma d'arte, quando cioè altri browser dotati di scripting entrarono nel mercato, ciascuno con proprie informazioni su piattaforma, client e versione.
L'object detection si basa sul controllo dell'esistenza della proprietà di un oggetto.
functionset_image_source(imageName,imageURL){// Test per verificare se l'oggetto 'document' ha una proprietà 'images'if(document.images){// eseguito solo se esiste un vettore 'images'document.images[imageName].src=imageURL;}}
Un esempio più complesso si basa sull'uso di testbooleani collegati:
if(document.body&&document.body.style)
In questo caso, l'espressione "document.body.style" normalmente causerebbe un errore in un browser che non ha la proprietà "document.body", ma l'uso dell'operatore "&&" assicura che "document.body.style" non venga mai chiamato se "document.body" non esiste. Il test sfrutta questa particolarità della valutazione di espressioni logiche, chiamatalazy evaluation (letteralmente "valutazione pigra").
Oggi, una combinazione di browser sniffing, object detection e conformità agli standard, come le specifiche ECMAScript e iCSS, sono usati in varie misure per provare ad assicurare che un utente non incontri mai un errore JavaScript.
A differenza di altri linguaggi, quali il C o il C++, che permettono la scrittura diprogrammi completamente stand-alone, JavaScript viene utilizzato soprattutto comelinguaggio di scripting, integrato, ovvero all'interno di altro codice.
L'idea di base è che ilprogramma ospite (quello che ospita ed esegue lo script) fornisca allo script un'API ben definita, che consente l'accesso a operazioni specifiche, la cui implementazione è a carico delprogramma ospite stesso. Lo script, quando eseguito, utilizza riferimenti a questa API per richiedere (alprogramma ospite) l'esecuzione di operazioni specifiche, non previste dai costrutti del linguaggio JavaScript in sé. Tale meccanismo viene adottato anche in linguaggi quale ilC oJava, nel quale il programma si affida a dellelibrerie, non previste dal linguaggio in sé, che permettono di effettuare operazioni quali l'I/O o l'esecuzione di chiamate a funzioni di sistema.
L'esempio tipico (e, forse, il più noto e comune) diprogramma ospite per uno script JavaScript è quello delbrowser. Un browser moderno incorpora normalmente uninterprete JavaScript. Quando viene visitata unapagina web che contiene codice JavaScript, quest'ultimo viene eseguito dall'interprete contenuto nel browser. Le interfacce che consentono a JavaScript di rapportarsi con un browser sono chiamateDOM (Document Object Model in italianoModello a Oggetti del Documento). Molti siti web usano la tecnologia JavaScript lato client per creare potentiapplicazioni webdinamiche.
Un uso principale del JavaScript in ambitoWeb è la scrittura di piccole funzioni integrate nelle pagineHTML, che interagiscono con il DOM del browser per compiere determinate azioni non possibili con il soloHTML statico: controllare i valori nei campi di input, nascondere o visualizzare determinati elementi, ecc. Sfortunatamente, gli standard DOM imposti dalW3C non sempre vengono rispettati in modo coerente e omogeneo da tutti. Browser diversi, a seconda del loromotore di rendering, espongono diversi oggetti o metodi allo script, perciò spesso è necessario implementare controlli aggiuntivi a una funzione JavaScript, per garantirne la compatibilità con ciascun browser e persino in funzione delle varie versioni del medesimo browser.
Al di fuori del Web, interpreti JavaScript sono integrati in diverse applicazioni.Adobe Acrobat eAdobe Reader supportano JavaScript neifilePDF. La piattaformaMozilla, che è alla base di molti diffusi browser Web, usa JavaScript per implementare l'interfaccia utente e la logica di transazione dei suoi vari prodotti. Gli interpreti JavaScript sono integrati anche nelle applicazioni proprietarie prive di interfacce programmabili via script. Infine la tecnologiaWindows Script Host diMicrosoft supporta JavaScript (via JScript), un linguaggio di scripting per isistemi operativi.
Ciascuna di queste applicazioni fornisce il proprio modello a oggetti, che dà accesso all'ambiente ospite, con il nucleo del linguaggio JavaScript che rimane per lo più invariato in ciascuna applicazione. Ci sono diverse implementazioni del nucleo del linguaggio JavaScript, tra le quali:
Per inserire uno script in una pagina HTML, è necessario l'utilizzo del tagscript. Questo tag non è parte del linguaggio JavaScript in sé, serve solo come "contenitore" all'interno di una pagina HTML.
Un documento può presentare in più parti la definizione del tag script. Tramite questo tag si può rappresentare la versione utilizzata e a seconda del browser si avrà l'interpretazione della parte di codice appropriata. Le definizioni possono essere le seguenti:
I segnalatori di commento<!-- ...--> sono necessari per assicurare che il codice non venga visualizzato come testo da browser molto vecchi, che non riconoscono il tag<script> nei documenti HTML, mentre LANGUAGE è un attributo HTML (il cui uso è ormai sconsigliato) che può essere richiesto da vecchi browser. Comunque, i tag <script> nei documentiXHTML/XML non funzionano se commentati, dato che i parser conformi agli standard XHTML/XML ignorano i commenti e possono anche incontrare problemi con i simboli--,< e> negli script (per esempio, confondendoli con gli operatori di decremento degli interi e di confronto). I documenti XHTML dovrebbero quindi includere gli script come sezioniCDATA dell'XML, facendoli precedere da
<script>//<![CDATA[
e facendoli seguire da
//]]></script>
(I simboli '//' all'inizio di una linea segnalano l'inizio di un commento JavaScript, per impedire che<![CDATA[ e]]> vengano analizzati dallo script.)
Gli elementi HTML[1] possono contenere eventi intrinseci che possono essere associati a gestori specificati da uno script. Per scrivere del codice HTML 4.01 valido, il server web dovrebbe restituire un 'Content-Script-Type' con valore 'text/JavaScript'. Se il server web non può essere configurato a tale scopo, l'autore del sito web può inserire la seguente dichiarazione nella sezione di intestazione del documento
JavaScript può essere usato per ogni aspetto dello scripting latoclient di unweb browser, ma alcuni usi si sono diffusi più di altri. Tra gli esempi ricorrenti vi sono la sostituzione di immagini, la creazione di finestrepop-up e la convalida dei dati inseriti inform. Nella maggior parte dei browser, il seguente frammento di codiceXHTML mostra un modo con cui un'immagine può essere sostituita con un'altra quando l'utente muove ilcursore su di essa. Tale effetto è chiamato spessorollover omouse over. Comunque comportamenti simili possono essere ottenuti ancheusando solo i CSS.
Un nuovo esempio di uso di JavaScript sono iBookmarklet, piccole sezioni di codice all'interno deisegnalibri oPreferiti dei browser web. Il linguaggio di programmazione usato inMacromedia Flash (chiamatoActionScript) ha una forte somiglianza con JavaScript, dovuta alla loro relazione condivisa conECMAScript. ActionScript ha quasi la stessa sintassi di JavaScript, ma il modello a oggetti[7] è decisamente diverso.
JavaScript for OSA (JavaScript OSA, or JSOSA), è un linguaggio di scripting perMacintosh basato sull'implementazione JavaScript 1.5 diMozilla[8]. È un componentefreeware reso disponibile daLate Night Software. L'interazione con il sistema operativo e con le applicazioni di terze parti è gestita tramite un oggettoMacOS. A parte ciò, il linguaggio è virtualmente identico all'implementazione Mozilla. È stato proposto come alternativa al più usato linguaggioAppleScript.
Levariabili sono in genere tipizzate dinamicamente ovvero sono definite semplicemente assegnando loro un valore oppure usando il comandolet,che permette di modificare la variabile, o dal comando const (constant) che indica che la variabile non può essere modificata; quelle dichiarate fuori da qualunque funzione sono in visibilità "globale" ovvero accessibili dall'interapagina web; quelle dichiarate dentro una funzione sono invece locali ovvero interne per quella funzione.Per passare variabili da una pagina all'altra, uno sviluppatore può impostare uncookie o usare un frame nascosto o una finestra in background per memorizzarli.
Ogni cosa in JavaScript è o un valore primitivo o un oggetto. Gli oggetti sono entità dotate di unicità (sono uguali solo a sé stessi) e che associano nomi di proprietà a valori.Ciò significa che un oggetto è unvettore associativo simile agli hash inPerl eRuby, o ai dizionari inPython,PostScript eSmalltalk.
JavaScript ha diversi generi di oggetti predefiniti, in particolareArray,Boolean (booleani),Date (oggetti contenenti una data e un'ora),Function (funzioni),Math (oggetto contenente funzioni di uso nel calcolo matematico),Number (numeri),Object (oggetti),RegExp (espressioni regolari) eString (stringhe). Altri oggetti sono gli "oggetti ospiti", definiti non dal linguaggio ma dall'ambiente di esecuzione. In un browser, i tipici oggetti ospite appartengono alDOM:window (finestra),form (maschera),link (collegamento) ecc.
Definendo uncostruttore, è possibile definire oggetti. JavaScript è un linguaggio orientato a oggetti basato su prototipi. Ciò significa che l'eredità è fra oggetti, non fraclassi (JavaScript non ha classi). Gli oggetti ereditano le proprietà dai loro prototipi.
Si possono aggiungere ulteriori proprietà o metodi ai singoli oggetti dopo che sono stati creati. Per far questo per tutte le istanze create da un singolo costruttore, si può usare la proprietàprototype del costruttore per accedere all'oggetto prototipo.
Esempio: Creazione di un oggetto
// costruttorefunctionMyObject(attributeA,attributeB){this.attributeA=attributeA;this.attributeB=attributeB;}// crea un Oggettoobj=newMyObject('red',1000);// accede a un attributo di objalert(obj.attributeA);// accede a un attributo con la notazione del vettore associativoalert(obj["attributeA"]);
Oltre a permettere la definizione di oggetti, JavaScript mette a disposizione tutta una serie di oggetti che possono essere utilizzati per i propri script:
Un array è un'associazione tra interi e valori di tipo arbitrario. In JavaScript, tutti gli oggetti possono associare interi e valori, ma gli array sono un tipo speciale di oggetti che hanno dei comportamenti specifici e metodi specializzati per l'uso degli indici interi (per es.,join,slice, epush).
Gli array hanno una proprietàlength che è garantita essere sempre maggiore dell'indice più grande usato nel vettore. È automaticamente aggiornata se si crea una proprietà con un indice ancora maggiore. Scrivere un numero più piccolo nella proprietàlength rimuove gli indici più grandi. Questa proprietà è l'unica caratteristica speciale dei vettori, che li distingue dagli altri oggetti.
Con gli elementi degli array si può utilizzare la normale notazione per accedere alle proprietà degli oggetti:
myArray[1]myArray["1"]
Queste due notazioni sono equivalenti. Non è possibile usare la notazione a punto o le stringhe con una rappresentazione alternativa del numero:
myArray.1 (errore di sintassi)myArray(1) (sintassi errata, ammessa unicamente da Internet Explorer)myArray["01"] (non è lo stesso dimyArray[1])
La dichiarazione di un vettore può usare o una notazione esplicita o il costruttoreArray:
myArray = [0,1,,,4,5]; (vettore di lunghezza 6 con 4 elementi)myArray = new Array(0,1,2,3,4,5); (vettore con lunghezza 6 e 6 elementi)myArray = new Array(365); (vettore vuoto con lunghezza 365)
GliArray sono implementati in modo che solo gli elementi definiti usino memoria; sono "vettori sparsi". ImpostaremyArray[10] = 'qualcosa' emyArray[57] = 'qualcosaltro' usa solo lo spazio per questi due elementi, come per ogni altro oggetto. La lunghezza dell'array verrà sempre riportata come 58.
La struttura di controllo IF corrisponde in italiano a SE
L'istruzione contenuta all'interno delle parentesi graffe verrà eseguita solo e soltanto se la condizione restituisce il valore true (vero),altrimenti verrà eseguita l'istruzione contenuta nell'ELSE.
if (condizione) { istruzioni; }
if (condizione) { istruzioni; }else { istruzioni; }
Unafunzione è un blocco diistruzioni, dotato di una lista di argomenti (eventualmente vuota) e che può avere un nome (anche se non è necessario). Una funzione può restituire un valore tramite l'istruzionereturn.
function(può essere vuoto) { istruzioni;return espressione; }
Il numero degli argomenti passati quando si chiama una funzione non deve necessariamente essere uguale al numero degli argomenti della definizione della funzione (in altre parole, il numero diparametri formali non deve necessariamente essere rispettato all'atto dell'invocazione della funzione cioè nella specifica deiparametri attuali). All'interno della funzione ci si può riferire alla lista degli argomenti anche tramite il vettorearguments (quest'ultimo possiede la proprietàcallee rappresentante un puntatore alla funzione stessa).
Ogni funzione è un'istanza diFunction, un tipo di oggetto base. Le funzioni possono essere create e assegnate come ogni altro oggetto:
var myFunc1 =new Function("alert('Hello')");var myFunc2 = myFunc1; myFunc2();
Per scrivere a video (cioè nella pagina in cui si trova lo script) è possibile utilizzare il metodo document.write(); le stringhe da visualizzare possono essere concatenate utilizzando l'operatore di concatenazione '+':
<html><head><scripttype="text/javascript"><!--Nascondeloscriptaibrowserobsoleti// Questa funzione genera una riga orizzontale della larghezza scelta.functionbar(widthPct){document.write("<hr align='left' width='"+widthPct+"%' />");}// Questa funzione genera del testo preceduto da un titolo di dato livello.functionoutput(headLevel,headText,text){document.write("<h"+headLevel+">"+headText+"</h"+headLevel+"><p>"+text+"</p>");}// Fine del codice da nascondere --></script></head><body><scripttype="text/javascript"><!--Nascondeloscriptaibrowserobsoletibar(25)output(2,"JavaScript Rules!","Usare JavaScript è facile...")// Fine del codice da nascondere --></script><p>QuestoènormaleHTML,adifferenzadiquellogeneratodalcodicesopra.</p></body></html>
Gli elementi di testo possono essere la fonte di varieventi che possono avviare un'azione se è stato registrato ungestore di eventi ECMAScript. Nell'HTML, questi gestori di eventi sono spesso funzioni definite come anonime direttamente all'interno del tag HTML. La sintassi per richiamare un evento in uno script è la seguente:
Oggetto.evento=handler;
Esistono varie categorie di eventi:
Eventi attivabili dai tasti del mouse
Eventi attivabili dai movimenti del mouse
Eventi attivabili dal trascinamento del mouse (drag and drop)
onMouseOver: attivato quando il mouse si muove su un oggetto;
onMouseOut: attivato quando il mouse si sposta da un oggetto;
onMouseMove: si muove il puntatore del mouse, ma poiché questo evento ricorre spesso (l'utilizzo del mouse è frequente), non è disponibile per default, ma solo abbinato con la cattura degli eventi, che si spiegherà in seguito.
onDragDrop: evento attivato quando un utente trascina un oggetto sulla finestra del browser o quando rilascia un file sulla stessa;
onMove: attivato quando un oggetto muove una finestra o un frame;
onDragStart: evento attivato appena l'utente inizia a trascinare un oggetto;
onDrag: attivato quando il mouse trascina un oggetto o una selezione di testo nella finestra dello stesso browser o anche di un altro o anche sul Desktop;
onDragEnter: attivato appena l'utente trascina un oggetto su un obiettivo valido dello stesso o di un altro browser;
onDragOver: attivato quando l'utente trascina un oggetto su un obiettivo valido a ospitarlo, ed è simile all'evento precedente, ma viene attivato dopo quello;
onDragLeave: attivato quando l'utente trascina un oggetto su un obiettivo adatto per ospitarlo, ma non vi viene rilasciato;
onDragEnd: attivato quando l'utente rilascia l'oggetto al termine del trascinamento.
onDrop: attivato quando il mouse si alza il tasto del mouse in seguito ad un'operazione di trascinamento;
Attivato quando il contenuto di un campo di un form o modulo è modificato o non è più selezionato. Viene utilizzato anche con gli oggetti FileUpload, Select, Text, TextArea.
Esempio:
<inputtype="text"value="Enter email address"name="userEmail"onChange=validateInput(this.value)/><scripttype="text/javascript">this.myForm.userEmail.focus();this.myForm.userEmail.select();functionvalidateInput(){userInput=newString();userInput=this.myForm.userEmail.value;if(userInput.match("@"))alert("Thanks for your interest.");elsealert("Please check your email details are correct before submitting");}</script>
Evento attivato quando lo stato del caricamento di un elemento cambia, l'evento è utile, ad esempio, per verificare che un elemento sia stato caricato.
Viene attivato quando il puntatore del mouse o il cursore esce dalla finestra corrente utilizzando il mouse o il carattere TAB. Applicato ai moduli, invece, tale handler si avvia se si esce dal campo il cui tag contiene il controllo;
Esempio
Enteremailaddress<inputtype="text"value=""name="userEmail"onBlur=addCheck()><scripttype="text/javascript">functionaddCheck(){alert("Please check your email details are correct before submitting")}</script>
Attivabile quando si seleziona del testo all'interno di una casella di testo sia col mouse sia tenendo premuto SHIFT e selezionando con i tasti Freccia;
L'Handler dell'evento onAbort permette di specificare del codice nel caso in cui l'utente blocchi il caricamento di un oggetto, o che si blocchi il caricamento di un'immagine.
Questo handler usa le seguenti proprietà dell'evento.
Esempio
<imgname="myPic"SRC="images/myPic.gif"onAbort="alert('Loading of image aborted!')">
Si attiva quando il caricamento di un oggetto causa un errore, ma solo se questo è dovuto ad un errore di sintassi del codice e non del browser così funziona su un link errato di un'immagine della pagina, ma non su un link errato di caricamento di una pagina intera. Opera non gestisce questo evento, ormai obsoleto: per una corretta gestione degli errori si utilizza il costrutto try... catch;
Questo handler funziona quando si ferma il caricamento della pagina con il tasto stop del browser e dovrebbe funzionare anche allo stesso modo di onUnload caricandosi prima di questo ma dopo onBeforeUnload.
onLoad Questo gestore è usato con i tag <BODY> e <FRAMESET> e da JavaScript 1.1anche con <IMG> mentre in Explorer occorre aggiungere anche i tag <SCRIPT>, <LINK>, <EMBED>, <APPLET>. In JavaScript 1.2 in Netscape si aggiunge anche il tag <LAYER>.
onUnload Questo gestore è usato con i tag <BODY> e <FRAMESET> anche in Internet Explorer.
onAbort Questo gestore è usato solo con il tag<IMG> anche in Internet Explorer.
onError Questo gestore è usato solo con il tag<IMG> e con Window mentre in Internet Explorer anche con <OBJECT> e <STYLE>.
onBeforeUnload Questo gestore è usato con i tag <BODY> anche in Internet Explorer.
onStop Questo gestore è usato con i tag <BODY> anche in Internet Explorer.
onResize: Questo handler si attiva quando l'utente rimpicciolisce o ingrandisce una finestra o un frame o, in caso particolare per Explorer, un oggetto a cui siano stati fissati l'altezza e la larghezza o anche la posizione, come ad esempio un layer;
onScroll: attivato quando si effettua lo scrolling della pagina sia col mouse con i tasti PGUP e PGDOWN o anche con il metodo doScroll.
Il costruttotry ... catch ... finally intercetta leeccezioni generate da un errore o da un'istruzionethrow. La sua sintassi è la seguente:
try{// Istruzioni in cui possono essere lanciate delle eccezioni}catch(error){// Istruzioni da eseguire in caso di eccezione}finally{// Istruzioni da eseguire successivamente in entrambi i casi}
Inizialmente, vengono eseguite le istruzioni all'interno del bloccotry. Se viene lanciata un'eccezione, il flusso di controllo dello script viene passato immediatamente alle istruzioni del blocco catch, con l'eccezione che viene resa disponibile come argomentoerror. In caso contrario, il bloccocatch viene saltato. Una volta che il bloccocatch è concluso, o il bloccotry viene eseguito fino alla fine senza che sia lanciata alcuna eccezione, vengono eseguite le istruzioni nel bloccofinally.
La pagina web può contenere altri tipi di elementi grafici come questi. Non si tratta di notifiche di sistema.
Le notifiche di sistema sono progettate per richiedere l'attenzione dell'utente, mostrando un breve messaggio anche al di fuori della pagina corrente o anche se il browser non è al momento in primo piano. Data la loro potenziale invasività, è possibile utilizzarle solo se il sito ha già ottenuto dall'utente uno specifico consenso.[10][11]
Le notifiche di sistema, come suggerisce il nome, sono integrate coerentemente al dispositivo corrente (su desktop è spesso unpop-up, su mobile è spesso nella barra di notifica, etc.).[10][11]
Segue un esempio minimale con due pulsanti, per richiedere i permessi per le notifiche di sistema e per visualizzarne una.
<buttonid="btn-asking">Richiedi permessi</button><buttonid="btn-notify">Mostra notifica</button><script>// ricerca pulsantivarbtnAsking=document.getElementById('btn-asking');varbtnNotify=document.getElementById('btn-notify');// dopo il click lancia la richiesta di permessibtnAsking.addEventListener('click',function(){Notification.requestPermission();});// dopo il click mostro una notificabtnNotify.addEventListener('click',function(){newNotification("Nuova notifica!");});</script>
L'approfondimento della documentazione ufficiale permette di effettuare ulteriori buone pratiche, fra le quali:
verifica del supporto (per esempioSafari suiOS è noto per non aver raggiunto un ottimo supporto)[11][12]
rispetto del consenso pregresso (evitare di richiedere molteplici richieste di consenso)
rispetto del dissenso (evitare di tentare l'apertura di notifiche se non c'è consenso)
Il lancio della richiesta di permessi dovrebbe avvenire solo a seguito di una interazione con l'utente (come il click di un pulsante). Molti browser moderni proibiscono persino l'apertura del pop-up della richiesta di consenso per le notifiche native se non c'è stata interazione.[11]
Possibilità per l'utente di modificare la pagina web come se si trovasse all'interno di un editorWYSIWYG, anche se le modifiche non saranno salvate nella reale pagina web remota ma solo visibili nel browser dell'utente:
Riportare dati che indicano cambiamenti all'orientamento del dispositivo in relazione all'attrazione di gravità. In particolare, i dispositivi portatili come i telefoni cellulari possono utilizzare queste informazioni per ruotare automaticamente il display in modo da rimanere in posizione verticale, presentando una vista a tutto schermo del contenuto web quando il dispositivo viene ruotato in modo che la sua larghezza sia maggiore della sua altezza.
<htmlmanifest="cache.appcache">window.applicationCache.addEventListener('updateready',function(e){if(window.applicationCache.status==window.applicationCache.UPDATEREADY){window.applicationCache.swapCache();if(confirm('A new version of this site is available. Load it?')){window.location.reload();}}},false);
vardb=window.openDatabase("DBName","1.0","description",5*1024*1024);//5MBdb.transaction(function(tx){tx.executeSql("SELECT * FROM test",[],successCallback,errorCallback);});
Questa API utilizza gli indici per abilitare le ricerche ad alte prestazioni dei dati. Sebbene l'archiviazione web sia utile per archiviare quantità minori di dati, è meno utile per archiviare quantità maggiori di dati strutturati. IndexedDB fornisce una soluzione.
varworker=newWorker('task.js');worker.onmessage=function(event){alert(event.data);};worker.postMessage('data');task.js:self.onmessage=function(event){// Do some work.self.postMessage("recv'd: "+event.data);};
Comunicazione bidirezionale full-duplex sul Web: sia il server che il client possono inviare dati in qualsiasi momento o anche contemporaneamente. Vengono inviati solo i dati stessi, senza il sovraccarico delle intestazioni HTTP, riducendo drasticamente lalarghezza di banda.
Offre la possibilità di modificare l'URL di un sito Web senza un aggiornamento completo della pagina. Ciò è utile per caricare parti di una pagina con JavaScript in modo tale che il contenuto sia notevolmente diverso e garantisca un nuovo URL.
JavaScript comprende librerie e framework per creare interfacce 3D sul web[13].
Esempio di WebGL
functionmain(){constcanvas=document.querySelector("#glCanvas");constgl=canvas.getContext("webgl");if(gl===null){alert("Aggiorna il tuo browser");return;}gl.clearColor(0.0,0.0,0.0,1.0);gl.clear(gl.COLOR_BUFFER_BIT);}window.onload=main;