Actionscript 3 事件添加到\u阶段,执行次数为3次

Actionscript 3 事件添加到\u阶段,执行次数为3次,actionscript-3,Actionscript 3,我真的很好奇为什么会发生这种事。我创建了两个对象。一个是另一个的孩子。我在事件监听器添加到阶段时注册了这两个。类B中添加的方法ONAD执行两次 为什么会发生这种情况?我如何防止这种行为 谢谢你的回答 public class ClassA extends Sprite { public function ClassA () { this.addEventListener(Event.ADDED_TO_STAGE, onAdded);

我真的很好奇为什么会发生这种事。我创建了两个对象。一个是另一个的孩子。我在事件监听器添加到阶段时注册了这两个。类B中添加的方法ONAD执行两次

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

谢谢你的回答

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上:有两个类似的事件:

Event.ADDED_TO_STAGE
Event.ADDED
它们之间有区别:

增加

将侦听的DisplayObject添加到另一个DisplayObject(无论它是否为阶段对象)时被调度。此外,如果将任何其他DisplayObject添加到侦听DisplayObject,它也会被调度

添加了_到_阶段

在侦听DisplayObject添加到stage或添加到stage的任何其他DisplayObject时被调度


在您的情况下,它会发送两次:

1) ClassB被添加到已经添加到阶段的ClassA中

2) B类被添加到舞台上

这是一种低级API。您可以在以下情况下提供自定义逻辑。父级是否为阶段。 基本上你知道,你不需要听这个,你可以打电话:

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

这是因为事件冒泡

调用OnAddedStatage后,您应该删除事件侦听器,因此其中的第一条语句:

private function onAdded(e:Event):void
应该是

removeEventListener(Event.ADDED_TO_STAGE, onAdded);