text: In informatica JavaScript è un linguaggio di programmazione multi paradigma orientato agli eventi, utilizzato sia nella programmazione lato client web che lato server (NodeJs) per la creazione di rest API, applicazioni desktop e embedded, siti web e applicazioni web, di effetti dinamici interattivi tramite funzioni di script invocate da eventi innescati a loro volta in vari modi dall'utente sulla pagina web in uso (mouse, tastiera, caricamento della pagina ecc...). Originariamente sviluppato da Brendan Eich della Netscape Communications con il nome di Mocha e successivamente di LiveScript, in seguito è stato rinominato "JavaScript" ed è stato formalizzato con una sintassi più vicina a quella del linguaggio Java di Sun Microsystems (che nel 2010 è stata acquistata da Oracle). Standardizzato per la prima volta il 1997 dalla ECMA con il nome ECMAScript, l'ultimo standard, di giugno 2022, è ECMA-262 Edition 13 ed è anche uno standard ISO (ISO/IEC 16262). Descrizione Le funzioni di script, utilizzati dunque nella logica di presentazione, possono essere opportunamente inserite in file HTML, in pagine JSP o in appositi file separati con estensione .js poi richiamati nella logica di business. Ultimamente il suo campo di utilizzo è stato esteso alle cosiddette Hybrid App (app ibride), con le quali è possibile creare app per più sistemi operativi utilizzando un unico codice sorgente basato appunto su JavaScript, HTML e CSS. Java, JavaScript e JScript 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 browser Netscape Navigator. 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 dal linguaggio C); le loro semantiche sono piuttosto diverse, e in particolare i loro object model non hanno relazione e sono notevolmente incompatibili. Dato il successo di JavaScript come linguaggio per arricchire le pagine web, Microsoft sviluppò un linguaggio compatibile, conosciuto come JScript. La necessità di specifiche comuni fu alla base dello standard ECMA 262 per ECMAScript, di cui sono state pubblicate otto edizioni da quando il lavoro iniziò, nel novembre 1996. Aspetti strutturali Le caratteristiche principali di JavaScript sono: essere un linguaggio interpretato: il codice non viene compilato, ma eseguito direttamente; in JavaScript lato client, il codice viene eseguito dall'interprete contenuto nel browser dell'utente. la sintassi è relativamente simile a quella dei linguaggi C, C++ e Java. definisce le funzionalità tipiche dei linguaggi di programmazione ad alto livello (strutture di controllo, cicli, ecc.) e consente l'utilizzo del paradigma object oriented. è un linguaggio debolmente tipizzato. è un linguaggio debolmente orientato agli oggetti. Ad esempio, il meccanismo dell'ereditarietà è più simile a quello del Self e del NewtonScript che a quello del linguaggio Java, fortemente orientato agli oggetti. Gli oggetti stessi ricordano più gli array associativi del linguaggio Perl che gli oggetti di Java o C++. Altri aspetti di interesse: in JavaScript lato client, il codice viene eseguito direttamente sul client e non sul server. Il vantaggio di questo approccio è che, anche con la presenza di script particolarmente complessi, il web 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 una base di dati remota deve essere rimandata a un linguaggio che effettui materialmente la transazione, per poi restituire i risultati ad 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 di AJAX. Alcune altre caratteristiche di JavaScript degne di nota: Può usare caratteri Unicode Può valutare le espressioni regolari (introdotte nella versione 1.2; supporto da parte dei browser: a partire da Netscape Navigator 4 e Internet Explorer 4) Le espressioni JavaScript contenute in una stringa possono essere valutate usando la funzione eval. Incompatibilità 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 standard ECMAScript dovrebbe essere teoricamente la base di tutte le implementazioni JavaScript, ma in pratica i browser Mozilla (e Netscape) usano JavaScript, Microsoft Internet Explorer usa JScript, e altri browser come Opera e Safari usano altre implementazioni ECMAScript, spesso con ulteriori caratteristiche non standard per permettere la compatibilità 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 del software. 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. Naturalmente 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 o PHP è 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. Contromisure Esistono due tecniche principali per gestire le incompatibilità: browser sniffing (letteralmente "annusare il browser") e object 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 di sniffing 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. function set_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 test booleani 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, chiamata lazy evaluation (lett. "valutazione pigra"). Oggi, una combinazione di browser sniffing, object detection, e conformità agli standard come le specifiche ECMAScript e i CSS sono usati in varie misure per provare ad assicurare che un utente non incontri mai un errore JavaScript. Uso A differenza di altri linguaggi, quali il C o il C++, che permettono la scrittura di programmi completamente stand-alone, JavaScript viene utilizzato soprattutto come linguaggio di scripting, integrato, ovvero all'interno di altro codice. L'idea di base è che il programma ospite (quello che ospita ed esegue lo script) fornisca allo script un'API ben definita, che consente l'accesso ad operazioni specifiche, la cui implementazione è a carico del programma ospite stesso. Lo script, quando eseguito, utilizza riferimenti a questa API per richiedere (al programma ospite) l'esecuzione di operazioni specifiche, non previste dai costrutti del linguaggio JavaScript in sé. Tale meccanismo viene adottato anche in linguaggi quale il C o Java, nel quale il programma si affida a delle librerie, 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) di programma ospite per uno script JavaScript è quello del browser. Un browser moderno incorpora normalmente un interprete JavaScript. Quando viene visitata una pagina 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 chiamate DOM (Document Object Model in italiano Modello a Oggetti del Documento). Molti siti web usano la tecnologia JavaScript lato client per creare potenti applicazioni web dinamiche. Un uso principale del JavaScript in ambito Web è la scrittura di piccole funzioni integrate nelle pagine HTML che interagiscono con il DOM del browser per compiere determinate azioni non possibili con il solo HTML statico: controllare i valori nei campi di input, nascondere o visualizzare determinati elementi, ecc. Sfortunatamente, gli standard DOM imposti dal W3C non sempre vengono rispettati in modo consistente ed omogeneo da tutti. Browser diversi, a seconda del loro motore di rendering, espongono diversi oggetti o metodi allo script, perciò spesso è necessario implementare controlli aggiuntivi ad 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 e Adobe Reader supportano JavaScript nei file PDF. La piattaforma Mozilla, 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 tecnologia Windows Script Host di Microsoft supporta JavaScript (via JScript), un linguaggio di scripting per i sistemi 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: KJS Rhino SpiderMonkey Narcissus NJS NGS Resin FESI SEE DMDScript V8 JägerMonkey Chakra Utilizzo in HTML Tag script (HTML) Per inserire uno script in una pagina HTML, è necessario l'utilizzo del tag script. Questo tag non è parte del linguaggio JavaScript in sé, serve solo come "contenitore" all'interno di una pagina HTML. <script type="text/javascript"> // <![CDATA[ JavaScript statements... // ]]> </script> 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: <script type="text/javascript"> ... </script> Esempio: Hello world! Il seguente esempio visualizza un messaggio di avviso con all'interno scritto "Hello world". <script type="text/javascript"> alert('Hello world'); </script> Per "scrivere" direttamente nella pagina HTML: <script type="text/javascript"> document.write('Hello world'); </script> Il tipo MIME per il codice sorgente JavaScript source code è application/javascript, ma è più usato text/javascript, anche se non standard. Per integrare del codice JavaScript in un documento HTML, bisogna farlo precedere da: <script type="text/javascript"> e seguire da: </script> Browser più vecchi tipicamente richiedono che il codice inizi con: <script language="JavaScript" type="text/javascript"> <!-- e finisca con: // --> </script> 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 documenti XHTML/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 sezioni CDATA dell'XML, facendoli precedere da <script type="text/javascript"> //<![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 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 <meta http-equiv="Content-Script-Type" content="text/javascript" /> Usi frequenti nei web browser JavaScript può essere usato per ogni aspetto dello scripting lato client di un web browser, ma alcuni usi si sono diffusi più di altri. Tra gli esempi ricorrenti vi sono la sostituzione di immagini, la creazione di finestre pop-up e la convalida dei dati inseriti in form. Nella maggior parte dei browser, il seguente frammento di codice XHTML mostra un modo con cui un'immagine può essere sostituita con un'altra quando l'utente muove il cursore su di essa. Tale effetto è chiamato spesso rollover o mouse over. Comunque comportamenti simili possono essere ottenuti anche usando solo i CSS. <img src = "normal.png" onclick = "window.location.href='http://en.wikipedia.org/'" onmouseover = "this.src='rollover.png'" onmouseout = "this.src='normal.png'" /> Filiazioni Un nuovo esempio di uso di JavaScript sono i Bookmarklet, piccole sezioni di codice all'interno dei segnalibri o Preferiti dei browser web. Il linguaggio di programmazione usato in Macromedia Flash (chiamato ActionScript) ha una forte somiglianza con JavaScript, dovuta alla loro relazione condivisa con ECMAScript. ActionScript ha quasi la stessa sintassi di JavaScript, ma il modello a oggetti è decisamente diverso. JavaScript for OSA (JavaScript OSA, or JSOSA), è un linguaggio di scripting per Macintosh basato sull'implementazione JavaScript 1.5 di Mozilla. È un componente freeware reso disponibile da Late Night Software. L'interazione con il sistema operativo e con le applicazioni di terze parti è gestita tramite un oggetto MacOS. A parte ciò, il linguaggio è virtualmente identico all'implementazione Mozilla. È stato proposto come alternativa al più usato linguaggio AppleScript. Elementi del linguaggio Variabili Le variabili sono in genere tipizzate dinamicamente ovvero sono definite semplicemente assegnando loro un valore oppure usando il comando let; quelle dichiarate fuori da qualunque funzione sono in visibilità "globale" ovvero accessibili dall'intera pagina 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 un cookie o usare un frame nascosto o una finestra in background per memorizzarli. Oggetti 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 è un vettore associativo simile agli hash in Perl e Ruby, o ai dizionari in Python, PostScript e Smalltalk. JavaScript ha diversi generi di oggetti predefiniti, in particolare Array, 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) e String (stringhe). Altri oggetti sono gli "oggetti ospiti", definiti non dal linguaggio ma dall'ambiente di esecuzione. In un browser, i tipici oggetti ospite appartengono al DOM: window (finestra), form (maschera), link (collegamento) ecc. Definendo un costruttore, è possibile definire oggetti. JavaScript è un linguaggio orientato a oggetti basato su prototipi. Ciò significa che l'eredità è fra oggetti, non fra classi (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 // costruttore function MyObject(attributeA, attributeB) { this.attributeA = attributeA; this.attributeB = attributeB; } // crea un Oggetto obj = new MyObject('red', 1000); // accede ad un attributo di obj alert(obj.attributeA); // accede ad un attributo con la notazione del vettore associativo alert(obj["attributeA"]); Simulare l'ereditarietà La gerarchia degli oggetti in JavaScript può essere emulata. Per esempio: function Base() { this.Override = _Override; this.BaseFunction = _BaseFunction; function _Override() { alert("Base::Override()"); } function _BaseFunction() { alert("Base::BaseFunction()"); } } function Derive() { this.Override = _Override; function _Override() { alert("Derive::Override()"); } } Derive.prototype = new Base(); d = new Derive(); d.Override(); d.BaseFunction(); risulterà nell'output: Derive::Override() Base::BaseFunction() Oggetti predefiniti Oltre a permettere la definizione di oggetti, JavaScript mette a disposizione tutta una serie di oggetti che possono essere utilizzati per i propri script: Anchor Applet Area Array Base Basefont Body Button Checkbox Date Document Event File FileUpload Form Frame Frameset Function Hidden History Iframe Image Layer Link Location Math Meta Navigator Number Object Option Password Radio RegExp Reset Screen Select Style String Submit Table TableData TableHeader TableRow Text Textarea Window Array 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, e push). 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 di myArray[1]) La dichiarazione di un vettore può usare o una notazione esplicita o il costruttore Array: 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) Gli Array sono implementati in modo che solo gli elementi definiti usino memoria; sono "vettori sparsi". Impostare myArray[10] = 'qualcosa' e myArray[57] = 'qualcosaltro' usa solo lo spazio per questi due elementi, come per ogni altro oggetto. La lunghezza dell'array verrà sempre riportata come 58. Strutture di controllo e condizionali if ... else 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; } Ciclo while while (condizione) { istruzioni; } Ciclo do ... while do { istruzioni; } while (condizione); Ciclo for for ([espressione iniziale]; [condizione]; [espressione di incremento]) { istruzioni; } Ciclo for ... in Questo ciclo percorre tutte le proprietà di un oggetto (o gli elementi di un vettore). for (variabile in oggetto) { istruzioni; } Ciclo for ... of Questo ciclo percorre tutti i valori di un oggetto (o gli elementi di un vettore). for (variabile of oggetto) { istruzioni; } Istruzione switch switch (espressione) { case valore1: istruzioni; break; case valore2: istruzioni; break; default : istruzioni; } Funzioni Una funzione è un blocco di istruzioni, 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'istruzione return. 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 di parametri formali non deve necessariamente essere rispettato all'atto dell'invocazione della funzione cioè nella specifica dei parametri attuali). All'interno della funzione ci si può riferire alla lista degli argomenti anche tramite il vettore arguments (quest'ultimo possiede la proprietà callee rappresentante un puntatore alla funzione stessa). Ogni funzione è un'istanza di Function, 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(); produce come output: Hello Interazione con l'utente Tra le altre tecniche con le quali uno script JavaScript può interagire con l'utente all'interno di una pagina Web, ci sono le seguenti: elementi form HTML, modificabili accedendo al DOM HTML; Alert dialog box (finestra di avviso) Confirm dialog box (finestra di conferma) Prompt dialog box (finestra di richiesta input) Barra di stato del browser Standard output ("console") Nota: i dialog box non funzionano col browser Opera; non vi è nessun errore, semplicemente non vengono eseguite. Metodi di scrittura a video (Standard Output) 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> <script type="text/javascript"> <!-- Nasconde lo script ai browser obsoleti // Questa funzione genera una riga orizzontale della larghezza scelta. function bar(widthPct) { document.write("<hr align='left' width='" + widthPct + "%' />"); } // Questa funzione genera del testo preceduto da un titolo di dato livello. function output(headLevel, headText, text) { document.write("<h" + headLevel + ">" + headText + "</h" + headLevel + "><p>" + text + "</p>"); } // Fine del codice da nascondere --> </script> </head> <body> <script type="text/javascript"> <!-- Nasconde lo script ai browser obsoleti bar(25) output(2, "JavaScript Rules!", "Usare JavaScript è facile...") // Fine del codice da nascondere --> </script> <p>Questo è normale HTML, a differenza di quello generato dal codice sopra.</p> </body> </html> Eventi Gli elementi di testo possono essere la fonte di vari eventi che possono avviare un'azione se è stato registrato un gestore 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) Eventi attivabili dall'utente con la tastiera Eventi attivabili dalle modifiche dell'utente Eventi legati al "fuoco" Eventi attivabili dal caricamento degli oggetti Eventi attivabili dai movimenti delle finestre Eventi legati a particolari bottoni Altri e nuovi tipi di eventi Eventi attivabili dai tasti del mouse Lista eventi: onClick: attivato quando si clicca su un oggetto; onDblClick: attivato con un doppio click; onMouseDown: attivato quando si schiaccia il tasto sinistro del mouse; onMouseUp: attivato quando si alza il tasto sinistro del mouse precedentemente schiacciato; onContextMenu: attivato quando si clicca il tasto destro del mouse aprendo il ContextMenu. Il doppio click è un evento che ingloba gli altri e, per la precisione, attiva in successione onmousedown, onmouseup, onclick. Tag di applicazione A, ADDRESS, APPLET, AREA, B, BDO, BIG, BLOCKQUOTE, BODY, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FONT, FORM, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LEGEND, LI, LISTING, MAP, MARQUEE, MENU, NEXTID, NOBR, OBJECT, OL, P, PLAINTEXT, PRE, RT, RUBY, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TBODY, TD, TEXTAREA, TFOOT, TH, THEAD, TR, TT, U, UL, VAR, XMP Eventi attivabili dai movimenti del mouse Lista eventi: 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. Tag di applicazione A, ADDRESS, APPLET, AREA, B, BDO, BIG, BLOCKQUOTE, BODY, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FONT, FORM, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LEGEND, LI, LISTING, MAP, MARQUEE, MENU, NEXTID, NOBR, OBJECT, OL, P, PLAINTEXT, PRE, RT, RUBY, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TBODY, TD, TEXTAREA, TFOOT, TH, THEAD, TR, TT, U, UL, VAR, XMP Eventi attivabili dal trascinamento del mouse (drag and drop) Lista eventi: 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 ad 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; Tag di applicazione A, ADDRESS, APPLET, AREA, B, BDO, BIG, BLOCKQUOTE, BODY, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FONT, FORM, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LEGEND, LI, LISTING, MAP, MARQUEE, MENU, NEXTID, NOBR, OBJECT, OL, P, PLAINTEXT, PRE, RT, RUBY, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TBODY, TD, TEXTAREA, TFOOT, TH, THEAD, TR, TT, U, UL, VAR, XMP Eventi attivabili dall'utente con la tastiera Lista Eventi: onKeyPress: evento attivato quando un utente preme e rilascia un tasto o anche quando lo tiene premuto; onKeyDown: attivato quando viene premuto il tasto; onKeyUp: evento attivato quando un tasto, che era stato premuto, viene rilasciato; onHelp: attivato quando un utente preme il tasto F1; Eventi attivabili dalle modifiche dell'utente onChange 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: <input type="text" value="Enter email address" name="userEmail" onChange=validateInput(this.value) /> <script type="text/javascript"> this.myForm.userEmail.focus(); this.myForm.userEmail.select(); function validateInput() { userInput = new String(); userInput = this.myForm.userEmail.value; if (userInput.match("@")) alert("Thanks for your interest."); else alert("Please check your email details are correct before submitting"); } </script> onCellChange Attivato quando si modifica un elemento in una base di dati, per questa sua caratteristica ha un uso non propriamente legato a JavaScript; onPropertyChange Evento attivato quando cambia la proprietà di un elemento; onReadyStateChange Evento attivato quando lo stato del caricamento di un elemento cambia, l'evento è utile, ad esempio, per verificare che un elemento sia stato caricato. Tag di applicazione A, ADDRESS, APPLET, AREA, B, BDO, BIG, BLOCKQUOTE, BODY, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FONT, FORM, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LEGEND, LI, LISTING, MAP, MARQUEE, MENU, NEXTID, NOBR, OBJECT, OL, P, PLAINTEXT, PRE, RT, RUBY, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TBODY, TD, TEXTAREA, TFOOT, TH, THEAD, TR, TT, U, UL, VAR, XMP Eventi legati al "fuoco" onFocus Questo handler è l'opposto di onBlur per cui si attiva quando l'utente entra in un campo; onBlur 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 Enter email address <input type="text" value="" name="userEmail" onBlur=addCheck()> <script type="text/javascript"> function addCheck() { alert("Please check your email details are correct before submitting") } </script> onSelect 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; onSelectStart Si attiva quando si inizia a selezionare un evento; onbeforeEditFocus Si attiva con un doppio click o con un click su un oggetto che ha già la selezione, quando questo è in DesignMode; onLoseCapture Si attiva quando un oggetto perde la cattura del mouse. Tag di applicazione A, ADDRESS, APPLET, AREA, B, BDO, BIG, BLOCKQUOTE, BODY, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FONT, FORM, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LEGEND, LI, LISTING, MAP, MARQUEE, MENU, NEXTID, NOBR, OBJECT, OL, P, PLAINTEXT, PRE, RT, RUBY, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TBODY, TD, TEXTAREA, TFOOT, TH, THEAD, TR, TT, U, UL, VAR, XMP Eventi attivabili dal caricamento degli oggetti onLoad Questo handler funziona nel caricamento di oggetti, per lo più finestre e immagini; onUnload È l'opposto del precedente e funziona quando si lascia una finestra per caricarne un'altra o anche per ricaricare la stessa (col tasto refresh); onAbort 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 <img name = "myPic" SRC = "images/myPic.gif" onAbort = "alert('Loading of image aborted!')"> onError 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; onBeforeUnload Questo handler funziona allo stesso modo di onUnload ma si carica in un momento prima; onStop 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. Tag di applicazione onLoad Questo gestore è usato con i tag <BODY> e <FRAMESET> e da JavaScript 1.1anche con mentre in Explorer occorre aggiungere anche i tag <SCRIPT>, , <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 anche in Internet Explorer. onError Questo gestore è usato solo con il tag 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. Eventi attivabili dai movimenti delle finestre Lista Eventi: 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. Tag di applicazione A, ADDRESS, APPLET, B, BIG, BLOCKQUOTE, BUTTON, CENTER, CITE, CODE, custom, DD, DFN, DIR, DIV, DL, DT, EM, EMBED, FIELDSET, FORM, FRAME, Hn, HR, I, IMG, INPUT type=button, INPUT type=file, INPUT type=image, INPUT type=password, INPUT type=reset, INPUT type=submit, INPUT type=text, ISINDEX, KBD, LABEL, LEGEND, LI, LISTING, MARQUEE, MENU, OBJECT, OL, P, PRE, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TEXTAREA, TT, U, UL, VAR, window, XMP Eventi legati a particolari bottoni onSubmit: Questo handler è attivato dal click su tasto di Invio di un form; onReset: questo handler è attivato dal click su tasto di Annulla di un form. Tag di applicazione Handler applicabile solamente all'oggetto Form. Gestione degli errori Le versioni più nuove di JavaScript (a partire da quelle usate in Internet Explorer 5 e Netscape 6) incorporano la possibilità di un costrutto try... catch per la gestione degli errori. Il costrutto try ... catch ... finally intercetta le eccezioni generate da un errore o da un'istruzione throw. 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 blocco try. 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 argomento error. In caso contrario, il blocco catch viene saltato. Una volta che il blocco catch è concluso, o il blocco try viene eseguito fino alla fine senza che sia lanciata alcuna eccezione, vengono eseguite le istruzioni nel blocco finally. Integrazione con HTML5 Con la nascita di HTML5 JavaScript ha acquisito diverse novità: Riconoscimento vocale L'utente può parlare all'interno di un form anziché scrivere:<input type="text" x-webkit-speech /> var recognition = new SpeechRecognition(); var speechRecognitionList = new SpeechGrammarList(); 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. Le notifiche di sistema, come suggerisce il nome, sono integrate coerentemente al dispositivo corrente (su desktop è spesso un pop-up, su mobile è spesso nella barra di notifica, etc.). Segue un esempio minimale con due pulsanti, per richiedere i permessi per le notifiche di sistema e per visualizzarne una. <button id="btn-asking">Richiedi permessi</button> <button id="btn-notify">Mostra notifica</button> <script> // ricerca pulsanti var btnAsking = document.getElementById( 'btn-asking' ); var btnNotify = document.getElementById( 'btn-notify' ); // dopo il click lancia la richiesta di permessi btnAsking.addEventListener( 'click', function() { Notification.requestPermission(); } ); // dopo il click mostro una notifica btnNotify.addEventListener( 'click', function() { new Notification( "Nuova notifica!" ); } ); </script> L'approfondimento della documentazione ufficiale permette di effettuare ulteriori buone pratiche, fra le quali: verifica del supporto (per esempio Safari su iOS è noto per non aver raggiunto un ottimo supporto) 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. Contenuto editabile Possibilità per l'utente di modificare la pagina web come se si trovasse all'interno di un editor WYSIWYG, anche se le modifiche non saranno salvate nella reale pagina web remota ma solo visibili nel browser dell'utente:<div contenteditable="true"> Questo testo è editabile dall'utente. </div> document.execCommand("defaultParagraphSeparator", false, "p"); Drag out Trascinamento di file da una pagina web al computer o altro dispositivo:<a href="src/star.mp3" draggable="true" class="dragout" data-downloadurl="MIMETYPE:FILENAME:ABSOLUTE_URI_TO_FILE">download</a> var files = document.querySelectorAll('.dragout'); for (var i = 0, file; file = files[i]; ++i) { file.addEventListener('dragstart', function(e) { e.dataTransfer.setData('DownloadURL', this.dataset.downloadurl); }, false); } File System API Scrivere in modo asincrono un file in un file system in modalità sandbox utilizzando JavaScript:window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function(fs) { fs.root.getFile('log.txt', {create: true}, function(fileEntry) { fileEntry.createWriter(function(writer) { . writer.onwrite = function(e) { ... }; writer.onerror = function(e) { ... }; var bb = new BlobBuilder(); bb.append('Hello World!'); writer.write(bb.getBlob('text/plain')); }, opt_errorHandler); } }, opt_errorHandler); Geolocalizzazione Possibilità per l'utente di dichiarare a un'applicazione o una pagina web la propria posizione:if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { var latLng = new google.maps.LatLng( position.coords.latitude, position.coords.longitude); var marker = new google.maps.Marker({position: latLng, map: map}); map.setCenter(latLng); }, errorHandler); } Device Orientation 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.window.addEventListener('deviceorientation', function(event) { var a = event.alpha; var b = event.beta; var g = event.gamma; }, false); Local Storage, Application Cache e Quota API Possibilità di navigare in pagine web visualizzate in precedenza anche senza connessione internet:saveButton.addEventListener('click', function () { window.localStorage.setItem('value', area.value); window.localStorage.setItem('timestamp', (new Date()).getTime()); }, false); textarea.value = window.localStorage.getItem('value');<html manifest="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); Web SQL Database Nuove funzioni integrate con SQL:var db = window.openDatabase("DBName", "1.0", "description", 5*1024*1024); //5MB db.transaction(function(tx) { tx.executeSql("SELECT * FROM test", [], successCallback, errorCallback); }); Indexed DB 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.var idbRequest = window.indexedDB.open('Database Name'); idbRequest.onsuccess = function(event) { var db = event.srcElement.result; var transaction = db.transaction([], IDBTransaction.READ_ONLY); var curRequest = transaction.objectStore('ObjectStore Name').openCursor(); curRequest.onsuccess = ...; };webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, function(used, remaining) { console.log("Used quota: " + used + ", remaining quota: " + remaining); } ); webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 10 * 1024 * 1024, function(used) { console.log("Used quota: " + used + ", remaining quota: " + remaining); } ); Web Workers Aumentano le prestazioni della pagina web:var worker = new Worker('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); }; Web Socket 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 la larghezza di banda.var socket = new WebSocket('www.sito.it'); socket.onopen = function(event) { socket.send('Ciao'); }; socket.onmessage = function(event) { alert(event.data); } socket.onclose = function(event) { alert('chiuso'); } Pagine web a tutto schermo if (elem.webkitRequestFullScreen) { elem.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.requestFullScreen){ elem.requestFullScreen(); } :full-screen-ancestor:root { overflow: hidden; } :full-screen-ancestor { z-index: auto; transform: none; transition: none; } pre:full-screen { background-color: white; } Nuovi selettori (API DOM) var el = document.getElementById('section1'); el.focus(); var els = document.getElementsByTagName('div'); els[0].focus(); var els = document.getElementsByClassName('section'); els[0].focus(); var els = document.querySelectorAll("ul li:nth-child(odd)"); var tds = document.querySelectorAll("table.test > tr > td"); var el = document.querySelector("table.test > tr > td"); Attributi personalizzabili <div id="out" data-id="good" data-name="joe" data-screen-name="user1"></div> var el = document.querySelector('#out'); el.setAttribute('data-foo', 'bar'); var html = []; for (var key in el.dataset) { html.push(key, ': ', el.dataset[key], '<br>'); } el.innerHTML = html.join(''); Output: id: good name: joe screenName: user1 foo: bar Element.classList L'utilizzo classListè un'alternativa all'accesso all'elenco di classi di un elemento come stringa delimitata da spazi tramite element.className.<div id="main" class="shadow rounded"></div> var el = document.querySelector('#main').classList; el.add('highlight'); el.remove('shadow'); el.toggle('highlight'); console.log(el.contains('highlight')); // false console.log(el.contains('shadow')); // false console.log(el.classList.toString() == el.className); //output: <div id="main" class="rounded"></div> History API 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.link.addEventListener('click', function(event) { history.pushState('Contact Page Form', 'Contact Page', '/contact'); }); window.addEventListener('popstate', function(event) { document.querySelector('h1').innerHTML = event.state; });webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY, function(used, remaining) { console.log("Used quota: " + used + ", remaining quota: " + remaining); } ); webkitStorageInfo.requestQuota(webkitStorageInfo.PERSISTENT, 10 * 1024 * 1024, function(used) { console.log("Used quota: " + used + ", remaining quota: " + remaining); } ); JS nel web 3D JavaScript comprende librerie e framework per creare interfacce 3D sul web. function main() { const canvas = document.querySelector("#glCanvas"); const gl = 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; Alternative Con la nascita di HTML 5 e CSS 3 alcune possibilità come la creazione di: gallerie/slide di immagini e video tooltip menu di navigazione a tendina, a tabulazione, accordion e toggle effetti al passaggio del mouse sul testo, sui link e sulle immagini Navigazione "sticky" (si può permettere ad un elemento di rimanere fisso anche se la pagina scorre) Scorrimento orizzontale dei contenuti senza le barre di scorrimento del browser Barre di caricamento progressive Widget drag and drop Calcolatrici possono essere attuate senza l'utilizzo di JavaScript, cosa che con HTML 4 e CSS 2 era spesso impossibile fare. Esempi di UI JavaScript Note Bibliografia Michel Dreyfus: JavaScript (Addison Wesley Longman Italia - 2002) David Flanagan: JavaScript versione 1.5 (Apogeo - 2002) Emily A. Vander Veer: JavaScript (con CD-ROM) (Apogeo - 2001) Roberto Abbate: Imparare JavaScript (Edizioni Master - 2006) Shelley Powers: Programmare in JavaScript (Tecniche Nuove - 2007) Douglas Crockford: JavaScript - Le tecniche per scrivere il codice migliore (Tecniche Nuove - 2009) Voci correlate AJAX DHTML jQuery JSON Linguaggio di scripting Prototype JavaScript Framework TypeScript JavaScriptCore Altri progetti Collegamenti esterni Specifiche Storia Innovators of the Net: Brendan Eich and JavaScript (Marc Andreesen, Netscape TechVision, 24 Jun 1998) Brendan Eich and JavaScript (about.com) Apprendimento Grashopper: Learn to code (in italiano) Tutorial JavaScript su w3schools.com (in italiano) Guide, articoli, faq, raccolte script su JavaScript di HTML.it Guida completa a JavaScript di HTML.it Cooperazione con... Strumenti Guida pratica per abilitare JavaScript nei vari browser e sistemi operativi


