是否有办法一次删除所有的ENTER_FRAME事件监听器?删除所有ENTER_FRAME监听器
回答
只有当你一直仔细追踪你的听众。事件监听器没有“removeAll”类型的功能,因此它有助于在易于管理的位置收集监听器。
一个选项是创建一个类,用于处理将事件侦听器添加到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
+1 ...唯一的缺点是addEventListener语法与自然形式不同(您需要先传递EventDispatcher对象)... – NemoStein 2011-03-10 14:03:12
@NemoStein将此addEventListener()视为registerEventDispatcher()相反,你会意识到解析IEventDispatcher对象不是一个缺点,而是方法的要点。但从乍一看,我可以理解为什么这个'addEventListener()'方法显示为它的同义对象'IEventDispatcher.addEventListener'的格式错误版本。我只是给它起了同样的名字,因为这些方法是相似的,但不完全一样。 – Taurayi 2011-03-10 18:47:21
- 1. 删除所有事件监听器,除了在Socket.io
- 2. 删除位置监听器
- 3. 领域删除监听器
- 4. android:IPC删除监听器
- 5. 删除事件监听器
- 6. 事件监听器没有删除
- 7. 从所有按钮单击监听器上删除?
- 8. VueJS:删除监听器设置鉴于
- 9. 在java中删除defaultButton的监听器
- 10. Socket.io执行后删除监听器
- 11. 删除Javascript中的监听器
- 12. 删除一个事件监听器
- 13. 删除的JavaScript事件监听器:
- 14. 无法删除ViewPropertyAnimator的监听器
- 15. 从面板中删除监听器
- 16. 删除除最近添加的所有事件发布监听器
- 17. removeEventListener似乎没有删除监听
- 18. 有没有办法删除用ajaxSuccess创建的监听器?
- 19. RxJava2从监听器创建Flowable并在最后删除监听器
- 20. doctrine post在symfony上删除级联删除监听器
- 21. 删除指令属性不会删除监听器
- 22. Eclipse所有作业监听器
- 23. 触发所有监听事件除了触发器本身
- 24. 从这里删除ENTER_FRAME EventListener as3
- 25. Flex/AS3:何时删除监听者?
- 26. 删除AS3预加载器中的事件监听器
- 27. WebDriver监听器和TestNG监听器有什么区别?
- 28. 删除Flex中的所有事件侦听器
- 29. 从视图中删除所有侦听器android
- 30. 如何删除NodeJS EventEmitter中的所有事件侦听器?
这个。事实上,不仅“事件侦听器”没有“全部删除”功能,除了“你对ENTER_FRAME做出响应吗?”之外,没有办法做任何检查,所以你甚至不能进行彻底的递归检查并删除那些你找到的,因为你无法读取事件的目标。你最好的选择是注意你如何添加它们。 – 2011-03-10 20:03:02