Gestione degli eventi: similitudini tra Flash e Javascript

Mercoledì 25 Luglio, 2007

Uno dei punti di forza di Adobe Flash risiede nella scelta di ECMAScript (sottoprodotti di ECMA - European Computer Manufacturers Association) come standard di scripting. ActionScript e Javascript, infatti, derivano entrambi da uno standard superiore che li rende estremamente simili. Questo è uno dei motivi per il quale molti programmatori ActionScript sviluppano con estrema semplicità anche in Javascript e viceversa.

ActionScript ha da sempre avuto una gestione "doppia" degli eventi che spesso ha confuso alcuni sviluppatori. Nei MovieClip, ad esempio, è possibile impostare un evento semplicemente dichiarando una funzione alla proprietà dell'evento stesso, ad esempio:

Metodo 1

Actionscript:
  1. mio_mc.onRelease = function() {
  2.     trace("Click sul MovieClip");
  3. }

Altri oggetti, diversamente, richiedono una gestione diversa dell'evento che si vuole monitorare, richiedendo il classico listener, un oggetto predisposto a tale compito. Ad esempio l'oggetto Mouse può essere controllato in questo modo:

Metodo 2

Actionscript:
  1. var mouseListener:Object = new Obejct();
  2. mouseListener.onMouseMove = function() {
  3.     trace("Mouse in moto");
  4. }
  5. Mouse.addListener(mouseListener);

I componenti possiedono un'ulteriore variante, come il componente Loader:

Metodo 3

Actionscript:
  1. var loaderListener:Object = new Object();
  2. loaderListener.complete = function(evt:Object) {
  3.     trace("Caricamento completato");
  4. };
  5. myLoader_ldr.addEventListener("complete", loaderListener);

Perchè queste differenze? La ragione, in verità, è molto semplice. Il metodo 1, quello più immediato, viene utilizzato quando l'evento da "intercettare" è unico nel suo genere, cioè quando non ha senso far "scattare" più funzioni una di seguito all'altra. I metodi 2 e 3, invece, creano delle "liste" di "ascoltatori" e sono estremamente utili e potenti in quanto consentono di agganciare virtualmente infinite funzioni ad un determinato evento.

La stessa identica cosa accade in Javascript e la si può ammirare in librerie come prototype. Il comodissimo metodo observe(), messo a disposizione dall'oggetto Event, permette di agganciare funzioni ad un evento di un oggetto. Ad esempio:

JavaScript:
  1. Event.observe(window, 'load', function() { alert("Finestra caricata"); } );

In questo caso abbiamo agganciato la nostra funzione che mostra un alert all'evento load dell'oggetto window. Potremmo tuttavia ripetere l'istruzione e agganciare un'ulteriore evento:

JavaScript:
  1. Event.observe(window, 'load', function() { alert("Finestra caricata - 1"); } );
  2. Event.observe(window, 'load', function() { alert("Finestra caricata - 2"); } );

Questa caratteristica, comune anche in ActionScript, è estremamente versatile è, in particolare in Javascript, è stata la chiave per la realizzazione di moltissimi "Widgets" ed estensioni (vedi il classico Snap) che oggi proliferano nel Web. La possibilità di accodarsi, infatti, ad eventi già controllati da altre funzioni, permette di essere non intrusivi (Unobtrusive) e quindi, in pratica, di aggiungere funzioni a quelle già presenti.

Post correlati