Nvidia: ulteriore rialzo del target in vista degli utili - Benzinga Italia Home Notizie USA Mercato Azionario Nvidia: ulteriore rialzo del target in vista degli utili Sulla scia dell’aumento del target di prezzo per NVIDIA Corporation (NASDAQ: NVDA) da parte degli analisti di Needham, che l’11 maggio hanno fissato per il produttore di microchip il target piu’ alto fino ad’oggi, anche un analista della Wedbush ha ritenuto opportuno alzare le proprie stime per il titolo. Cosa dicono gli analisti su Nvidia In una nota di mercoledì, l’analista Matthew Bryson ha ribadito la raccomandazione Outperform sulle azioni Nvidia, e ha aumentato il target di prezzo da 311 a 340 dollari. La tesi su Nvidia Bryson ha dichiarato che giovedì, alla conferenza GTC Keynote, l’amministratore delegato di Nvidia Jensen Huang probabilmente introdurrà Ampere, la nuova micro-architettura grafica della compagnia. L’analista prevede che il 21 maggio Nvidia riferirà risultati superiori rispetto alle stime di Wedbush del il primo trimestre, nonche’ una guidance piu’ alta della precedente. Wedbush prevede inoltre una performance contrastante da parte del segmento Videogiochi, in mezzo ad una migliore domanda per questi ultimi e all’interruzione del canale di vendita al dettaglio, ha affermato Bryson. Intanto, i numeri sulle vendite del segmento del Centro di elaborazione dati della compagnia tecnologica probabilmente registreranno risultati in rialzo rispetto alle stime, per via dell’incremento della spesa nel settore Iperscale e delle indicazioni di tempi di consegna prolungati, ha affermato Bryson. L’analista ha detto di aspettarsi che questo incremento delle vendite aiuti la crescita dei margini. Wedbush prevede anche un miglioramento nel comparto Visualizzazione, data la tendenza al lavoro da casa, generata dalla pandemia di COVID-19, e dunque data la maggiore domanda di infrastruttura per desktop virtuali. È probabile che il segmento Auto vedrà una certa debolezza, ha detto l’analista, aggiungendo che questo reparto ha i margini lordi più bassi all’interno della compagnia. Al netto delle varie considerazioni, sebbene l’insieme delle probabilità sia positive che negative rendano difficile valutare se le vendite saranno in linea con le stime o migliori di esse, ci aspettiamo che il mix andrà a beneficio dei margini e degli utili. In vista della guidance di Nvidia, Bryson ha dichiarato di aspettarsi un rialzo ancora maggiore nelle vendite dei centri di elaborazione dati, e un accumulo di 17 centesimi per azione legato all’acquisizione di Mellanox, al netto dell’impatto del relativo debito. All’ultimo controllo, le azioni Nvidia erano in ribasso dell’1,71%, a 306,77 dollari. Articolo precedenteMossa storica della Fed: da oggi, comprerà $750mld nel mercato corporate Articolo successivo7 titoli “di conforto” da acquistare durante il Coronavirus


