際際滷

際際滷Share a Scribd company logo
JavascritpCamp 2009 Simone (Demo) Gentili Javascript Camp  25 Settembre 2009 Listener per eventi
DOM Events DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
DOM Events / (1/2) I  DOM events  permettono a linguaggi di programmazione come  Javascript , JScript, EcmaScript, Java, VBScript di registrare degli  event handler/listener  in dei  nodi  di elementi  all'interno do un  albero  DOM . Un  albero DOM  lo possiamo ritrovare all'interno di documenti, per esempio,  html ,  xhtml , xul, svg.
DOM Events / (2/2) L'esecuzione di codice Javascript in risposta ad  un  evento  rimane una delle funzionalit che sono oggetto di  implementazioni differenti  tra i vari  browser . Per combattere contro queste diversit, il W3C ha provato a standardizzare il modello ad eventi nel  DOM Level 2 .
DOM Level 2 DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
DOM Level 2 / intro / (1/6) E' interessante notare che anche  Microsoft ha partecipato allo sviluppo delle specifiche  del DOM Level2; Al rilascio di Internet Explorer 5.5,  Microsoft ha deciso di non supportare le specifiche  all'interno del suo Browser. Lo stesso vale per le release successive ovvero la 6.0 e la 7.0  8.0;
DOM Level 2 / modello DOM / (2/6) Quando viene caricato, un documento HTML viene trasformato in una struttura di oggetti javascript chiamata  modello DOM ; $(document).ready(); // we love jquery =) Ogni elemento , compresi gli attributi,  diviene un oggetto . Javascript pu嘆 accedere a questi oggetti  per modificarne la struttura.
DOM Level 2 / i nodi / (3/6) Ciascun elemento viene rappresentato tramite un  nodo (tag ...)  e ci sono diversi tipi di nodi in base ad alcune semplici caratteristiche; Il nodo di un elemento si distingue in base al  nome  (che chiamiamo normalmente tag); I nomi non devono essere per forza univoci; ES: Due paragrafi (<p>...</p>) saranno identici fino a che non verranno caratterizzati dall' attributo id .
DOM Level 2 / i nodi / (4/6) document  竪 un nodo sempre presente a prescindere da che cosa contiene il documento stesso. Prende anche il nome di   nodo del documento  ; I  nodi degli elementi  sono differenti dal nodo del documento e rappresentano gli effettivi elementi, tag, presenti nella pagina; Il contenuto di un documento si trova nei  nodi testuali  oppure nei  nodi degli attributi .
DOM Level 2  testi  (5/6) Tutto quello che non 竪 compreso tra  parentesi angolari , viene considerato  nodo testuale ; I nodi testuali nodo  non possono avere figli ; Se si indenta il codice di un documento HTML per renderlo pi湛 leggibile all'occhio umano, tra un nodo testuale e l'altro verranno inseriti anche i tab per separare i tag o i testi.  I nodi di spaziatura sono gestiti in maniera differente dai vari browser  e bisogna fare attenzione quando si conta sul numero o sull'ordine dei nodi presenti nel DOM;
DOM Level 2  attributi  (6/6) I nodi degli attributi   sono sempre associati ad un elemento , 竪 ovvio che non possiamo avere un attributo senza che vi sia un  nodo  (tag ...); non fanno parte del DOM  ed 竪 per questo motivo che  bisogna fare uso di funzioni differenti per operare su di essi, sia in lettura che in scrittura ;
Gestori di Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
Gestori di Eventi - (1/7) Il modo pi湛 semplice per gestire gli eventi con del codice javascript, 竪 quello di usare gli  event handler  ( precedenti al DOM ); Un gestore di eventi, 竪 una  funzione javascript contenuta in un nodo  del DOM che viene richiamata automaticamente quando si verifica un determianto evento su quel nodo; Se non attendiamo che il DOM sia stato caricato, non possiamo operare sui suoi nodi. Ecco la soluzione: $(document).ready(function(){  });
Gestori di Eventi - (2/7) Quando siamo di fronte ad un codice HTML come mostrato di seguito e facciamo click sul link: <a href= http://www.unodeitanti.com >unodeitanti.com</a> Come impostazione predefinita,  il browser risponde all' evento click  richiamando l'indirizzo specificato nell'attributo href , ma prima che ci嘆 avvenga,  竪 possibile predisporre un  gestore di eventi  che risponda a questo in particolare.
Gestori di Eventi - (3/7) Usare i  gestori di eventi  竪 una soluzione pratica e veloce quando si deve programmare. In oltre  danno la sicurezza di poter funzionare su  tutti i browser ; 竪 possibile assegnare  un solo evento ad un singolo gestore di event i su un determinato elemento HTML ; Significa che non si pu嘆 associare ad un evento una serie di attivit da svolgere ( non in modo elegante );
Gestori di Eventi - (4/7) var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { alert(&quot;ciao&quot;); } link.onclick = function () { alert(&quot;Io sono  ...&quot;); }
Gestori di Eventi - (5/7) Quando usiamo il  gestore di eventi  per assegnare la seconda alert, in realt si sovrascrivono quella precedenti; Domanda:  quante volte pu嘆 capitare che ci siano pi湛 script da richiamare al click di un determinato link? Risposta: forse mai =). Per嘆  ci sono molti  eventi che possono richiedere l'intervento di pi湛 script.  Un caso tra i tanti, il submit di un form che dovra controllare tutti i campi;
Gestori di Eventi - (6/7) Soluzione generale  var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { alert(&quot;Ciao&quot;); alert(&quot;Io sono  ...&quot;); } Oppure  function script1 () { alert(&quot;Uno&quot;); } function script2 () { alert(&quot;Due&quot;); } var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { script1(); script2(); }
Gestori di Eventi - (7/7) Dentro le funzioni script1 e script2  l'attributo this non far pi湛 riferimento all'elemento  che ha generato l'evento; Se uno dei due eventi restituisce false,  non viene bloccata l'azione predefinita  dell'elemento;
Listener per Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
Listener per Eventi - (1/5) Sono  come i gestori di eventi , tranne per il fatto che ad essi  si possono assegnre pi湛 listenere ad un solo nodo ; Ci consentono l'uso della parola chiave  this ; Sono una specifica del  W3C ; Ma ... Internet Explorer  offre una propria versione completamente differente; (@#&%!$) Anche  Safari  usa i listener ma con un meccanismo leggermente diverso;
Listener per Eventi - (2/5) Come i gestori di eventi, i listener sono  una funzione javascript che viene connessa ad un nodo del DOM ; Se volessimo fare paragoni, i  gestori di eventi sono una  porta USB  mentre  i listener sono come un  hub ;
Listener per Eventi - (3/5) elemento . addEventListener ( evento ,  listenerPerEventi , false); addEventListener  accetta tre argomenti: evento   l'evento pu嘆 essere ad esempio  click  oppure  mouseover ,  senza on davanti ; listener   ovvero  la funzione  listener stessa; tipo di listener   indica se si tratta di un  listener per la cattura di eventi  o meno;
Listener per Eventi - (4/5) Per  Internet Explorer  le cose sono leggermente differenti: elemento . attachEvent (on evento ,  listenerPerEventi ); AttachEvent  anzich辿  addEventListener ; Onevento  anzich辿 semplicemente  evento ; Non c'竪 nessun terzo argomento;
Listener per Eventi - (5/5) Come distinguere le due implementazioni If ( typeof  elemento .addEventListener != undefined ) { elemento .addEventListener( evento ,  listenerPerEventi , false); } else { elemento .attachEvent(on evento ,  listenerPerEventi ); } * vedi codice di esempio ...
Azioni Predefinite DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
Azioni predefinite - (1/3) <a href=... onclick=javascript:return false;>...</a> Per  bloccare  l' azione predefinita  di un gestore di eventi ed impedirte che il browser la svolga, 竪 sufficente  restiture false  al gestore dell'evento. Nel  modello per listener , al listenerPerEvento viene passato anche  l'oggetto dell'elemento  le cui propriet contengono informazioni riguardanti l'evento generato ed i metodi che consentono di  controllare il modo in cui l'evento viene elaborato dal browser .
Azioni predefinite - (2/3) Per bloccare l'evento di default basta richiamare l'evento  preventDefault();  sull'elemento: clickListener: function (event) { if ( confirm (Sei sicuro di voler aprire il link?) ) { event.preventDefault(); } } Basta che un listener richiami questo metodo  per  evitare che venga eseguita l'operazione di default . * vedi codice di esempio ...
Azioni predefinite - (3/3) In  Internet Explorer  l' oggetto evento non viene passato come argomento al listener, ma viene reso disponibile come  variabile globale chiamata event ; clickListener: function (event) { if ( confirm (Sei sicuro di voler aprire il link?) ) { event.returnValue = false; } } La variabile globale ha una propriet  returnValue  che si pu嘆 impostare a false;
Propagazione di Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
Propagazione di Eventi  (1/5) Gli eventi, attraversano l'intera struttura del  DOM  ed il meccanismo si chiama  propagazione dell'evento . Se viene associato un listener ad un link contenuto in un paragrafo, l'evento onclick viene esteso anche al contenitore del link e  verr attivato anche sul paragrafo . <p> <a href= http://www.example.com >example.com</a> </p>
Propagazione di Eventi  (2/5) Nella  fase di cattura , l'evento percorre tutto il DOM da document fino all'elemento che ha generato l'evento. Ogni volta che viene incontrato un elemento, viene controllato se ad esso 竪 associato un  listener per la cattura di eventi relativi  (ecco a che serve il terzo parametro): elemento .addEventListener( evento ,  listenerPerEventi ,  false );
Propagazione di Eventi  (3/5) Il metodo  attachEvent  di  Internet Explorer  non prevede il terzo parametro, proprio perch竪 il modello ad eventi 竪 differente e non prevede i  listener per la cattura di eventi ; Molti sviluppatori evitano quindi di sfruttare i  listener per la cattura di eventi ;
Propagazione di Eventi  (4/5) Nella  fase di target  il browser ha raggiunto il nodo DOM dell'elemento cui 竪 stato associato il listener; Al click su un link il target sar il link stesso mentre ma nel caso di Safari, il target sar il nodo testuale; Nella  fase di risalita , viene ripercorso tutto il DOM fino a document e vengono eseguiti tutti i listener che non sono  listener per la cattura di eventi , ad eccezione degli eventi focus() e blur();
Propagazione di Eventi  (5/5) Per interrompere la propagazione di un evento 竪 sufficente richiamare il metodo  stopPropagation ; Nel caso di  Internet Explorer  dovremo impostare la propriet  cancelBubble  a true;
I problemi di memoria in IE (1/1) In  internet Explorer , la memoria occupata per un listenere non viene rilasciata nemmeno al cambio della pagina; I rallentamenti del browser potrebbero costringere l'utente a riavviarlo; La soluzione consiste nel configurare un listener per l'evento unload dell'oggetto window, ed in questo listener si possono eliminare tutti i listener per eventi definiti per il documento evitando lo spreco di memoria;
Riepilogo  (1/2) Internet Explorer utilizza  attachEvent  /  detachEvent  al posto di  addEventListener  /  removeEventListener ; Internet Explorer chiama gli eventi con il  prefisso   on  invece di chiamarli semplicemente  evento ; Internet Explorer usa  event come variabile globale  invece di passarla come  parametro al listener ;
Riepilogo  (2/2) Per bloccare un evento InternetExplorer richiede di impostare la propriet  cancelBubble  mentre invece di richiamare il metodo  stopPropagation (); Internet Explorer richiama i listener come  funzioni indipendenti  e  ci costringe, se vogliamo riciclare il codice, ad ottenere un riferimento all'elemento target invece di usare  this ; Internet Explorer non si preoccupa di  ripulire la memoria  automaticamente ;
I framework javascript Prototype: Event.observe(elemento, evento, listenerPerEventi); Event.stopObserving(elemento, evento, listenerPerEventi); jQuery: $(selettore).bind(evento, listenerPerEventi); $(selettore).unbind(evento, listenerPerEventi); Oppure ( sempre con jquery ... ) $(selettore).click(listenerPerClick);
This is the end: faq?

