使用事件处理程序访问按钮内的动态文本字段

时间:2011-02-10 11:05:17

标签: flash actionscript-3

我有一个看似简单的任务,但我似乎无法弄明白。我正忙着在ActionScript 3中创建一个项目,虽然我在ActionScript 2中相当流利,但我在这里有点难过。

我在按钮对象中有一个简单的动态文本字段。此文本字段的名称为txt_title。我已经附加事件处理程序来在它们悬停时更改按钮的alpha值,但是我还想在悬停时更改按钮内文本字段的值。我的事件监听器如下所示:

function hoverHandler(Event:MouseEvent):void{
   var object:Object = Event.target;
   var txt:TextField = object.txt_title;
   txt.text = "TEST";
   object.alpha = 1;
}

alpha工作正常,但是在尝试操作文本字段时我一直收到以下错误:

ReferenceError:错误#1069:在flash.display.SimpleButton上找不到属性txt_title,并且没有默认值。在main_fla :: MainTimeline / hoverHandler()

对此问题的任何亮点都将不胜感激,

西蒙

2 个答案:

答案 0 :(得分:1)

事件是一个类名,将其更改为小写,以确保您没有名称空间问题。

此外,请确保您使用的是正确的对象。我添加了一个trace语句来查看toString方法的含义。当你知道它是什么对象类型时,你应该这样抛出它,这样你就可以看到它在编译时有什么属性,而不是在运行时。 (我把它命名为简单的按钮,因为这就是错误所说的。)

function hoverHandler(event:MouseEvent):void{
   trace(event.target);
   var object:SimpleButton = event.target as SimpleButton;
   var txt:TextField = object.txt_title;
   txt.text = "TEST";
   object.alpha = 1;
}

以上考虑,此代码仍然无效。您已将事件侦听器附加到SimpleButton对象。我在as2中并不是那么出色,但看起来你是用python或javascript心态编程的。在运行时将属性添加到对象将不起作用。

获取文本字段的另一种方法是查看 DisplayContainer 。你可以这样做:

for(var i:uint = 0; i < sb.numChildren ; i++)
{
 trace(sb.getChildAt(i));
}

DisplayContainer 中找到TextField后,您就可以执行要执行的操作。

答案 1 :(得分:1)

可能是,event.target返回触发事件的对象中的DisplayObject。

有两种方法可以防止这种情况发生:

按钮内的

声明:

mouseChildren = false;

或在EventListener中引用具有currentTarget的对象:

var object : SimpleButton = event.currentTarget as SimpleButton;

也可能是,您的txt_title TextField不是公开的,而是私有的。

textField也必须位于SimpleButton的基础中。如果它在另一个容器Object中进一步嵌套,它将无法工作。