5

我真的很好奇为什么会这样。我创建了两个对象。一个是另一个的孩子。我向事件监听器 ADDED_TO_STAGE 注册了两者。classB 中的 onAdded 方法执行了两次。

为什么会发生这种情况,我该如何防止这种行为?

谢谢你的回答

public class ClassA extends Sprite 
{
        public function ClassA () 
        {
            this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
        }

        private function onAdded(e:Event):void
        {
            trace("ON ADDED 1");
            var classB : ClassB = new ClassB();
            addChild(classB);
        }
}

public class ClassB extends Sprite 
{
        public function ClassB () 
        {
            this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
        }

        private function onAdded(e:Event):void
        {
            trace("ON ADDED 2");
        }
}

输出: 加 1 加 2 加 2

4

2 回答 2

9

这里:有两个类似的事件:

Event.ADDED_TO_STAGE
Event.ADDED

它们之间有区别:

添加

当监听的 DisplayObject 添加到另一个 DisplayObject 时被调度(不管它是否是 Stage 对象)。如果将任何其他 DisplayObject 添加到侦听 DisplayObject,它也会被调度。

ADDED_TO_STAGE

当监听的 DisplayObject 添加到舞台或添加到舞台的任何其他 DisplayObject 时,将被调度。


在您的情况下,它分派两次:

1) ClassB 被添加到已经添加到 Stage 的 ClassA 中。

2)ClassB被添加到Stage。

这是一种低级 API。如果 .parent 是否为 Stage,您可以提供自定义逻辑。基本上那些你知道的,你真的不需要听这个,你可以打电话:

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded);

以防止调用 onAdded 两次。

另一种防止这种情况的方法是在构造 classA 时添加 classB:

private classB:ClassB = new ClassB();
public function ClassA () 
{
    addChild(classB);
    this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
于 2013-07-06T18:29:55.323 回答
1

这是因为事件冒泡。

一旦被调用,您应该删除事件侦听onAddedToStage器,所以里面的第一条语句:

private function onAdded(e:Event):void

应该

removeEventListener(Event.ADDED_TO_STAGE, onAdded);
于 2016-02-04T23:19:55.293 回答