Flash AS3 AddEventListener 参数使用循环

Flash AS3 AddEventListener with Parameter using loop

我的场景中有 34 个按钮,如果我单击其中任何一个,就会出现一个 MovieClip,并根据我按下的按钮跳转到 (gotoAndStop) 帧。

import flash.events.Event;
import flash.events.MouseEvent;

stop();
MC.visible = false;

var btns:Array = new Array(
prov1, prov2, prov3, prov4, prov5, prov6, prov7, prov8, prov9, prov10,
prov11, prov12, prov13, prov14, prov15, prov16, prov17, prov18, prov19, prov20,
prov21, prov22, prov23, prov24, prov25, prov26, prov27, prov28, prov29, prov30,
prov31, prov32, prov33, prov34
);

for(var i:int = 0; i < 34; i++)
{
    btns[i].addEventListener(MouseEvent.CLICK, function(e:Event):void{OpenDetail(i+1)});
    trace(i);
}

function OpenDetail(frame:int)
{
    MC.visible = true;
    MC.gotoAndPlay(1);
    MC.MSC.gotoAndStop(frame);
}

在上面的代码中,如果我单击 prov1,它将打开 MC.MSC 并转到第 1 帧,如果我单击 prov2 它将打开 MC.MSC 转到第 2 帧,等等

但真正发生的是,当我单击上面的 任何 按钮时,MC.MSC 被打开但 转到第 34 帧.

我哪里做错了?任何帮助将不胜感激。谢谢

你的错误是不理解闭包(未命名的未绑定函数)是什么以及它是如何工作的。问题是,您的 i 迭代器转到 34,您创建的所有闭包都从变量引用中读取 i 值,而不是使用 i 创建时的值。

相反,您应该执行以下操作:

for (var i:int = 0; i < 34; i++)
{
    btns[i].addEventListener(MouseEvent.CLICK, onClick);
}

function onClick(e:MouseEvent):void
{
    // Get reference to the clicked button.
    var aBut:DisplayObject = e.currentTarget as DisplayObject;

    // Option 1: figure its index within the list.
    var anIndex:int = btns.indexOf(aBut) + 1;

    // Option 2: figure its index from the button's name.
    var anIndex:int = int(aBut.name.substr(4));

    // Go to the relevant frame.
    OpenDetail(anIndex);
}