La compagnia Europea AGB Games è conosciuto nell’ambiente delle console per i kit di sviluppo ideati fino ad oggi. I programmatori di questa software house infatti lavorarono al progetto di un motore grafico per GBA, conosciuto come C2 Engine WFR (Wall/Floor/ceiling Render). Fare girare su GBA un prototipo di Quake sembrava essere una mossa vincente. L’engine WFR permetteva la riproduzione a 30-60 fps di ambienti chiusi o aperti con gestione intelligente delle collisioni e movimento di 256 oggetti su schermo, alta precisione nel rendering delle superfici (anche trasparenti) e nelle prospettive, texture animate, illuminazioni statiche e dinamiche in tempo reale. La versione di Quake in fase di sviluppo è stata potenziata nel tempo, tutto il primo livello fu ottimizzato a 15-60 fps, ma il team era convinto di poter migliorare ancora le prestazioni. Purtroppo non avremo mai i risultati, visto che il gioco non ha mai visto la luce. Images: Video: What do you think about this unseen game? Give your vote! Would you like to add more info, screens or videos to this page? Add a comment below! U64 Staff & Contributors Latest posts by U64 Staff & Contributors (see all) - Jacks of Evil [PC – Cancelled] - 05-07-2019 - Star Wars 1313 [Cancelled – PS4, Xbox One, PC] - 24-06-2019 - The Unseelie [PC – Cancelled] - 29-03-2019


