Hi,

You could try to do your own bookkeeping, so you know what listeners are
registered to an EventDispatcher object. You can have one class to hold that
info in a list and write a method that loops through that list and remove
all registered listeners. You'd still have to override the addEventListener
and removeEventListener methods in the dispatcher object, to intercept those
calls from external code and keep your bookkeeper in sync.

Some code to illustrate it (keep mind that even though it compiles, this is
untested and may be not the best idea).

package
{
 import flash.display.Sprite;

 public class Main extends Sprite
 {
  private var _evtBookKeeper:EventBookkeeper;

  public function Main():void
  {
   _evtBookKeeper = new EventBookkeeper(this);
  }

  override public function addEventListener(type:String, listener:Function,
useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean =
false):void
  {
   super.addEventListener(type, listener, useCapture, priority,
useWeakReference);
   _evtBookKeeper.registerEventListener(type, listener, useCapture);
  }

  override public function removeEventListener(type:String,
listener:Function, useCapture:Boolean = false):void
  {
   super.removeEventListener(type, listener, useCapture);
   _evtBookKeeper.unregisterEventListener(type, listener, useCapture);
  }

  public function removeAllListeners():void {
   _evtBookKeeper.unregisterAndRemoveAll();
  }

 }
}

//
//
//

package
{
 import flash.events.IEventDispatcher;
 import flash.utils.Dictionary;

 public class EventBookkeeper
 {

  private var _eventsList:Array;
  private var _dispatcher:IEventDispatcher;

  public function EventBookkeeper(dispatcher:IEventDispatcher) {
   _eventsList = [];
  }

  public function registerEventListener(type:String, listener:Function,
useCapture:Boolean):void {
   _eventsList.push(new EventListenerData(type,listener,useCapture));
  }

  public function unregisterEventListener(type:String, listener:Function,
useCapture:Boolean):void {
   var len:int = _eventsList.length;
   var i:int = 0;

   var cur:EventListenerData;

   while (i < len) {
    cur = _eventsList[i] as EventListenerData;
    if (cur.type == type && cur.listener == listener && cur.useCapture ==
useCapture) {
     _dispatcher.removeEventListener(type, listener, useCapture);
    }
    i++;
   }
  }

  public function unregisterAndRemoveAll():void {
   var len:int = _eventsList.length;
   var i:int = 0;

   var cur:EventListenerData;

   while (i < len) {
    cur = _eventsList[i] as EventListenerData;
    _dispatcher.removeEventListener(cur.type, cur.listener, cur.useCapture);
    i++;
   }

   _eventsList = [];

  }
 }

}

//
//
//

package
{

 public class EventListenerData
 {

  public var type:String;
  public var listener:Function;
  public var useCapture:Boolean;

  public function
EventListenerData(type:String,listener:Function,useCapture:Boolean) {
   this.type   = type;
   this.listener  = listener;
   this.useCapture = useCapture;
  }

 }

}


2008/7/18, Fabio Pinatti <[EMAIL PROTECTED]>:
>
> Hi list,
>
> I'm wondering if I can have a generical function, that I can remove all
> listeners registered for an object. Imagine a button with 10 listeners, and
> I don`t need know which ones it are to remove. I simply call
> "removeListeners(dpo)" and that function does all work.
>
> Is there any way?
>
> Thanks so much,
>
> --
> Fábio Pinatti
> :: web.developer
> :::: www.pinatti.com.br
> :::::: 19. 9184.3745 / 3342.1130
> _______________________________________________
> Flashcoders mailing list
> [email protected]
> http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
>
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to