Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 如何从显示对象中删除所有事件侦听器?_Flash_Actionscript 3_Events_Event Handling - Fatal编程技术网

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

Flash 如何从显示对象中删除所有事件侦听器?,flash,actionscript-3,events,event-handling,Flash,Actionscript 3,Events,Event Handling,是否有方法确定向显示对象注册了哪些事件侦听器?我想从显示对象中删除所有事件侦听器,以便根据应用程序中的上下文更改分配新的事件侦听器。Glenn是对的,没有removeAllListener或ListalListener方法。 不过,您可以让custum diplayObject实现该接口,并跟踪从对象中添加或删除的所有侦听器。jeceuyper是对的 但另一方面:DisplayObject扩展了EventDispatcher,它已经实现了IEventDispatcher。。。所以更准确地说:您需

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

Glenn是对的,没有removeAllListener或ListalListener方法。 不过,您可以让custum diplayObject实现该接口,并跟踪从对象中添加或删除的所有侦听器。

jeceuyper是对的

但另一方面:
DisplayObject
扩展了
EventDispatcher
,它已经实现了
IEventDispatcher
。。。所以更准确地说:您需要覆盖
addEventListener
removeEventListener
以跟踪侦听器

一些技术细节:我建议您使用
字典
来存储处理程序函数。。。插入时稍微慢一点,但删除时要快得多。。。而且,
字典
支持弱引用,这在事件处理中非常重要。。。还要记住,
useCapture
允许添加相同的处理程序两次


那么祝你好运……;)

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){}
}

这是一种黑客行为,但在某些情况下(可能大多数情况下),您可以轻松地将display对象设置为null并重新初始化它,然后以零视觉中断重新配置它

这增加了删除所有事件侦听器的好处

除非你在一个已经有数百个监听器和对象的应用程序中这样做,否则只要你能容忍重新配置你的显示对象,它就应该工作得很好

显然,您不应该对任何在构造函数中执行疯狂操作(如加载数据)的操作执行此操作

function a(){
    mc.addEventListener(Event.ENTER_FRAME,function(){
                       ...
                       }
}

function b(){
    mc.removeEventListener(Event.ENTER_FRAME,function(){});
}

工作…

基本上是今天早些时候记录的这个问题的副本:但简短的回答是你必须使用哈希映射或其他方法来管理自己的问题。请仔细阅读问题。我问过如何从对象中删除所有事件侦听器。实际上,我只是在研究这个问题来解决这个问题。这不起作用--在
函数b
中创建的匿名事件处理程序函数与在
函数a
中创建的匿名事件处理程序函数是不同的对象。因此,
removeEventListener
调用将以静默方式失败……除非将类型合并到键中而不合并函数指针,这意味着对象上只能有一个给定类型的侦听器。要允许多个侦听器,请添加指向key对象的侦听器函数指针,并将该key设置为某个伪值(例如1)。