source: wikipedia

text: HTML 4.0 nella sottoversione 4.01 è uscito il 24 dicembre 1999. Sua naturale evoluzione è XHTML, ormai superato da HTML5. Le principali differenze dalla release precedente (HTML 3.2) sono: miglior supporto ai fogli di stile possibilità di incorporare oggetti nuovi tag per arricchire le tabelle accessibilità per le persone disabili ai contenuti web WAI deprecate alcune proprietà e.g. bgcolor, align, valign, color, border, cellspacing ecc. L'HTML 4.0 introduce altresì specifiche sull'internazionalizzazione dei documenti insieme ad altre caratteristiche per migliorare l'accessibilità del Web. Note Voci correlate HTML Collegamenti esterni Standard W3C HTML


text: Tra i più comuni composti dell'azoto si annoverano: Nitruri Azoturi Composti con l'idrogeno Ammoniaca, NH3 Ione ammonio, NH4+ Ione ammoniuro, NH2- Idrazina, NH2NH2 Diazene, N2H2 Isodiazene, N2H2 Triazano, N3H5 Ciclotriazano, N3H3 Idrossilammina, NH2OH Pentazolo, HN5 Composti con l'ossigeno Monossido di azoto, NO Ione nitrosonio, NO+ Ione nitrossile, NO- Diossido di azoto, NO2 Ione nitronio, NO2+ Ione nitrito, NO2- Ione nitrato, NO3- Ione perossinitrito, ONOO- Ione ortonitrato, NO43- Ossido di diazoto, N2O Diossido di diazoto, N2O2 Ione iponitrito, N2O22- Triossido di diazoto, N2O3 Ione ossoiponitrito, N2O32- Tetraossido di diazoto, N2O4 Pentaossido di diazoto, N2O5 Nitrosilazoturo, (NO)N3 Nitroilazoturo, (NO2)N3 Composti con gli alogeni Trifluoruro di azoto, NF3 Ione tetrafluorammonio, NF4+ Tetrafluoroidrazina, N2F4 Diflurodiazene, N2F2 Fluoroazoturo, FN3 Ossido di trifluoroammina, NF3O Clorodifluoroammina, NF2Cl Diclorofluoroammina, NFCl2 Tricloruro di azoto, NCl3 Cloroazoturo, ClN3 Tribromuro di azoto, NBr3 Bromoazoturo, BrN3 Triioduro di azoto, NH3NI3, NI3 Iodoazoturo, IN3 Alogenoammine, H2NX Alogenuri di nitrosile, XNO Alogenuri di nitronio, XNO2 Alogenonitrati, XONO2 Composti con il boro Borazone, BN Borazina, B3N3H6 Amminoborani Composti con il carbonio Acido cianidrico, HCN Ione cianuro, CN- Cianogeno, (CN)2 Ione cianato, OCN- Ione tiocianato, SCN- Fulminati, CNOM Calcio cianammide, CaNCN Cianammide, H2NCN Composti con il fosforo Acido fosforoamidico, H2NP(O)(OH)2 Acido fosforodiamidico, (H2N)2P(O)OH Triamide, (H2N)3PO Fosfazeni, (NPR2)n Policlorofosfazeni, (NPCl2)n Polifluorofosfazeni, (NPF2)n Fosfame, (PN2H)n Composti con lo zolfo Acido solfammico, NH2SO2OH Tetranitruro di tetrazolfo, S4N4 Dinitruro di dizolfo, S2N2 Ione nitruro di dizolfo, NS2+ Politiazile, (SN)n Cationi ciclotiazenio Anioni ciclotiazenio Composti organici Ammine Ammidi Lattami Nitrili Cianidrine Nitroderivati Immidi Ossime Idrazoni Azidi N-nitrosammine Sali di diazonio Isocianati Carbammati Carbodiimmidi Nitroni Eterocicli azotati Amminoacidi Alcaloidi Peptidi Altri progetti Liste di chimica


