这是一段代码:
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 属性中看到一些监听器函数,它们的数字对应于触发器的数量。但是后来当所有东西都被放到舞台上时,只会触发最后一个事件处理程序。
任何人都知道为什么会发生这种情况?
答案 0 :(得分:2)
您的问题类似于this one.因为您将内联函数添加为eventlistener,clonevalue
始终具有raw
中最后一个值的值。
我认为这应该有效(未经测试):
object.addEventListener(map[name], function(cloneValue : String) : Function {
return function(event:* = null) : void {
execute(cloneValue, event);
};
})(cloneValue);