簡體   English   中英

事件ADDED_TO_STAGE執行次數為3次

[英]Event ADDED_TO_STAGE executed more times as3

我真的好奇為什么會發生這種情況。 我創建了兩個對象。 一個是另一個孩子。 我在事件監聽器ADDED_TO_STAGE中注冊了兩個。 classB中的onAdded方法執行兩次。

為什么會發生這種情況?如何防止這種行為?

thanx回答

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

OUTPUT:ON ADDED 1 ON ADDED 2 ON ADDED 2

這里 :有兩個類似的事件:

Event.ADDED_TO_STAGE
Event.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);
}

這是因為事件冒泡。

你應該在調用onAddedToStage刪除事件監聽器,所以內部的第一個語句:

private function onAdded(e:Event):void

應該

removeEventListener(Event.ADDED_TO_STAGE, onAdded);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM