Aunque el manejo de eventos en ActionScript 2 no es tan refinado como el de su sucesor, AS 3, la clase EventDispatcher sí puede usarse en muchas situaciones, sobre todo cuando se trabaja con componentes, logrando un código más robusto y orientado a la Programación orientada a objetos. En algunas ocasiones los listeners de nuestra aplicación se quedan vivos aún cuando ya no los necesitamos y eso nos acarrea que la aplicación tenga unos resultados poco esperados (esto sucede sobre todo si usamos interfaces o programamos de afán ).
Por esa razón he modificado ligeramente la clase EventDispatcher de Macromedia añadiéndole algunas funcionalidades interesantes que listaremos a continuación:
1. A la función addEventListener se le añadió un nuevo argumento llamado "tagName":
Es un String con el cual podemos agrupar listeners de la misma funcionalidad. Se ve mejor con un ejemplo:
Código :
this.addEventListener("clic", onClic, "botones"); this.addEventListener("focus", onFocus, "botones"); this.addEventListener("exit", onExit, "botones");
Como ven todos tienen el mismo tagName ("botones" en este ejemplo).
2. Se añadió una nueva función estática "removeEventListenersForTagName":
Con esta podemos eliminar todos los listeners que tengan cierto tagName.
Código :
EventDispatcher.removeEventListenersForTagName("botones"); EventDispatcher.removeEventListenersForTagName("registro"); EventDispatcher.removeEventListenersForTagName("juego1");
3. Se añadió una nueva función estática "removeEventListenersForEvent":
Con esta podemos eliminar todos los listeners que tengan cierto evento y fueron registrados por nuestro EventDispatcher.
Código :
EventDispatcher.removeEventListenersForEvent("clic"); EventDispatcher.removeEventListenersForEvent("focus"); EventDispatcher.removeEventListenersForEvent("exit");
Hay que tener cuidado con esta función ya que se busca ese nombre de evento en toda la aplicación.
4. Se añadió una nueva función estática "removeEventListenersForScope":
Con esta podemos eliminar todos los listeners de cierta clase u objeto.
Código :
EventDispatcher.removeEventListenersForScope(this); EventDispatcher.removeEventListenersForScope(this.oMain); EventDispatcher.removeEventListenersForScope(RegisterManger);
5. Se añadió una nueva función estática "removeAllEventListeners":
Con esta eliminamos todos (repito, TODOS) los listeners que fueron registradas por nuestro EventDispatcher.
Código :
EventDispatcher.removeAllEventListeners();
6. A la función dispatchEvent se le añadió un nuevo argumento llamado "deleteListener": Es un Boolean que le indica a la función si debe eliminar el listener después de ejecutarlo. Si es True entonces despacha el evento y lo borra inmediatamente, si el False o undefined o null lo despacha pero no lo borra.
Código :
this.dispatchEvent({type:"clic", target:this}, true); this.dispatchEvent({type:"clic", target:this}, false); this.dispatchEvent({type:"clic", target:this});
Como ven no tenemos que ponernos a eliminar uno por uno los listeners que creamos, solo los agrupamos por un tagName o los encapsulamos en cierta clase y los matamos todos de un solo golpe.
Otra ventaja es que es 100% compatible con el EventDispatcher de Macromedia entonces podemos cambiar tranquilamente el import de mx.events.EventDispatcher por el de nuestro EventDispatcher.
Las demás funciones siguen igualitas y se utilizan de la misma manera (incluido el "initialize").
EventDispatcher.as
Código :
/** * Clase modificada de EventDispatcher de Macromedia * @author JoH * @version 20071210 */ //**************************************************************************** //Copyright (C) 2003 Macromedia, Inc. All Rights Reserved. //The following is Sample Code and is subject to all restrictions on //such code as contained in the End User License Agreement accompanying //this product. //**************************************************************************** /** * base class for event listening and dispatching * * @helpid 3295 * @tiptext */ class com.npi.events.EventDispatcher { // make a instance of ourself so we can add methods to other objects static var _fEventDispatcher:EventDispatcher = undefined; // these events do not get called via backdoor because of name collisions with other methods static var exceptions:Object = {move: 1, draw: 1, load:1}; /** * object with all listeners */ static var _queues:Object; static var _queuesCount:Number; // internal function for removing listeners static function _removeEventListener(queue:Object, event:String, handler):Void { if (queue != undefined) { var l:Number = queue.length; var i:Number; for (i = 0; i < l; i++) { var o = queue[i].handler; if (o == handler) { queue.splice(i, 1); return; } } } } /** * add listening and dispatching methods to an object * @param object the object to receive the methods */ static function initialize(object:Object):Void { if (_fEventDispatcher == undefined) { _fEventDispatcher = new EventDispatcher; EventDispatcher._queues = new Object(); EventDispatcher._queuesCount = 0; } object.addEventListener = _fEventDispatcher.addEventListener; object.removeEventListener = _fEventDispatcher.removeEventListener; object.dispatchEvent = _fEventDispatcher.dispatchEvent; object.dispatchQueue = _fEventDispatcher.dispatchQueue; //--- object["__qc_"] = EventDispatcher._queuesCount; EventDispatcher._queuesCount++; } // internal function for dispatching events function dispatchQueue(queueObj:Object, eventObj:Object, deleteListener:Boolean):Void { var queueName:String = "__q_" + eventObj.type; var queue:Array = queueObj[queueName]; if (queue != undefined) { var i:String; // loop it as an object so it resists people removing listeners during dispatching for (i in queue) { var o = queue[i].handler; var oType:String = typeof(o); // a handler can be a function, object, or movieclip if (oType == "object" || oType == "movieclip") { // this is a backdoor implementation that // is not compliant with the standard if (o.handleEvent != undefined) { // this is the DOM3 way o.handleEvent(eventObj); } if (o[eventObj.type] != undefined) { if (EventDispatcher.exceptions[eventObj.type] == undefined) { // this is a backdoor implementation that // is not compliant with the standard o[eventObj.type](eventObj); } } } else // it is a function { o.apply(queueObj, [eventObj]); } //--- if (deleteListener) { EventDispatcher._removeEventListener(queueObj[queueName], eventObj.type, o); } } } } /** * dispatch the event to all listeners * @param eventObj an Event or one of its subclasses describing the event */ function dispatchEvent(eventObj:Object, deleteListener:Boolean):Void { if (eventObj.target == undefined) eventObj.target = this; this[eventObj.type + "Handler"](eventObj); // Dispatch to objects that are registered as listeners for // this object. this.dispatchQueue(this, eventObj, deleteListener); } /** * add a listener for a particular event * @param event the name of the event ("click", "change", etc) * @param the function or object that should be called */ function addEventListener(event:String, handler, tagName:String):Void { var queueName:String = "__q_" + event; var oQueue:Object = new Object(); if (this[queueName] == undefined) { this[queueName] = new Array(); } if (EventDispatcher._queues[queueName] == undefined) { EventDispatcher._queues[queueName] = new Object(); } _global.ASSetPropFlags(this, queueName,1); EventDispatcher._removeEventListener(this[queueName], event, handler); //--- oQueue.tagName = tagName; oQueue.handler = handler; //--- this[queueName].push(oQueue); EventDispatcher._queues[queueName][this["__qc_"]] = this[queueName]; } /** * remove a listener for a particular event * @param event the name of the event ("click", "change", etc) * @param the function or object that should be called */ function removeEventListener(event:String, handler):Void { var queueName:String = "__q_" + event; EventDispatcher._removeEventListener(this[queueName], event, handler); } /** * Elimina todos las escuchas que tengan ese tag * @param tagname Tag a eliminar */ public static function removeEventListenersForTagName(tagName:String):Void { if (tagName != undefined) { var i:String; var j:String; var k:String; var queues:Object; var queue:Object; //--- for (i in EventDispatcher._queues) { queues = EventDispatcher._queues[i]; //--- for (j in queues) { queue = queues[j]; //--- for (k in queue) { var o = queue[k].tagName; if (o == tagName) { queue.splice(k, 1); } } } } } } /** * Remueve todas las escuchas que tengan ese nombre de evento * @param event Nombre del evento a eliminar */ public static function removeEventListenersForEvent(event:String):Void { if (event != undefined) { var j:String; var k:String; var queues:Object; var queue:Object; //--- queues = EventDispatcher._queues["__q_" + event]; //--- for (j in queues) { queue = queues[j]; //--- for (k in queue) { queue.splice(k, 1); } } //--- delete EventDispatcher._queues["__q_" + event]; } } /** * Remueve todas las escuchas de la Clase / Objeto * @param scope Ruta de la Clase / Objeto a eliminar */ public static function removeEventListenersForScope(scope):Void { if (scope != undefined) { if (scope["__qc_"] != undefined) { var scopeNumber:Number = scope["__qc_"]; var i:String; var j:String; var k:String; var queues:Object; var queue:Object; //--- for (i in EventDispatcher._queues) { queues = EventDispatcher._queues[i]; //--- for (j in queues) { if (j == scope["__qc_"]) { queue = queues[j]; //--- for (k in queue) { queue.splice(k, 1); } //--- delete EventDispatcher._queues[i][j]; //--- break; } } } } } } /** * Remueve todas las escuchas que fueron registradas por esta clase */ public static function removeAllEventListeners():Void { var i:String; var j:String; var k:String; var queues:Object; var queue:Object; //--- for (i in EventDispatcher._queues) { queues = EventDispatcher._queues[i]; //--- for (j in queues) { queue = queues[j]; //--- for (k in queue) { queue.splice(k, 1); } } } //--- EventDispatcher._queues = new Object(); } }
Espero les sirva

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Luis Miguel el 22 de Febrero de 2008
gracias, ya lo voy a inspeccionar con mas detenimiento.
juako
Por merlin1989 el 02 de Enero de 2010