在Actionscript 3.0中,如果对象成员调度了一个事件,我该如何访问包含该成员的对象?

时间:2010-06-22 06:16:54

标签: flash actionscript-3 events

我正在尝试设置菜单。因为这个菜单可以有不同数量的条目,所以我生成它而不是硬编码。 Menu对象包含一个MenuEntry对象数组,每个MenuEntry都有一个framework.Button对象,其中包含实际绘制到屏幕上的文本和框。我可以将ButtonEvent.Click事件添加到Button,但不能添加MenuEntry。但是,如果我这样做,我将无法访问包含该按钮的MenuEntry对象中的数据,因此我不知道单击了哪个MenuEntry。

我能想到的唯一解决方案是根据菜单项的数量,检查每个MenuEntry位置的鼠标位置。但这似乎不是正确的方法,因为它不可扩展。我尝试让MenuEntry类扩展Button类,所以从理论上讲,MenuEntry本身可以发送鼠标点击事件,但这不起作用。

1 个答案:

答案 0 :(得分:3)

如果MenuEntry个对象不是显示对象,您可以遍历MenuEntry数组,并比较该按钮是否与e.currentTarget相同,以找到MenuEntry点击了。

button.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent):void
{
  var t:DisplayObject = DisplayObject(e.currentTarget);
  var menuEntry:MenuEntry;
  for(var i:Number = 0; i < menuEntries.length; i++)
  {
    if(menuEntries[i].button == t)
    {
      menuEntry = t;
      break;
    }
  }
  trace(menuEntry);
}

如果MenuEntry项确实是显示对象,您可以从按钮的parent属性中获取对它们的引用

box.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent):void
{
  var t:DisplayObject = DisplayObject(e.currentTarget);
  trace(t);//traces box
  trace(t.parent);/* traces box's parent which can be 
                     the same as root if box is added
                     as child to the root */
  trace(t.root);//traces the root 
  traceParents(t);
}

traceParents(t:DisplayObject):void
{
  var p:DisplayObjectContainer = t.parent;
  while(p != null)
  {
    trace(p);
    p = p.parent;
  }
}