我的问题如下:
我有一个由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经验/知识充其量是平均的,我很想学习一些新技术来完成我想要做的事情。如果需要,我还可以提供更多信息。
谢谢!
答案 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对来读/写嵌套文本字段的文本。
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
应该这样做......