More Related Content

Similar to Javascript Camp - Listener Per Eventi (20)

Js intro
Js introJs intro
Js intro
Daniele Cruciani
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
Matteo Magni
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
Alberto Buschettu
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
Matteo Magni
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
Dominopoint - Italian Lotus User Group
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
Matteo Magni
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuery
Sandro Marcon
JavaScript
JavaScriptJavaScript
JavaScript
Manuel Scapolan
Introduzione a java script
Introduzione a java scriptIntroduzione a java script
Introduzione a java script
Matteo Ceserani
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulug
Ivan Gualandri
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
Giampiero Granatella
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicino
davide ficano
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
XeDotNet
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
Matteo Magni
Wcmil2018
Wcmil2018Wcmil2018
Wcmil2018
ErikaGili
Presentazione wicket
Presentazione wicketPresentazione wicket
Presentazione wicket
Andrea Del Bene
Java Advanced
Java AdvancedJava Advanced
Java Advanced
Antonio Furone
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
Dominopoint - Italian Lotus User Group
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
Valerio Radice
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
Matteo Magni
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
Alberto Buschettu
Javascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesignerJavascript - 4 | WebMaster & WebDesigner
Javascript - 4 | WebMaster & WebDesigner
Matteo Magni
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
Matteo Magni
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuery
Sandro Marcon
Introduzione a java script
Introduzione a java scriptIntroduzione a java script
Introduzione a java script
Matteo Ceserani
Introduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulugIntroduzione alla programmazione Android - Android@tulug
Introduzione alla programmazione Android - Android@tulug
Ivan Gualandri
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicino
davide ficano
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
XeDotNet
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
Matteo Magni
Wcmil2018
Wcmil2018Wcmil2018
Wcmil2018
ErikaGili
Introduzione ad angular 7/8
Introduzione ad angular 7/8Introduzione ad angular 7/8
Introduzione ad angular 7/8
Valerio Radice

