我想要完成的任务:
我有一个对象数组,每个对象都有一个DOM节点的引用,我用.getNode()
调用。我正在尝试为数组中的每个对象分配一个事件处理程序,以便在单击时,alert()
为数组中的给定对象调用.name
。
我尝试了什么: 我已经为循环分配了事件,但是我遇到了关闭问题。我现在拥有它的方式,所有对象共享相同的事件(循环中的最后一个),当点击时,所有对象都给出相同的消息。
EventUtil
独立添加事件处理程序浏览器。它不应包含任何错误。
for (var i = 0; i < arrayWithObjects.length; i++) {
EventUtil.addHandler(arrayWithObjects[i].getNode(), "contextmenu", function(event){
event = EventUtil.getEvent(event);
event.preventDefault();
alert('right click on '+arrayWithObjects[i].name);
event.stopPropagation();
});
}
答案 0 :(得分:2)
for (var i = 0; i < arrayWithObjects.length; i++) {
(function(i){
EventUtil.addHandler(arrayWithObjects[i].getNode(), "contextmenu", function(event){
event = EventUtil.getEvent(event);
event.preventDefault();
alert('right click on '+arrayWithObjects[i].name);
event.stopPropagation();
});
})(i)
}
我按值传递,并为此定义的动态函数设置为本地,每次都创建一个新的闭包。
答案 1 :(得分:1)
这应该可以解决问题:
for (var i = 0; i < arrayWithObjects.length; i++) {
(function(obj) { // new function scope
EventUtil.addHandler(obj.getNode(), "contextmenu", function(event) {
event = EventUtil.getEvent(event);
event.preventDefault();
alert('right click on ' + obj.name);
event.stopPropagation();
});
})(arrayWithObjects[i]); // pass in current object
}