循环中的AS3 .addEventListener?

时间:2013-11-10 08:49:23

标签: actionscript-3 addeventlistener

我正在创建一行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);
    });
}

3 个答案:

答案 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)

@Shally Virk - 我的错。我在考虑MovieClip这是一个动态对象,所以它允许添加任意字段。你是对的,有很多方法可以解决这个问题,但你的建议很好。

答案 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);
    });
}

:)