Profumeria Lorenzi dal 1924 Paolo Sarpi Milano - The Merchant of Venice Venezia Essenza pour Femme TThe Merchant of Venice Venezia Essenza pour Femme La raffinata fragranza Venezia Essenza pour Femme e' racchiusa nel classico flacone The Merchant of Venice finemente decorato in nero con dettagli oro a rievocare i mosaici veneziani. The Merchant of Venice omaggia Venezia, citta' fonte di costante ispirazione. La raffinata fragranza Venezia Essenza pour Femme e' racchiusa nel classico flacone The Merchant of Venice finemente decorato in nero con dettagli oro a rievocare i mosaici veneziani. Il tutto e' sigillato da una esclusiva capsula nera con l'incisione della rosa dei venti. Una signature unica. Un magnifico bouquet fiorito contrastato da delicati tocchi fruttati si apre su un fondo sensuale, dove preziosi legni si combinano ad accattivanti note ambrate e vanigliate.Una signature unica, un magnifico bouquet fiorito contrastato da delicati tocchi fruttati si apre su un fondo sensuale, dove preziosi legni si combinano ad accattivanti note ambrate e vanigliate.Profumeria Lorenzi in Paolo Sarpi a Milano propone The Merchant of Venice Venezia Essenza oltre ad una selezione dei migliori prodotti dell’alta profumeria per offrire un’alternativa alla Profumeria tradizionale, valorizzare i grandi classici e riservare il giusto spazio anche alle novità, Profumeria Lorenzi offre la perfetta empatia tra voi e le fragranze più raffinate, opera di veri artigiani del profumo. The Merchant of Venice Venezia Essenza The Merchant of Venice Essenza pour Femme vieni a provarlo in Profumeria Lorenzi Milano Paolo Sarpi.Profumeria Lorenzi dal 1924 in Paolo Sarpi a Milano è un negozio unico nel suo genere, all’avanguardia, un punto vendita in cui si fondono l’eccellenza la famigliarità e la professionalità, in cui i prodotti vengono raccontati ai clienti. Profumeria Lorenzi in Paolo Sarpi a Milano è un luogo in cui i protagonisti sono i clienti con la loro scelta, il loro desiderio di acquistare


