2011-03-13 25 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"); 
}