如何确定事件将捕获/冒泡的显示对象层次结构?

时间:2011-06-07 00:52:29

标签: flash flex actionscript-3 events

在Actionscript 3中,是否有任何方法可以确定事件在从给定对象调度时将遍历的精确显示对象层次结构?该对象不一定是显示对象。

虽然我可以想象这实际上是有用的,但在我的特殊情况下,这是一个学习练习。我正在尝试在flash中掌握事件系统并且有一些位置,我很好奇当我发送它时事件将采取什么路径。

2 个答案:

答案 0 :(得分:2)

绝对有办法。 Flash有一些方便的功能/属性可以促进这一点。

因为所有扩展**另一个类的flash对象(如DisplayObject)都有一个父属性,所以你可以简单地写:

import "flash.utils.getQualifiedClassName";

var bubblePath:String = "";

var parentObject:* = parent;
while( parentObject ) {
    bubblePath += getQualifiedClassName( parentObject ) + "\n";
    parentObject = parentObject.parent;
}

trace( bubblePath );

这将为您提供一个包含所有类名称的字符串。我不确定这是否是您在实验中寻找的内容,但根据需要修改输出并不困难。

答案 1 :(得分:1)

答案是那样的。事件不限于DisplayObjects,当它们由DisplayObjects触发时,它们并不总是遵循相同的模式 - 事件可能基于什么类型的DisplayObject以及事件是否以编程方式(通过dispatchEvent)或本机触发(通过鼠标点击)。它也可能根据是否启用冒泡以及是否为自定义事件而有所不同。例如,Loader的complete事件传播到父对象没有意义,即使Loader是显示对象。

如果你想弄清楚发送事件的对象的父母,那么你会想要这样的东西:

import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
myDispatcher.addEventListener( MouseEvent.CLICK, clickHandler );

function clickHandler( event:MouseEvent ):void
{
    // event.currentTarget is the object which you're listening to.
    // event.target is the object which actually dispatched the event
    // (if you're listening to a MovieClip and a button inside it is clicked,
    // target will refer to the button, currentTarget the MovieClip)
    var ancestry:Vector.<DisplayObjectContainer> = getAncestry( event.currentTarget as DisplayObject );
    // do somethign with all of the parents.

}

// this function takes a DisplayObject and returns all of its ancestor objects 
// all the way to the root as a Vector.
function getAncestry( obj:DisplayObject ):Vector.<DisplayObjectContainer>
{
    var par:Object = obj.parent;
    var ancestry:Vector.<DisplayObjectContainer> = new Vector.<DisplayObjectContainer>();
    while( par )
    {
        par = par.parent;
        ancestry.push( par as DisplayObject );
        if( par == root ) break;//sometimes the root has a parent.
    }
    return ancestry;
}