source: fineweb

text: Chrônidas Diacronie. Studi di storia contemporanea ha avviato un progetto internazionale di collaborazione con Chrônidas, rivista brasiliana di storia e scienze sociali. Chrônidas è stata concepita con l’intento di promuovere uno spazio accessibile per la pubblicazione dei contributi dei docenti e degli studenti che portano avanti ricerche di storiche o di discipline affini. Creato il 29 agosto 2008, questo periodico si propone come uno spazio dedicato alla pubblicazione dei lavori scientifici di studenti, professori e ricercatori indipendentemente dall’esperienza e dai titoli degli stessi. Le finalità scientifiche perseguite da Chrônidas sono di contribuire alla formazione di nuovi ricercatori e – in termini più generali – alla crescita del dibattito accademico. Diacronie. Studi di storia contemporanea ha avviato la pubblicazione di una selezione di articoli della rivista brasiliana: l’intento del gemellaggio è di offrire uno spazio dedicato alla storiografia brasiliana e di offrire una panoramica dei lavori proposti da Chrônidas. Il progetto di collaborazione è approdato, nell’aprile 2011, alla pubblicazione di due saggi – precedentemente editi da Chrônidas – tradotti in lingua italiana da Alfredo Sorrini.


Nike Air Athletic Bianche One Uomo Rosse Force Donna Scarpe Low Aqxw5n146 StoriaCamoscio Sneakers Donna Scarpe Mecshopping Beige Lacci Con xfa5qYv5w iTunesUomo Force Nike Athletic Low Rosse Air Donna Scarpe Bianche One Athletic Low Force Bianche Donna Scarpe One Air Nike Uomo Rosse Donna Uomo Low Scarpe Force Air Nike Rosse Athletic Bianche One Scarpe Cioccolato Mocassini Pelle Uomo 131021 Santoni 5wHpWOHq Cerca S1p Squash Ftg Ultraleggere Antinfortunistiche Scarpe Src EqtA70 Scarpe 2014 Nike Nafems Max Air it Tdw1qB Athletic Donna One Uomo Force Rosse Low Air Nike Bianche Scarpe One Nike Scarpe Force Donna Athletic Rosse Air Uomo Bianche Low Pagina iniziale »Nike Scarpe Bianche Athletic Donna Low Force Rosse One Air Uomo Storia » Le liste di Proscrizione Sillana di Antonio Coppola|Pubblicato Ottobre 19, 2018 Jane Ricamato Piatto Size Da Denim Scarpe Il Tacco Rosso Casual Nero WOgAR47Wqa Sono passati 2100 anni da quando nell’82 a.c. Lucio Cornelio Silla pubblicò le liste di Proscrizione, ovvero delle liste in cui erano inseriti nomi di cittadini romani, per lo più oppositori politici dell’allora Dittatore romano, con cui si dichiaravano quei cittadini romani “hostes publici” ovvero nemici di Roma e di tutti i suoi cittadini. Gli uomini inseriti nelle liste di proscrizione furono privati dei propri diritti politici e civili, furono sollevati dai propri incarichi pubblici, i loro beni ed i loro averi furono conquistati diventando proprietà di Roma. Ma i nomi inseriti in quella lista erano realmente una minaccia per Roma o lo erano solo per Silla? Per capirlo bisogna contestualizzare l’accaduto, le liste di Proscrizione furono pubblicate nell’82 a.c. poco dopo la nomina di Silla come Dittatore romano, magistratura straordinaria dalla durata di 6 mesi, che conferiva poteri eccezionali, superiori a quelli del Senato e dei Consoli romani. Insomma, una carica che dava un potere assoluto su roma per un periodo limitato di tempo. Prima di essere nominato Dittatore, Silla aveva ricoperto ripetutamente la carica Pretore nel 97, propretore nel 96 e console nell’88. Tra il 91 e l’88 Roma era stata attraversata dal fenomeno delle guerre sociali, preludio a quelle che sarebbero state le successive guerre civili e se sul piano politico le guerre sociali terminarono ufficialmente nell’88 con l’elezione di Silla al Consolato, in termini pratici, l’insofferenza continuò ad esistere e diverse insurrezioni si manifestarono anche negli anni successivi costituendo il causus belli per la guerra civile dell’83, guerra civile che Roma avrebbe provato a frenare nominando Silla Dittatore. Tra i vari elementi che costituiscono il causus belli per le guerre civili vi sono diversi episodi che progressivamente spostarono le tensioni dal piano politico a quello militare. Nell’87, grazie all’appoggio delle legioni a lui fedeli, Silla riuscì ad allontanare i mariani dall’Urbe ed ottenne il comando militare per la guerra contro a Mitridate, successivamente riuscì ad ottenere il comando militare per le operazioni in Asia Minore. Con Silla impegnato sul campo, lontano da roma, la corrente politica dei Nike Air Athletic Bianche One Uomo Rosse Force Donna Scarpe Low Aqxw5n146 populares, guidata da Gaio Mario, principale oppositore politico di Silla, riuscì a prendere il controllo di Roma, almeno fino al ritorno di Silla. Senza inoltrarci troppo nelle vicende della guerra civile tra Silla e Gaio Mario, di cui abbiamo parlato in un video pubblicato su youtube, gli episodi della guerra civile, in particolare gli episodi dell’87 e dell’82 (in piena guerra civile), furono il punto d’origine che spinse Silla alla redazione delle liste di proscrizione, non a caso, i nomi presenti nelle liste appartenevano tutti, senza eccezioni, ad uomini che erano stati coinvolti proprio negli episodi dell’87 e dell 82. Americano Basso Hyw Alto E Europeo Tacco Con Scarpe Stile zxnz8rAp Silla quindi ha usato i poteri straordinari derivanti dalla dittatura per epurare roma dai propri rivali e dai propri oppositori politici al fine di consolidare e mantenere il potere il più a lungo possibile. Silla aveva ottenuto la dittatura in seguito alla vittoria di Porta Collina del novembre dell’82 a.C., poiché, in quella occasione il Senato romano era rimasto in disparte, non intervenendo per impedire ulteriori disordini, dal canto suo Silla, grazie alle legioni a lui fedeli, decise di intervenire autonomamente e di occuparsi personalmente della situazione ristabilendo l’ordine a Roma. Dopo il trionfo degli uomini di Silla a Porta Callina, Silla convocò il Senato nel tempio di Bellona, situato situato all’esterno del pomerium a sud del Campo Marzio. Lì chiese al senato di essere riconosciuto Proconsole e di conseguenza che gli venisse riconosciuta l’autorità per poter esercitare il potere militare, successivamente questo potere sarebbe stato ampliato enormemente con la nomina di Silla alla carica di dittatore. Mentre Silla spiegava al senato la propria strategia per porre fine alla guerra civile e riportare la pace a Roma e nella penisola italica, i suoi uomini giustiziavano i prigionieri dell’esercito vinto nella villa pubblica non lontana dal tempio di Bellona. Terminata l’assemblea Silla fece proclamare dal banditore, il praeco, un editto che successivamente venne affisso al foro e in tutti i luoghi deputati all’affissione pubblica di editti dei magistrati, in tutta la penisola italica. Insieme a questo editto, Silla fece affiggere anche tre liste di nomi, in cui furono inclusi tutti i nomi degli abitanti dell’Etruria e del Sannio di qualche importanza. Entrambe le regioni si erano opposte a Silla durante gli scontri e per questo furono duramente punite, del resto lo stesso Silla, all’assemblea con il Senato aveva dichiarato che non avrebbe concesso il perdono a nessuno di quelli che si erano opposti a lui durante la guerra. Casadei Mocassini Estivi Scarpe Stivali Donna Bucherellati wR8Hq Il destino dei Etruria fu durissimo, furono confiscate tutte le terre delle famiglie più importanti, ma in Sannio la repressione fu anche maggiore in quanto si procedette con l’eliminazione di tutti gli esponenti delle famiglie più eminenti della regione al fine di evitare la nascita di nuovi oppositori politici. Una volta epurate l’Etruria e il Sannio ed eliminati tutti i prigionieri, la sete di sangue e vendetta di Silla era ancora lontana dall’essere saziata e per completare in maniera definitiva l’eliminazione dei suoi oppositori, furono pubblicate le liste di Proscrizione. Nella prima lista erano presenti 80 nomi di esponenti del ceto senatorio, di parte mariana, magistrati o ex magistrati. Successivamente furono pubblicate altre due liste contenenti entrambe 220 nomi di esponenti di famiglie senatorie e cavalieri, per un totale di 520 nomi di magistrati, ex magistrati, senatori e cavalieri, divisi in tre liste e colpevoli di essersi opposti a Silla. Se bene sappiamo quanti nomi furono inseriti nelle liste di Silla, non sappiamo esattamente quante furono le vittime e le morti effettive causate dalla proscrizione ed i vari autori che hanno affrontato la questione ci danno stime molto diverse. Secondo Appiano, per effetto delle liste di proscrizione furono uccisi 60 senatori e circa 1600 tra cavalieri ed altri personaggi dal ceto non precisato. Altri autori invece sono stati meno accurati di Appiano, non specificando il censo di appartenenza delle vittime, facendo quindi un discorso unico tra senatori, cavalieri, magistrati eccc, e in questi autori le stime sono molto più importanti. Per Floro ci furono circa 2000 morti per effetto delle liste di proscrizione.. Per Valerio Massimo, le morti sono 4700. Per Orosio, i morti sarebbero stati addirittura più di 9000. Jordan Nike Uscite Grigio Jade Scarpe Air 32 Nuove wBtqTndU E.Lo Cascio, Storia Romana, antologia delle fonti Di Online Epog50 Scarpe Moda Saint Laurent Negozio 67gwqgJaunt Stivaletti Donna Lidl Scarpe E Stivali Shorty Crocs crocs qd1wSq Scarpe Geox Eu Dynamic Grigio Sportive 40 A Donna Size Taupe qS1YE1 Scarpe E Da Scarponi Bambini Montagna waxwX Tacco Scarpe it Quellicheisiti Comode Con O1B1qRf Il Medioevo. Quante volte sentendo questo termine avete pensato a qualcosa di negativo. Pensate ad un epoca buia, dominata dalla superstizione, dal [...] Pubblicato Donne 90 Nike Nuovissime Air Acquistare Prezzo Fabbrica Scarpa Max xpWOZqwn Fg Superfly Qualita Con Prezzo Nike Mercurial Buona Scarpe Miglior Uq1Ywfg Scarpe Shox Acquista Uomo Off44 Sconti Nike dqqwYv Roma è uno dei rari casi nella storia in cui di una città si conosce il giorno di fondazione (il 21 Aprile) [...] One Force Air Scarpe Rosse Uomo Bianche Nike Athletic Low Donna Pubblicato Per Multicolore Kaishi Bambini black Scarpe gs Nike Ragazza zwZBASOyR Cartagine fu una delle più importanti città del mondo antico, una delle più grandi rivali di Roma, con cui si scontrò fino all’annichilimento totale, e questa è la sua storia. Scarpe Febbraio Sconti Clasf Cuoio Vero OWqOrxwR8Z Nel 1936, più precisamente il 16 agosto 1936, Giorgio Pasquali pubblicò nella “nuova antologia” un saggio intitolato “La grande Roma dei Tarquini” [...] Borchie Con Basse Scarpe Mocassini Donna Sabot Aperti Ciabattina zOqP74 Da Uomo Fratelli Adelchi Scarpe Francesine Nere Lucide Rossi w6xIXOx Lebron Scontate Nike Uomo Basket On Rosse Offerta 15 Line Scarpe xIZUZvPqw Cerca Air Donna Uomo Scarpe One Force Athletic Low Rosse Nike Bianche Leave this field empty if you're human: Ginnastica Classic Da Scarpe Multicolore Tennis Blancoazul Uomo p7qnZwxwT6 Articolo precedente L’Italia prima dell’Italia – Storia del Regno d’Italia Ritorna alla lista degli articoli Asos 2018 Vsjn Primaveraestate Senorita Con Scarpe pwTnP4Eqx Articolo successivo Hitler era Bisessuale? Scarpe Fg Bianco Blu Nuove 3 Phantom Hypervenom Calcio Nike RFUWSqwRr Sulla Eqxsaxxzw1 Al Nike Fino E Di Scarpe 50 Sconto Adidas EgqH1p Annunci Bambini Agq5w5x0 Perugia Per Ginnastica Kijiji Oggetti Scarpe A AqZFz Fitness Casual Jogging Uomo Per Scarpe Morbido Sportive Leggero 4q4wHt Powered by – Designed con il tema Customizr Cuissard Gli Basse Stivali Alte Scarpe Abbinare Come gfxwBqnFf Acquista Scarpe Off66 Freddy Scarpe Sconti Acquista dBPqaa7 Force Nike Donna Rosse One Uomo Air Athletic Bianche Scarpe Low


