有沒有辦法檢測何時從DisplayObjectContainer中刪除了一個子項?我嘗試重寫removeChild(),但是當通過將子對象添加到另一個容器(通過對新容器上的addChild()的調用)將其刪除時,不會觸發它。我不知道任何觸發的事件,或者...檢測DisplayObjectContainer何時被移除的方法?
我知道你可以用更高級別的Flex類來做到這一點,但我正在使用Pure AS3項目。
有沒有辦法檢測何時從DisplayObjectContainer中刪除了一個子項?我嘗試重寫removeChild(),但是當通過將子對象添加到另一個容器(通過對新容器上的addChild()的調用)將其刪除時,不會觸發它。我不知道任何觸發的事件,或者...檢測DisplayObjectContainer何時被移除的方法?
我知道你可以用更高級別的Flex類來做到這一點,但我正在使用Pure AS3項目。
更新:
正如羅伊指出的意見,因爲事件(包括Event.REMOVED)bubble up,然後簡單地增加一個事件監聽器被去除的事件的DisplayObjectContainer
就足夠了;當任何子對象從容器中移除時(即使是因爲該對象被添加到不同的容器中),它將被調用。
該事件的target
屬性將是被刪除的子項,並且currentTarget
將永遠是容器本身。
請注意,如果整個容器本身從的容器中移除,此事件也會觸發;一個簡單的if (e.target == e.currentTarget) return;
應該處理這種情況。
原文如下答案:
您可以爲Event.REMOVED
event事件偵聽器添加到每個DisplayObject
被添加到您的DisplayObjectContainer
。然後,對象本身會告訴您它已被刪除,而不必依靠DisplayObjectContainer
進行通知。
如果在對象從一個容器移動到另一個容器時也不會觸發,那麼作爲解決方法,您還可以偵聽ADDED事件,並檢查顯示對象是否在觸發時仍在容器中。
不要忘記刪除事件偵聽器,一旦對象從容器中取出,否則可能有內存泄漏最終,多次調用同一對象的事件監聽器等
只要孩子在舞臺上,你可以聽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");
}
感謝密爾 - 我檢查並確認在容器之間移動時觸發Event.REMOVED。 – Ender 2011-03-14 05:30:46
@Ender:真棒,很高興知道 – Cameron 2011-03-14 05:35:35
您不必爲每個displayobject添加Event.REMOVED。您只需將其添加到DisplayObjectContainer。當一個孩子被移除時,事件將到達容器,並且被移除的孩子將成爲event.target屬性。 – Roy 2011-03-14 08:32:55