通过单击不同的按钮来定位多个按钮并获得不同的值

时间:2011-08-08 05:39:49

标签: flash actionscript-3

我想通过点击不同的按钮来定位多个按钮并获得不同的价值。

假设有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”作为值。怎么做?

1 个答案:

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