2011-03-13 11 views
0

有沒有辦法檢測何時從DisplayObjectContainer中刪除了一個子項?我嘗試重寫removeChild(),但是當通過將子對象添加到另一個容器(通過對新容器上的addChild()的調用)將其刪除時,不會觸發它。我不知道任何觸發的事件,或者...檢測DisplayObjectContainer何時被移除的方法?

我知道你可以用更高級別的Flex類來做到這一點,但我正在使用Pure AS3項目。

回答

5

更新:
正如羅伊指出的意見,因爲事件(包括Event.REMOVED)bubble up,然後簡單地增加一個事件監聽器被去除的事件的DisplayObjectContainer就足夠了;當任何子對象從容器中移除時(即使是因爲該對象被添加到不同的容器中),它將被調用。

該事件的target屬性將是被刪除的子項,並且currentTarget將永遠是容器本身。

請注意,如果整個容器本身從容器中移除,此事件也會觸發;一個簡單的if (e.target == e.currentTarget) return;應該處理這種情況。

原文如下答案:


您可以爲Event.REMOVED event事件偵聽器添加到每個DisplayObject被添加到您的DisplayObjectContainer。然後,對象本身會告訴您它已被刪除,而不必依靠DisplayObjectContainer進行通知。

如果在對象從一個容器移動到另一個容器時也不會觸發,那麼作爲解決方法,您還可以偵聽ADDED事件,並檢查顯示對象是否在觸發時仍在容器中。

不要忘記刪除事件偵聽器,一旦對象從容器中取出,否則可能有內存泄漏最終,多次調用同一對象的事件監聽器等

+0

感謝密爾 - 我檢查並確認在容器之間移動時觸發Event.REMOVED。 – Ender 2011-03-14 05:30:46

+0

@Ender:真棒,很高興知道 – Cameron 2011-03-14 05:35:35

+1

您不必爲每個displayobject添加Event.REMOVED。您只需將其添加到DisplayObjectContainer。當一個孩子被移除時,事件將到達容器,並且被移除的孩子將成爲event.target屬性。 – Roy 2011-03-14 08:32:55

-1

只要孩子在舞臺上,你可以聽Event.REMOVED_FROM_STAGE。這個例子跟蹤「刪除」。

private function init():void { 
    var parent:Sprite = new Sprite(); 
    var test:Sprite = new Sprite(); 
    test.addEventListener(Event.REMOVED_FROM_STAGE, remove); 
    parent.addChild(test); 
    stage.addChild(parent); 
    parent.removeChild(test); 
} 

private function remove(e:Event):void { 
    trace("remove"); 
}