More from Simone Gentili (8)

test driven development with phpunit
test driven development with phpunittest driven development with phpunit
test driven development with phpunit
Simone Gentili
Back end User Group / Golang Intro
Back end User Group / Golang IntroBack end User Group / Golang Intro
Back end User Group / Golang Intro
Simone Gentili
Laravel Day / Deploy
Laravel Day / DeployLaravel Day / Deploy
Laravel Day / Deploy
Simone Gentili
DevRomagna / Golang Intro
DevRomagna / Golang IntroDevRomagna / Golang Intro
DevRomagna / Golang Intro
Simone Gentili
Pubmi gitflow
Pubmi gitflowPubmi gitflow
Pubmi gitflow
Simone Gentili
#pugMi - DDD - Value objects
#pugMi - DDD - Value objects#pugMi - DDD - Value objects
#pugMi - DDD - Value objects
Simone Gentili
Yii workshop
Yii workshopYii workshop
Yii workshop
Simone Gentili
Jquery Plugin
Jquery PluginJquery Plugin
Jquery Plugin
Simone Gentili
test driven development with phpunit
test driven development with phpunittest driven development with phpunit
test driven development with phpunit
Simone Gentili
Back end User Group / Golang Intro
Back end User Group / Golang IntroBack end User Group / Golang Intro
Back end User Group / Golang Intro
Simone Gentili
Laravel Day / Deploy
Laravel Day / DeployLaravel Day / Deploy
Laravel Day / Deploy
Simone Gentili
DevRomagna / Golang Intro
DevRomagna / Golang IntroDevRomagna / Golang Intro
DevRomagna / Golang Intro
Simone Gentili
#pugMi - DDD - Value objects
#pugMi - DDD - Value objects#pugMi - DDD - Value objects
#pugMi - DDD - Value objects
Simone Gentili

