我正在创建一行Sprite
元素。单击时,每个sprite元素都有不同的作业。如何在addEventListener
中创建函数以了解单击了哪个按钮?
在这种情况下,traced
的{{1}}价值为i
时为always 6
。这是错误的,因为6只是数组的最后一个元素。那么其余的呢,一开始呢?
for (var i:int = 0; i < 6; i++) {
var barPart:Sprite = new Sprite();
barPart.x = i * (30);
barPart.y = 0;
barPart.graphics.beginFill(0x000000, 0.2);
barPart.graphics.drawRect(0, 0, 10, 10);
barPart.graphics.endFill();
barPart.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent):void {
trace(i);
});
}
答案 0 :(得分:3)
当构建应用程序并添加侦听器时,循环已经执行,因此当用户最终单击按钮时索引“i”将始终为6。 要区分不同的项目,请使用它们的“name”属性(DisplayObject的prop),如图所示...... 尽量不要将侦听器函数作为循环中的方法闭包,而是执行此操作:
for (...)
{
... code
barPart.name = "barPart-" +i;
barPart.addEventListener(MouseEvent.CLICK, barPart_clickHandler);
}
并实现函数(单独的事件处理程序),如:
private function barPart_clickHandler(e:MouseEvent):void
{
// the event's target will let you know who dispatched the function
var name:String = Sprite(e.currentTarget).name;
name = name.replace("barpart-", "");
switch(name)
{
case '0':
// your code
break;
.
.
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
虽然我不清楚原因,但答案稍微简单一点,
事件已正确注册,但flash采用最后计算的值。
知道我们可以解决。
你可以像Shally Virk写的那样解决问题,但这种做法往往会在更大范围内引起混淆。所以我们想要更通用和简单的东西。
现在,这是考虑到这一点的步骤:
1.我们知道精灵不是动态的,所以我们让类来扩展spirte并让它变得动态。由于该类基本上有0个代码,唯一的区别是动态,添加的内存量很小
2.在这里上课是代码:
for (var i:int = 0; i < 6; i++) {
var barPart:CustomSprite = new CustomSprite();
barPart.x = i * (30);
barPart.y = 0;
barPart.graphics.beginFill(0x000000, 0.2);
barPart.graphics.drawRect(0, 0, 10, 10);
barPart.graphics.endFill();
barPart.i = i;
barPart.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent):void {
trace(_event.currentTarget.i);
});
}
:)