REMOVED_FROM_STAGE处理程序仍然将对象列为显示列表,为什么?

时间:2012-10-11 17:15:36

标签: actionscript-3 addeventlistener removechild

错误/特征:

  1. 创建一个精灵
  2. 将其添加到显示列表
  3. 向精灵添加REMOVED_FROM_STAGE侦听器
  4. 删除精灵
  5. 处理程序功能INCORRECTLY仍然报告仍在显示列表中
  6. 这是我面临的一个问题,作为更复杂的应用程序的一部分,但我把它缩小到这里的基础。当处理程序触发REMOVED_FROM_STAGE时,currentTarget仍然显示在显示列表中。我需要能够检测它和其他对象是否在此函数的显示列表中,但是在处理程序完成其操作之前,看起来有关currentTarget的所有信息都是不正确的。起初我认为这是一个渲染或框架问题,但我的输出显示它实际上更多的是remove()命令内部发生的问题。没有一个kludge解决方案,有人能够了解为什么会发生这种情况吗?

    import flash.display.Sprite;
    import flash.events.Event;
    
    var sprite:Sprite = new Sprite();
    addChild(sprite);
    sprite.addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
    removeChild(sprite);
    output();// shows it has been removed. No parent, no stage
    
    function removedFromStageHandler(event:Event):void{
            output();// Still in displaylist? Has parent and stage
    }
    
    function output():void{
        trace("object = " + sprite);
        trace("  parent = " + sprite.parent);
        trace("  stage = " + sprite.stage);
    }
    

    注意:ADDED_TO_STAGE不存在这种奇怪的行为,因为对象在处理程序中报告其属性是正确的。

1 个答案:

答案 0 :(得分:1)

来自adobe docs:

removedFromStage事件 在即将从显示列表中删除显示对象时调度,更多信息here

因此它是预期的行为,事件在项目从阶段中删除之前调度,当调度完成时,元素被删除。这允许您在删除项目之前执行诸如运行操作之类的操作,甚至可以根据某些条件阻止删除。