Javascript Camp - Listener Per Eventi

  • 1. JavascritpCamp 2009 Simone (Demo) Gentili Javascript Camp 25 Settembre 2009 Listener per eventi
  • 2. DOM Events DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 3. DOM Events / (1/2) I DOM events permettono a linguaggi di programmazione come Javascript , JScript, EcmaScript, Java, VBScript di registrare degli event handler/listener in dei nodi di elementi all'interno do un albero DOM . Un albero DOM lo possiamo ritrovare all'interno di documenti, per esempio, html , xhtml , xul, svg.
  • 4. DOM Events / (2/2) L'esecuzione di codice Javascript in risposta ad un evento rimane una delle funzionalit che sono oggetto di implementazioni differenti tra i vari browser . Per combattere contro queste diversit, il W3C ha provato a standardizzare il modello ad eventi nel DOM Level 2 .
  • 5. DOM Level 2 DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 6. DOM Level 2 / intro / (1/6) E' interessante notare che anche Microsoft ha partecipato allo sviluppo delle specifiche del DOM Level2; Al rilascio di Internet Explorer 5.5, Microsoft ha deciso di non supportare le specifiche all'interno del suo Browser. Lo stesso vale per le release successive ovvero la 6.0 e la 7.0 8.0;
  • 7. DOM Level 2 / modello DOM / (2/6) Quando viene caricato, un documento HTML viene trasformato in una struttura di oggetti javascript chiamata modello DOM ; $(document).ready(); // we love jquery =) Ogni elemento , compresi gli attributi, diviene un oggetto . Javascript pu嘆 accedere a questi oggetti per modificarne la struttura.
  • 8. DOM Level 2 / i nodi / (3/6) Ciascun elemento viene rappresentato tramite un nodo (tag ...) e ci sono diversi tipi di nodi in base ad alcune semplici caratteristiche; Il nodo di un elemento si distingue in base al nome (che chiamiamo normalmente tag); I nomi non devono essere per forza univoci; ES: Due paragrafi (<p>...</p>) saranno identici fino a che non verranno caratterizzati dall' attributo id .
  • 9. DOM Level 2 / i nodi / (4/6) document 竪 un nodo sempre presente a prescindere da che cosa contiene il documento stesso. Prende anche il nome di nodo del documento ; I nodi degli elementi sono differenti dal nodo del documento e rappresentano gli effettivi elementi, tag, presenti nella pagina; Il contenuto di un documento si trova nei nodi testuali oppure nei nodi degli attributi .
  • 10. DOM Level 2 testi (5/6) Tutto quello che non 竪 compreso tra parentesi angolari , viene considerato nodo testuale ; I nodi testuali nodo non possono avere figli ; Se si indenta il codice di un documento HTML per renderlo pi湛 leggibile all'occhio umano, tra un nodo testuale e l'altro verranno inseriti anche i tab per separare i tag o i testi. I nodi di spaziatura sono gestiti in maniera differente dai vari browser e bisogna fare attenzione quando si conta sul numero o sull'ordine dei nodi presenti nel DOM;
  • 11. DOM Level 2 attributi (6/6) I nodi degli attributi sono sempre associati ad un elemento , 竪 ovvio che non possiamo avere un attributo senza che vi sia un nodo (tag ...); non fanno parte del DOM ed 竪 per questo motivo che bisogna fare uso di funzioni differenti per operare su di essi, sia in lettura che in scrittura ;
  • 12. Gestori di Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 13. Gestori di Eventi - (1/7) Il modo pi湛 semplice per gestire gli eventi con del codice javascript, 竪 quello di usare gli event handler ( precedenti al DOM ); Un gestore di eventi, 竪 una funzione javascript contenuta in un nodo del DOM che viene richiamata automaticamente quando si verifica un determianto evento su quel nodo; Se non attendiamo che il DOM sia stato caricato, non possiamo operare sui suoi nodi. Ecco la soluzione: $(document).ready(function(){ });
  • 14. Gestori di Eventi - (2/7) Quando siamo di fronte ad un codice HTML come mostrato di seguito e facciamo click sul link: <a href= http://www.unodeitanti.com >unodeitanti.com</a> Come impostazione predefinita, il browser risponde all' evento click richiamando l'indirizzo specificato nell'attributo href , ma prima che ci嘆 avvenga, 竪 possibile predisporre un gestore di eventi che risponda a questo in particolare.
  • 15. Gestori di Eventi - (3/7) Usare i gestori di eventi 竪 una soluzione pratica e veloce quando si deve programmare. In oltre danno la sicurezza di poter funzionare su tutti i browser ; 竪 possibile assegnare un solo evento ad un singolo gestore di event i su un determinato elemento HTML ; Significa che non si pu嘆 associare ad un evento una serie di attivit da svolgere ( non in modo elegante );
  • 16. Gestori di Eventi - (4/7) var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { alert(&quot;ciao&quot;); } link.onclick = function () { alert(&quot;Io sono ...&quot;); }
  • 17. Gestori di Eventi - (5/7) Quando usiamo il gestore di eventi per assegnare la seconda alert, in realt si sovrascrivono quella precedenti; Domanda: quante volte pu嘆 capitare che ci siano pi湛 script da richiamare al click di un determinato link? Risposta: forse mai =). Per嘆 ci sono molti eventi che possono richiedere l'intervento di pi湛 script. Un caso tra i tanti, il submit di un form che dovra controllare tutti i campi;
  • 18. Gestori di Eventi - (6/7) Soluzione generale var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { alert(&quot;Ciao&quot;); alert(&quot;Io sono ...&quot;); } Oppure function script1 () { alert(&quot;Uno&quot;); } function script2 () { alert(&quot;Due&quot;); } var link = document.getElementById(&quot;idlink&quot;); link.onclick = function () { script1(); script2(); }
  • 19. Gestori di Eventi - (7/7) Dentro le funzioni script1 e script2 l'attributo this non far pi湛 riferimento all'elemento che ha generato l'evento; Se uno dei due eventi restituisce false, non viene bloccata l'azione predefinita dell'elemento;
  • 20. Listener per Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 21. Listener per Eventi - (1/5) Sono come i gestori di eventi , tranne per il fatto che ad essi si possono assegnre pi湛 listenere ad un solo nodo ; Ci consentono l'uso della parola chiave this ; Sono una specifica del W3C ; Ma ... Internet Explorer offre una propria versione completamente differente; (@#&%!$) Anche Safari usa i listener ma con un meccanismo leggermente diverso;
  • 22. Listener per Eventi - (2/5) Come i gestori di eventi, i listener sono una funzione javascript che viene connessa ad un nodo del DOM ; Se volessimo fare paragoni, i gestori di eventi sono una porta USB mentre i listener sono come un hub ;
  • 23. Listener per Eventi - (3/5) elemento . addEventListener ( evento , listenerPerEventi , false); addEventListener accetta tre argomenti: evento l'evento pu嘆 essere ad esempio click oppure mouseover , senza on davanti ; listener ovvero la funzione listener stessa; tipo di listener indica se si tratta di un listener per la cattura di eventi o meno;
  • 24. Listener per Eventi - (4/5) Per Internet Explorer le cose sono leggermente differenti: elemento . attachEvent (on evento , listenerPerEventi ); AttachEvent anzich辿 addEventListener ; Onevento anzich辿 semplicemente evento ; Non c'竪 nessun terzo argomento;
  • 25. Listener per Eventi - (5/5) Come distinguere le due implementazioni If ( typeof elemento .addEventListener != undefined ) { elemento .addEventListener( evento , listenerPerEventi , false); } else { elemento .attachEvent(on evento , listenerPerEventi ); } * vedi codice di esempio ...
  • 26. Azioni Predefinite DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 27. Azioni predefinite - (1/3) <a href=... onclick=javascript:return false;>...</a> Per bloccare l' azione predefinita di un gestore di eventi ed impedirte che il browser la svolga, 竪 sufficente restiture false al gestore dell'evento. Nel modello per listener , al listenerPerEvento viene passato anche l'oggetto dell'elemento le cui propriet contengono informazioni riguardanti l'evento generato ed i metodi che consentono di controllare il modo in cui l'evento viene elaborato dal browser .
  • 28. Azioni predefinite - (2/3) Per bloccare l'evento di default basta richiamare l'evento preventDefault(); sull'elemento: clickListener: function (event) { if ( confirm (Sei sicuro di voler aprire il link?) ) { event.preventDefault(); } } Basta che un listener richiami questo metodo per evitare che venga eseguita l'operazione di default . * vedi codice di esempio ...
  • 29. Azioni predefinite - (3/3) In Internet Explorer l' oggetto evento non viene passato come argomento al listener, ma viene reso disponibile come variabile globale chiamata event ; clickListener: function (event) { if ( confirm (Sei sicuro di voler aprire il link?) ) { event.returnValue = false; } } La variabile globale ha una propriet returnValue che si pu嘆 impostare a false;
  • 30. Propagazione di Eventi DOM Events; DOM Level 2; Gestori di Eventi; Listener per eventi; Azioni predefinite; Propagazione di eventi;
  • 31. Propagazione di Eventi (1/5) Gli eventi, attraversano l'intera struttura del DOM ed il meccanismo si chiama propagazione dell'evento . Se viene associato un listener ad un link contenuto in un paragrafo, l'evento onclick viene esteso anche al contenitore del link e verr attivato anche sul paragrafo . <p> <a href= http://www.example.com >example.com</a> </p>
  • 32. Propagazione di Eventi (2/5) Nella fase di cattura , l'evento percorre tutto il DOM da document fino all'elemento che ha generato l'evento. Ogni volta che viene incontrato un elemento, viene controllato se ad esso 竪 associato un listener per la cattura di eventi relativi (ecco a che serve il terzo parametro): elemento .addEventListener( evento , listenerPerEventi , false );
  • 33. Propagazione di Eventi (3/5) Il metodo attachEvent di Internet Explorer non prevede il terzo parametro, proprio perch竪 il modello ad eventi 竪 differente e non prevede i listener per la cattura di eventi ; Molti sviluppatori evitano quindi di sfruttare i listener per la cattura di eventi ;
  • 34. Propagazione di Eventi (4/5) Nella fase di target il browser ha raggiunto il nodo DOM dell'elemento cui 竪 stato associato il listener; Al click su un link il target sar il link stesso mentre ma nel caso di Safari, il target sar il nodo testuale; Nella fase di risalita , viene ripercorso tutto il DOM fino a document e vengono eseguiti tutti i listener che non sono listener per la cattura di eventi , ad eccezione degli eventi focus() e blur();
  • 35. Propagazione di Eventi (5/5) Per interrompere la propagazione di un evento 竪 sufficente richiamare il metodo stopPropagation ; Nel caso di Internet Explorer dovremo impostare la propriet cancelBubble a true;
  • 36. I problemi di memoria in IE (1/1) In internet Explorer , la memoria occupata per un listenere non viene rilasciata nemmeno al cambio della pagina; I rallentamenti del browser potrebbero costringere l'utente a riavviarlo; La soluzione consiste nel configurare un listener per l'evento unload dell'oggetto window, ed in questo listener si possono eliminare tutti i listener per eventi definiti per il documento evitando lo spreco di memoria;
  • 37. Riepilogo (1/2) Internet Explorer utilizza attachEvent / detachEvent al posto di addEventListener / removeEventListener ; Internet Explorer chiama gli eventi con il prefisso on invece di chiamarli semplicemente evento ; Internet Explorer usa event come variabile globale invece di passarla come parametro al listener ;
  • 38. Riepilogo (2/2) Per bloccare un evento InternetExplorer richiede di impostare la propriet cancelBubble mentre invece di richiamare il metodo stopPropagation (); Internet Explorer richiama i listener come funzioni indipendenti e ci costringe, se vogliamo riciclare il codice, ad ottenere un riferimento all'elemento target invece di usare this ; Internet Explorer non si preoccupa di ripulire la memoria automaticamente ;
  • 39. I framework javascript Prototype: Event.observe(elemento, evento, listenerPerEventi); Event.stopObserving(elemento, evento, listenerPerEventi); jQuery: $(selettore).bind(evento, listenerPerEventi); $(selettore).unbind(evento, listenerPerEventi); Oppure ( sempre con jquery ... ) $(selettore).click(listenerPerClick);
  • 40. This is the end: faq?