0

所以,有一种简单的方法可以像这样从容器中删除所有孩子

while (container.numChildren)
{
    container.removeChildAt(0);
}

有没有办法以复数形式删除 stage.eventListener(不知道我是否使用了正确的词),比如 stage.eventListeners?类似的东西?

谢谢!

4

4 回答 4

3

不,没有。至少没有公开可用的机制来跟踪事件侦听器。但是,你可以自己做。

基本上,您需要跟踪添加的每个侦听器。最简单的方法是扩展您想要执行此操作的类并覆盖addEventListener().

private var listeners:Vector.<Object>;

override public function addEventListener( type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void {
    var obj:Object = {
        type : type,
        listener : listener
    };
    this.listeners.push( obj );
    super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}

override public function removeEventListener( type:String, listener:Function, useCapture:Boolean = false ):void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        if ( this.listeners[i].type == type && this.listeners[i].listener == listener ) {
            this.listeners.splice( i, 1 );
            break;
        }
    }

    super.removeEventListener( type, listener, useCapture );
}

public function removeAllEventListeners():void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        super.removeEventListener( this.listeners[i].type, this.listeners[i].listener );
    }
    this.listeners.splice( 0, this.listeners.length ); //empties the vector
}

如果扩展类不是您的选择(因为您正在使用带有时间线的 Flash Pro,或者如果它是您需要从中删除所有事件侦听器的阶段),您可以在每次添加事件时手动将其添加到 Vector听众。它不像我上面描述的那样简单,但它仍然可以工作。

请注意,您可能应该将该useCapture属性添加到正在保存的对象并检查它,但老实说,我从未将该属性设置为默认值,因此我没有将其包含在我的代码中

于 2013-02-14T18:22:05.037 回答
0

在 FlashPlayer 11 中,DisplayObjectContainer支持removeChildren删除所有子项的功能。所以你可以用你的while循环替换container.removeChildren()

至于删除所有 eventListener,没有内置方法。但是,您可以自己编写一些东西来跟踪添加到特定对象的所有侦听器,从而允许您通过循环遍历集合来删除它们。

于 2013-02-14T18:18:05.990 回答
0

不幸的是,简短的回答是这是不可能的。默认情况下,事件调度程序不会公开跟踪注册的侦听器。因此,您不能遍历某些列表并将它们全部删除。

您必须记住自己添加的听众。

于 2013-02-14T18:21:31.460 回答
0

有一个非常简单的解决方案,Robert Penner 的非凡信号库。这是一个例子:

import org.osflash.signal.Signal;

public class Rocket()
{
    //  Signals are used to dispatch messages to interested parties
    public var enginesFiredSignal:Signal;
    public function Rocket()
    {
        //  You have to instantiate the signal for it to do anything
        enginesFiredSignal = new Signal();
    }

    public function fireEngines():void
    {
        //  Dispatch will notify any interested parties
        enginesFiredSignal.dispatch();
    }

    public function dispose():void
    {
        //  This is the magic call... it removes *all* interested parties.
        //  No need to iterate through them and removeEventListeners.
        enginesFiredSignal.removeAll();
    }
}

public class Academy()
{
    public var rocket:Rocket;
    public function Academy()
    {
        rocket = new Rocket();
        //  We are interested to know *when* the engines fire,
        //  so we "add" ourself to the Signal.
        rocket.enginesFiredSignal.add( enginesFiredHandler );
        //  This call will force the Signal to do its thing
        rocket.fireEngines();
        //  Disposing of the Rocket will automatically remove us from
        //  its Signal. No further event removal or maintenance required.
        rocket.dispose();
    }

    public function enginesFiredHandler():void
    {
        trace( "engines were fired" );
    }
}

你可以超越这个来做参数传递和各种有趣的事情。我建议你看看他的博客。

http://flashblog.robertpenner.com

这是有关如何开始使用 AS3 信号的教程:

http://www.youtube.com/watch?v=wB_sWJ5EgXI

于 2013-02-14T23:14:07.867 回答