2013-07-06 51 views
5

我真的很好奇爲什麼會發生這種情況。我創建了兩個對象。一個是另一個的孩子。我註冊了事件監聽器ADDED_TO_STAGE。在classB中添加的方法被執行兩次。事件ADDED_TO_STAGE執行多次as3

爲什麼會發生這種情況,我該如何防止這種行爲?

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新增1 ON ADDED 2 ON ADDED 2

回答

9

here:有兩個類似的事件:

Event.ADDED_TO_STAGE 
Event.ADDED 

有它們之間的差異:

ADDED

當聽音的DisplayObject添加到另一個DisplayObject(如果它是一個舞臺對象與否不論)被分派。如果將任何其他DisplayObject添加到偵聽的DisplayObject中,它也會被分派。

ADDED_TO_STAGE

當聽音的DisplayObject被添加到舞臺或將其加入舞臺的任何其他DisplayObject獲取調度。


你的情況,將分派兩次:

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

2)將ClassB添加到舞臺。

這是一個有點低級別的API。您可以提供自定義邏輯,以便.parent是Stage或不。你知道 基本上那些,你並不真的需要聽這一點,你可以撥打:

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded); 

防止調用onAdded回調函數裏的兩倍。

的另一種方式,以防止被添加CLASSB邊建設邊CLASSA:

private classB:ClassB = new ClassB(); 
public function ClassA() 
{ 
    addChild(classB); 
    this.addEventListener(Event.ADDED_TO_STAGE, onAdded); 
} 
+0

謝謝你教我一些新的東西:) – Riddlah

0

這是因爲事件冒泡的。

你應該刪除事件偵聽器,一旦onAddedToStage被調用,所以第一個語句中:

private function onAdded(e:Event):void 

應該

removeEventListener(Event.ADDED_TO_STAGE, onAdded);