有没有办法检测何时从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