![](/img/trans.png)
[英]Event ADDED_TO_STAGE executed two times as3 when I am using it on external swf
[英]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.