1

我正在创建一系列Sprite元素。每个精灵元素都有不同的工作,当它被点击时。如何使函数内的函数addEventListener知道单击了哪个按钮?

在这种情况下,当它被点击时的traced值为。这是错误的,因为 6 只是数组的最后一个元素。其他人呢,开始?ialways 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);
    });
}
4

3 回答 3

3

构建应用程序并添加侦听器时,循环已经执行,因此到用户最终单击按钮时,索引“i”将始终为 6。要区分不同的项目,请使用它们的“名称”属性(DisplayObject 的属性),如图所示......尽量不要将侦听器函数作为循环中的方法闭包,而是这样做:

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;
        .
        .
    }
}
于 2013-11-10T09:01:42.563 回答
0

@Shally Virk - My mistake. I was thinking of MovieClip which is a dynamic object so it allows adding arbitrary fields. You are right, there are lots of ways to get around this problem, but your suggestion works fine.

于 2013-11-12T01:03:52.917 回答
0

虽然原因我不清楚,但答案更简单一些,

事件已正确注册,但 flash 采用最后一个计算值。知道我们可以解决。
解决方法可以像 Shaly Virk 所写的那样做,但这往往会在更大范围内变得混乱。所以我们想要一些更通用和简单的东西。
下面是考虑到这一点的步骤:

1. 我们知道 sprite 不是动态的,所以我们创建类来扩展 sprite 并使其动态化。由于该类基本上有 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);
    });
}

:)

于 2014-01-08T12:13:06.113 回答