Сценарий действия: при автоматическом связывании прослушивателей событий только последний из списка становится функциональным ..?

Вот фрагмент кода:

protected function handleTriggers(raw:Object) : void
{
    var name:String, value:String, map:Object;

    map = {
            'onclick':      MouseEvent.CLICK,
            'ondblclick':   MouseEvent.DOUBLE_CLICK,
            'onmousedown':  MouseEvent.MOUSE_DOWN,
            'onmouseup':    MouseEvent.MOUSE_UP,
            'onmouseleave': MouseEvent.ROLL_OUT,
            'onrollout':    MouseEvent.ROLL_OUT,
            'onmouseenter': MouseEvent.ROLL_OVER, 
            'onrollover':   MouseEvent.ROLL_OVER,
            'onmouseover':  MouseEvent.MOUSE_OVER,
            'onmouseout':   MouseEvent.MOUSE_OUT,
            'onmousemove':  MouseEvent.MOUSE_MOVE
    };

    for (name in raw) 
    {
        value = raw[name];
        if (name in map) {
            var cloneValue:String = value;
            object.addEventListener(map[name], function(event:* = null) : void {
                execute(cloneValue, event); 
            });
        }
    }
}

объект является универсальным DisplayObject, а raw объект содержит серию триггеров событий onclick, onmouseover и т. д. Это означало, что я мог автоматически присоединять прослушиватели событий, следуя свойствам этого необработанного объекта. И похоже, что это работает, поскольку я действительно вижу некоторые функции прослушивателя в свойстве listeners объекта DisplayObject, и их количество соответствует количеству триггеров. Но позже, когда все будет запущено, запускается только последний обработчик событий.

Кто-нибудь знает, почему это может происходить?


person jayarjo    schedule 17.01.2011    source источник


Ответы (1)


Ваша проблема похожа на эту. Потому что вы добавить встроенную функцию в качестве слушателя событий, clonevalue всегда имеет значение последнего значения в raw.

Я думаю, это должно сработать (непроверено):

object.addEventListener(map[name], function(cloneValue : String) : Function {
    return function(event:* = null) : void {
         execute(cloneValue, event);
    };
})(cloneValue);
person maxmc    schedule 17.01.2011
comment
Это не сработало, но я понял, поэтому я просто переместил логику addEventListener в отдельную функцию, и она сработала. Спасибо. Если вы отредактируете свой ответ или подтвердите его, я приму его как правильный. - person jayarjo; 17.01.2011
comment
я забыл вызвать функцию с параметром cloneValue в качестве параметра;) теперь она должна работать ... - person maxmc; 17.01.2011