检测从DisplayObjectContainer中删除子项的方法?

时间:2011-03-13 21:08:18

标签: flash actionscript-3

有没有办法检测从DisplayObjectContainer中删除子项的时间?我尝试重写removeChild(),但是当通过将子项添加到另一个容器(通过在新容器上调用addChild())删除子项时,这似乎不会触发。我不知道任何触发事件......

我知道您可以使用更高级别的Flex类来执行此操作,但我正在使用Pure AS3项目。

2 个答案:

答案 0 :(得分:5)

<强>更新
正如Roy在评论中指出的那样,因为事件(包括Event.REMOVED)bubble up,然后简单地将REMOVED事件的事件监听器添加到DisplayObjectContainer就足够了;当从容器中移除任何子对象时,它将被调用(即使它是因为该对象被添加到另一个容器中)。

事件的target属性将是要删除的子项,currentTarget将始终是容器本身。

请注意,如果整个容器本身已从容器中删除,则此事件也会触发;一个简单的if (e.target == e.currentTarget) return;应该处理这种情况。

以下原始答案:


您可以为添加到DisplayObject的每个DisplayObjectContainer添加Event.REMOVED event的事件监听器。然后,对象本身会告诉您它已被删除,而不必依赖DisplayObjectContainer进行通知。

如果在将对象从一个容器移动到另一个容器时也不会触发,那么作为一种变通方法,您还可以侦听ADDED事件,并在触发时检查显示对象是否仍在容器中。

一旦从容器中删除对象,不要忘记删除事件侦听器,否则最终会导致内存泄漏,对同一对象的事件侦听器的多次调用等。

答案 1 :(得分:-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");
}