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 Zguillez el 14 de Febrero de 2008
Por Luis Miguel el 22 de Febrero de 2008
Por yojuako el 18 de Septiembre de 2008
gracias, ya lo voy a inspeccionar con mas detenimiento.
juako
Por merlin1989 el 02 de Enero de 2010