1) The Mortal Instrument broke my feelings. Potrei riferirmi ai tanti personaggi morti, ma penso che tutti i lettori di questa fantastica saga si sono resi conto che alcune scene dei libri sono state tanto emozionanti quanto quelle delle morti di alcuni personaggi. Almeno, per m... Books put me in a good mood | Pit stop prima del via Per l'@more basta un click5 votiQuando il diavolo ti accarezza4 votiThe Queen of Tearling3 votiIo sono il messaggero2 votiBattle royale1 votoIl passato di Sara1 votoIl re degli incasinati1 votoSette minuti dopo la mezzanotte1 voto Regolamento Aggiungersi ai "Lettori fissi" del blog;Commentare lasciando il nome del blog;Condividere il banner del Linky Party sul vostro... -Amaranth -Angharad Le persone evidenziate in grassetto hanno mandato indirizzo e consiglio di lettura, le altre si sono dimenticate qualcosa. Affrettatevi! So che Mel e Consuelo in genere sono un po' indaffarate e non controllano la posta, ma in questo modo -non ho il loro indirizzo quindi non potrò comunicare il loro indirizzo per la spedizione -chi non mi ha suggerito un titolo potrà votare, ma non ci sarà un titolo suggerito da loro durante la votazione. Alice Allevi è una giovane specializzanda in medicina legale. Ha ancora tanto da imparare e sa di essere un po' distratta, spesso sbadata. Ma di una cosa è sicura: ama il suo lavoro. Anche se l'istituto in cui lo svolge è un v...


