我想通过点击不同的按钮来定位多个按钮并获得不同的价值。
假设有3个按钮:“button01”,“button02”,button03“。
这是我的代码:
var targetArr:Array = ["button01","button02","button03"];
for (var i:int = 0; i < targetArr.length; i++)
{
var target = getChildByName(targetArr[i]);
target.addEventListener(MouseEvent.CLICK, targetFunc);
function targetFunc(event:MouseEvent):void
{
trace(i);
}
}
不是通过点击不同的按钮获得不同的值,而是经常得到“3”作为值。 我想:点击“button01”将得到“0”作为值,点击“button02”将得到“1”作为值,点击“button03”将得到“2”作为值。怎么做?
答案 0 :(得分:1)
你快到了!发生的事情是所有事件处理程序共享对i
的引用。您想要的是在注册事件处理程序时i
的值的独特副本。
为此,您可以为循环的每次迭代创建一个新闭包。
var targetArr:Array = ["button01","button02","button03"];
for (var i:int = 0; i < targetArr.length; i++)
{
var target = getChildByName(targetArr[i]);
target.addEventListener(MouseEvent.CLICK, getTargetFunc(i));
function getTargetFunc(value:Number):Function {
return function(event:MouseEvent):void {
trace(value);
}
}
}
现在发生的是我们将i
的特定值传递给辅助函数,然后返回事件处理函数。这样我们在注册处理程序时就使用了一个闭包来关闭而不是i
的特定值。
编辑:这是另一种略微不同的排列方式。对于循环的每次迭代,您可以调用一个注册处理程序的函数:
addHandler(i);
function addHandler(value:Number):void {
target.addEventListener(MouseEvent.CLICK, targetFunc);
function targetFunc(event:MouseEvent):void
{
trace(value);
}
}