Ориентация на несколько кнопок и получение разных значений нажатием другой кнопки - PullRequest
1 голос
/ 08 августа 2011

Я хочу нацелить несколько кнопок и получить другое значение, нажимая другую кнопку.

Предположим, есть 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 Ответ

1 голос
/ 08 августа 2011

Вы почти у цели! Происходит следующее: ссылка на 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 вспомогательной функции, которая затем возвращает функцию-обработчик события. Таким образом, мы используем закрытие close сверх определенного значения i во время регистрации обработчика.

РЕДАКТИРОВАТЬ: Вот еще один немного другой способ организации вещей. Для каждой итерации вашего цикла вы можете вызывать функцию, которая регистрирует обработчик:

addHandler(i);
function addHandler(value:Number):void {
    target.addEventListener(MouseEvent.CLICK, targetFunc);
    function targetFunc(event:MouseEvent):void
    {
        trace(value);
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...