MovieClips和e.target,检索内部文本

时间:2012-10-07 05:26:07

标签: actionscript-3 flash

我的问题如下:

我有一个由MovieClip组成的菜单,其中包含一个动态文本框(text_txt)和一个基本的背景矩形。

我已经为实例名称(item1_mc等)定义了每个项目,它们是MouseEvent.CLICK的事件监听器,方法是将所有项目名称放入一个数组中,然后循环遍历它。

var menuItemsArray:Array = [item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12];

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text_txt.text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

...然后使用:

确定哪个被按下(并从中删除文本)
function menuItem_click(e:MouseEvent){
    unit_name = e.target.text;
    }

...如果我直接点击MovieClip中的TextField(返回文本),一切正常,但是如果我点击MovieClip的边缘(并且在动态文本框的区域之外)它只返回错误#2007,因为它试图从[object menuItem_button_23]中提取不包含文本的文本。

理想情况下我想要发生的是,无论我在哪里点击MovieClip'按钮',我都会删除文本,但我已经尝试了包括e.currentTarget,e.target和两者的组合在内的所有内容。使用.text,.text_txt.text等 - 但一切都以同样的问题结束,即在外面有一个“死区”。

此外,基本上我要做的是创建一个MovieClip'按钮'菜单,它由包含标签文本的数组标记(通过内部文本字段)。然后,当我单击按钮时,我想确定按下哪个按钮,并检索标签以允许我访问与所述标签文本相关的更多信息。

如果有人有解决方案,或者我正在尝试做的更好的方式,我会全力以赴。应该注意我的AS3经验/知识充其量是平均的,我很想学习一些新技术来完成我想要做的事情。如果需要,我还可以提供更多信息。

谢谢!

3 个答案:

答案 0 :(得分:0)

您必须检查目标是否实际上是TextField。如果不是,那么你必须在里面引用text_txt。

function menuItem_click(e:MouseEvent){
    if (e.target is TextField) unit_name = e.target.text;
    else {
        if (e.target.text_txt) unit_name=e.target.text_txt.text; 
        else unit_name='';
    }
}

首先检查事件的实际目标是什么。如果它是一个TextField,那么你点击它,所以让我们采取它的文本。如果没有,那么它应该是一个MovieClip,我们检查它是否分配了“text_txt”属性,因为如果是,它将是一个TextField,所以我们从中获取文本。

答案 1 :(得分:0)

你还可以做的是在动画片段上切换mouseChildren并在其上定义一个getter / setter对来读/写嵌套文本字段的文本。

在Flash库的MovieClip中,将以下代码写入剪辑的一个图层

this.mouseChildren = false;

function get text():String { return text_txt.text; }
function set text(value:String):void { text_txt.text = value; }

第一行禁用动画片段的任何子项作为鼠标事件的目标,并单击动画片段可见区域的某个位置,触发click - 事件,其target属性设置为动画片段。这统一了您处理事件的方式。

getter / setter对封装了对文本字段text属性的访问权限,因此无需从影片剪辑外部读取/写入text_txt

您的事件监听器应该与您预期的一样

function menuItem_click(e:MouseEvent):void {
    unit_name = e.target.text;
}

此外,使用这种方式,在初始化期间无需直接访问text_txt。您可以稍微简化for循环并写入:

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

希望这是一个最符合您需求的解决方案。告诉我,如果你有任何问题,或者如果忘记了什么。 ;)

答案 2 :(得分:0)

应32bitkid的要求,我发布了我以前的评论作为答案:

尝试使用e.currentTarget。 使用e.target可以获得CLICK事件源自显示列表的原始项目。由于CLICK是一个冒泡事件,它通常不是您所指的MovieClip,而是MovieClip的内部对象(因此e.target仅在您实际单击TextField时在您的示例中工作)。如果你使用e.currentTarget,你正在做的是检索你添加事件的对象,在这种情况下是外部MovieClip,所以e.currentTarget.text_txt.text应该这样做......