0

我想要完成的事情:
我有一个对象数组,每个对象都有一个对 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();
    });
}
4

2 回答 2

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)
}

i 是按值传递的,并为这个动态定义的函数设置为本地,每次都会创建一个新的闭包。

于 2012-12-05T21:03:30.240 回答
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
}​
于 2012-12-05T21:00:41.173 回答