有没有办法确定哪些事件监听器在显示对象中注册?我想从显示对象中删除所有事件侦听器,以便根据应用程序中的上下文更改分配新的事件侦听器。
答案 0 :(得分:8)
back2dos已经提到了你应该使用的方法,我所做的是扩展movieclip类并实现我每天使用但不属于movieclip类的各种函数。包括addEventListener类的覆盖
protected var listeners : Dictionary = new Dictionary();
override public function addEventListener( type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void
{
var key : Object = {type:type,useCapture:useCapture};
if( listeners[ key ] ) {
removeEventListener( type, listeners[ key ], useCapture );
listeners[ key ] = null;
}
listeners[ key ] = listener;
super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}
protected function removeListeners () : void
{
try
{
for (var key:Object in listeners) {
removeEventListener( key.type, listeners[ key ], key.useCapture );
listeners[ key ] = null;
}
}catch(e:Error){}
}
答案 1 :(得分:7)
jeceuyper是对的......
但不是DisplayObject
扩展EventDispatcher
,它已经实现了IEventDispatcher
...所以更准确一点:你需要覆盖addEventListener
和{{ 1}}跟踪听众...
一些技术细节:我建议您使用removeEventListener
来存储处理程序函数...插入速度稍慢,但删除速度要快得多......另外,Dictionary
支持弱引用,这对于事件处理非常重要...还要记住,Dictionary
允许两次添加相同的处理程序......
祝你好运......;)
答案 2 :(得分:4)
Glenn是对的,没有removeAllListener或listAllListener方法。 不过,您可以让您的custum diplayObject实现IEventDispatcher接口,并跟踪从对象中添加或删除的所有侦听器。
答案 3 :(得分:2)
这有点像黑客攻击,但在某些情况下(可能是大多数情况下),您可以轻松地将显示对象设置为null并重新初始化它,然后在零视觉中断的情况下重新配置它。
除了删除所有事件监听器之外,还有额外的好处。
除非你在已经拥有数百个侦听器和对象的应用程序中执行此操作,否则只要您能够容忍重新配置显示对象,它就应该可以正常工作。
显然,你不应该在构造函数中做任何疯狂的事情,比如加载数据。
答案 4 :(得分:-1)
function a(){
mc.addEventListener(Event.ENTER_FRAME,function(){
...
}
}
function b(){
mc.removeEventListener(Event.ENTER_FRAME,function(){});
}
工程...