2011-03-09 91 views

回答

3

只有当你一直仔细追踪你的听众。事件监听器没有“removeAll”类型的功能,因此它有助于在易于管理的位置收集监听器。

+0

这个。事实上,不仅“事件侦听器”没有“全部删除”功能,除了“你对ENTER_FRAME做出响应吗?”之外,没有办法做任何检查,所以你甚至不能进行彻底的递归检查并删除那些你找到的,因为你无法读取事件的目标。你最好的选择是注意你如何添加它们。 – 2011-03-10 20:03:02

2

一个选项是创建一个类,用于处理将事件侦听器添加到IEventDispatcher对象中,注册这些对象并同时删除所有事件侦听器。以下是我迅速做了演示这样的例子:

EventListeners.as:

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

    public class EventListeners 
    { 
     private var _objectDictionaries:Vector.<Dictionary>; 

     public function EventListeners() 
     { 
      init(); 

     }// end function 

     public function addEventListener(object:IEventDispatcher, 
             type:String, 
             listener:Function, 
             useCapture:Boolean = false, 
             priority:int = 0, 
             useWeakReference:Boolean = false) 
     { 
      object.addEventListener(type, listener, useCapture, priority, useWeakReference); 

      var objectDictionary:Dictionary = new Dictionary(); 
      objectDictionary["object"] = object; 
      objectDictionary["type"] = type; 
      objectDictionary["listener"] = listener; 
      objectDictionary["useCapture"] = useCapture; 
      _objectDictionaries.push(objectDictionary); 

     }// end function 

     public function removeAll():void 
     { 
      for each(var objectDictionary:Dictionary in _objectDictionaries) 
      { 
       var object:IEventDispatcher = objectDictionary["object"] as IEventDispatcher; 
       var type:String = objectDictionary["type"] as String; 
       var listener:Function = objectDictionary["listener"] as Function; 
       var useCapture:Boolean = objectDictionary["useCapture"] as Boolean; 

       object.removeEventListener(type, listener, useCapture); 

      }// end for 

      init(); 

     }// end function 

     private function init():void 
     { 
      _objectDictionaries = new Vector.<Dictionary>(); 

     }// end function 

    }// end class 

}// end package 

Main.as:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     private var _eventListeners:EventListeners; 
     private var _sprite1:Sprite; 
     private var _sprite2:Sprite; 

     public function Main() 
     { 
      init(); 

     }// end function 

     public function init():void 
     { 
      _eventListeners = new EventListeners(); 
      _sprite1 = new Sprite(); 
      _sprite2 = new Sprite(); 

      _eventListeners.addEventListener(_sprite1, Event.ENTER_FRAME, enterFrameHandler); 
      _eventListeners.addEventListener(_sprite2, Event.ADDED_TO_STAGE, addedToStageHandler); 

      trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME)); 
      trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE)); 

      _eventListeners.removeAll(); 

      trace("\n_eventListeners.removeAll() invoked\n"); 

      trace("_sprite1.hasEventListener = " + _sprite1.hasEventListener(Event.ENTER_FRAME)); 
      trace("_sprite2.hasEventListener = " + _sprite2.hasEventListener(Event.ADDED_TO_STAGE)); 

     }// end function 

     private function enterFrameHandler(e:Event):void {}; 
     private function addedToStageHandler(e:Event):void {}; 

    }// end class 

}// end package 

运行这个例子的输出如下:

_sprite1.hasEventListener = true 
_sprite2.hasEventListener = true 

_eventListeners.removeAll() invoked 

_sprite1.hasEventListener = false 
_sprite2.hasEventListener = false 
+0

+1 ...唯一的缺点是addEventListener语法与自然形式不同(您需要先传递EventDispatcher对象)... – NemoStein 2011-03-10 14:03:12

+1

@NemoStein将此addEventListener()视为registerEventDispatcher()相反,你会意识到解析IEventDispatcher对象不是一个缺点,而是方法的要点。但从乍一看,我可以理解为什么这个'addEventListener()'方法显示为它的同义对象'IEventDispatcher.addEventListener'的格式错误版本。我只是给它起了同样的名字,因为这些方法是相似的,但不完全一样。 – Taurayi 2011-03-10 18:47:21