代码之家  ›  专栏  ›  技术社区  ›  Soviut

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

  •  9
  • Soviut  · 技术社区  · 15 年前

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

    5 回复  |  直到 13 年前
        1
  •  7
  •   back2dos    15 年前

    Jeceuyper是对的…

    一方,但不是: DisplayObject 延伸 EventDispatcher ,它已经实现了 IEventDispatcher …所以更准确地说:你需要重写 addEventListener removeEventListener 跟踪听众…

    一些技术细节:我建议您使用 Dictionary 要存储处理程序函数…插入速度稍慢,但移除速度快得多…也, 词典 支持弱引用,这对于事件处理非常重要…还要记住, useCapture 允许添加同一处理程序两次…

    祝你好运…;)

        2
  •  8
  •   Andy Jacobs    15 年前

    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){}
    }
    
        3
  •  4
  •   jdecuyper    15 年前

    格伦是对的,没有像removealllistener或listallistener方法这样的东西。 不过,您可以使您的Custum DiplayObject实现 IEventDispatcher 接口并跟踪从对象中添加或删除的所有侦听器。

        4
  •  2
  •   M. Ryan    15 年前

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

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

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

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

        5
  •  -1
  •   morrisoran    13 年前
    function a(){
        mc.addEventListener(Event.ENTER_FRAME,function(){
                           ...
                           }
    }
    
    function b(){
        mc.removeEventListener(Event.ENTER_FRAME,function(){});
    }
    

    作品。。。