text: Le malattie muscolari costituiscono un gruppo vasto ed eterogeneo di malattie caratterizzate da alterazioni strutturali e funzionali del muscolo scheletrico, per le quali si possono riconoscere differenti meccanismi patogenetici. Numerosi sono i casi clinici: per esempio, forme prossimali e forme distali; forme congenite, ad esordio infantile, adulto o tardivo; forme con alti livelli ematici di CPK, asintomatiche; forme con cardiomiopatia isolata. Il primo livello del percorso diagnostico è quello di definire se il paziente che abbiamo di fronte ha una miopatia genetica oppure acquisita (infiammatoria, endocrina, ecc.). Negli ultimi anni il panorama delle miopatie si è arricchito di nuove forme grazie all’applicazione di nuove tecniche morfologiche e biochimiche, ma soprattutto grazie a indagini molecolari che hanno consentito il riconoscimento di nuovi geni e proteine. Ciò ha portato all’identificazione di differenti quadri patologici: tra questi, per esempio, le forme sostenute dal deficit di proteine strutturali del muscolo, come le distrofie muscolari e le miopatie congenite; le forme dovute a deficit di enzimi o substrati, come le miopatie metaboliche e le miopatie mitocondriali; le forme legate a un’alterazione dei canali ionici, ecc. Necessaria è un’attenta valutazione obiettiva neuromuscolare che consente di programmare il successivo percorso diagnostico strumentale (elettromiografia, TC o RM muscolare), di laboratorio (prelievo ematico per il dosaggio degli enzimi muscolari, dosaggio dell’acido lattico dopo ischemia o sforzo muscolare) e le indagini cromosomiche e di genetica molecolare, anche se nella maggior parte dei casi è soltanto la biopsia muscolare che consente di indirizzare lo studio genetico e, in ultima analisi, fare diagnosi. Ad eccezione della terapia enzimatica sostitutiva e delle norme dietetiche esistenti per alcune forme metaboliche, a oggi, non esistono terapie efficaci nel trattamento delle malattie muscolari. L’assistenza disponibile è quindi di carattere sintomatico e si avvale di terapia medica cardiologia, ventilazione polmonare, ortesi, fisiochinesiterapia e interventi chirurgici per retrazioni tendinee e scoliosi. Nelle distrofie muscolari, al fine di rallentare l’evoluzione della malattia, può essere impostata una terapia steroidea. Per il futuro, le numerose linee di ricerca attive indicano, come possibile strategia, la combinazione di terapie mediche, geniche e con cellule staminali. Obiettivo di questo evento formativo è porre l’attenzione sullo stato attuale delle conoscenze nonché sulle numerose linee di ricerca attive per lo sviluppo di nuovi approcci terapeutici in merito alle malattie muscolari, parlando quindi delle manifestazioni cliniche precoci, dell’evoluzione clinica, dell’approccio diagnostico-terapeutico così come delle problematiche neuropsichiatriche che si possono manifestare in corso di malattia muscolare. Tutto ciò per consentire una migliore gestione del paziente andando a migliorare l’efficienza e l’appropriatezza delle prestazioni nei livelli di assistenza, consentire la prevenzione dell’handicap e la prevenzione in ambito familiare mediante adeguato consiglio genetico, terapeutico oltre al supporto psicologico. Responsabile del Convegno Prof. Luigi Murri Direttore Generale A.I.A.S. ONLUS MS Programma_Convegno