动作脚本:以自动方式绑定事件侦听器时,只有列表中的最后一个才能正常运行..?

时间:2011-01-17 10:57:44

标签: actionscript-3 event-handling automation addeventlistener event-listener

这是一段代码:

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, 原始 对象包含一系列onclick,onmouseover等事件触发器。这意味着我可以根据该原始对象的属性自动附加事件侦听器。它似乎有效,因为我确实可以在DisplayObject的 listeners 属性中看到一些监听器函数,它们的数字对应于触发器的数量。但是后来当所有东西都被放到舞台上时,只会触发最后一个事件处理程序。

任何人都知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:2)

您的问题类似于this one.因为您将内联函数添加为eventlistener,clonevalue始终具有raw中最后一个值的值。

我认为这应该有效(未经测试):

object.addEventListener(map[name], function(cloneValue : String) : Function {
    return function(event:* = null) : void {
         execute(cloneValue, event);
    };
})(cloneValue);