事件ADDED_TO_STAGE执行次数为3次

时间:2013-07-06 17:32:02

标签: actionscript-3

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

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

thanx for answer

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

输出: ON ADDED 1 ON ADDED 2 ON ADDED 2

2 个答案:

答案 0 :(得分:9)

来自here:有两个类似的事件:

Event.ADDED_TO_STAGE
Event.ADDED

它们之间存在差异:

  

ADDED

将侦听DisplayObject添加到另一个DisplayObject时(无论它是否为Stage对象),都会调度

。如果将任何其他DisplayObject添加到侦听DisplayObject,它也会被调度。

  

ADDED_TO_STAGE

将侦听DisplayObject添加到舞台或添加到舞台的任何其他DisplayObject时,

将被调度。


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

  

1)ClassB被添加到已添加到舞台的ClassA中。

     

2)ClassB被添加到舞台上。

这是一种低级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);
}

答案 1 :(得分:1)

这是因为事件冒泡。

一旦调用onAddedToStage,你应该删除事件监听器,所以内部的第一个语句:

private function onAdded(e:Event):void

应该是

removeEventListener(Event.ADDED_TO_STAGE, onAdded);