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 に答える