如何从显示对象中删除所有事件侦听器?

时间:2009-09-21 03:15:34

标签: flash actionscript-3 events event-handling

有没有办法确定哪些事件监听器在显示对象中注册?我想从显示对象中删除所有事件侦听器,以便根据应用程序中的上下文更改分配新的事件侦听器。

5 个答案:

答案 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(){});
}

工程...