2012-01-22 51 views
0

我想讓我的父類首先處理事件,然後我想讓子處理事件。有沒有辦法讓事件明確地發佈?我想要做這樣的事情:我需要幫助在AS3中冒泡事件

... 
this.addEventListener(MouseEvent.CLICK, characterClicked); 
... 

private function characterClicked(e:Event):void{ 
// pass event to parent to be handled first 
... 
} 

這是可能的,如果是這樣可能嗎?

+0

object1添加object2。 object2被點擊。 Object2將首先獲得事件。我想讓object2將事件冒泡到object1,然後處理事件。 – Boundless

回答

0

我想出了一個辦法來做到這一點。似乎是駭人聽聞,但它的作品。如果有更好的方法,請讓我知道。

... 
this.addEventListener(MouseEvent.CLICK, characterClicked); 
... 

private function characterClicked(e:Event):void{ 
// pass event to parent to be handled first 
this.removeEventListener(MouseEvent.CLICK, characterClicked); //prevent infinite loop 
      dispatchEvent(e); // send event to parent object 
      this.addEventListener(MouseEvent.CLICK, characterClicked); 
      e.stopImmediatePropagation(); 
... 
} 
+0

您不必顯式重新分派事件以捕獲父項中的事件。 在你的情況下,我會在父項中添加一個事件偵聽器,在父項中處理該事件,並且一旦父項已完成事件處理,我會在子項上調用一個函數。假設每個家長只有一個孩子。 – ganaraj

+0

感謝您的建議。我需要在子類中處理這個,而不是在父類中。父容器代碼不應更改。 – Boundless

0

如果您要處理父代而不是子代的監聽器,可能會更容易。然後,你可以在事件剛剛傳遞給當你做孩子:

// inside parent class: 
childObj.addEventListener(MouseEvent.CLICK, onCharacterClicked); 

private function onCharacterClicked(e:Event):void { 
    // do parent stuff first 
    // ... 

    // then pass event to child 
    childObj.onCharacterClicked(e); 
} 
+0

謝謝,但這不起作用。我正在寫一個類,並且我無法控制父容器是什麼。這必須在子對象中完成。 – Boundless

5

有三個事件的「階段」; Capture, At target and Bubble。它們按照這個順序發生,這意味着如果你設置一個事件監聽器處於捕獲階段,它將會經常在一個定時器之前觸發(這意味着在目標或者泡泡)。

像這樣:

// in parent, third argument is "use capture" 
child.addEventListener(MouseEvent.CLICK, handleClickInParent, true); 

// in child, add listener as usual 
addEventListener(MouseEvent.CLICK, handleClick); 

現在,你的父母事件監聽器總是首先開火!

+0

謝謝,+1解決方案的作品。我仍然在尋找一種方法來從子對象內部做到這一點。我不會總是編寫使用這個類的代碼(因此我不能依靠其他程序員將第三個參數設置爲true)。你知道從孩子內部做到這一點嗎? – Boundless

+0

如果你解釋爲什麼你需要這樣做,我可能會想出一些東西。 – grapefrukt

+0

總之,在程序中使用了一個全局布爾標誌。一些被點擊的對象會導致標誌被打開,一些被點擊的東西會切斷標誌(以及其他動作)。當我的角色被點擊時,我需要打開標誌(不管它是誰的父母)。所以,我需要確保我的父母做它需要做的事情,然後我可以切換這個標誌並做角色需要做的其他事情。 – Boundless