我有一个节点列表,我将使用raphael对象绘制每个节点。我有以下循环:
for(var i=0; i<curNodes.length; i++){
var node = curNodes[i];
var obj = paper.rect(node.getX(), node.getY(), node.width, node.getHeight())
.attr({fill:nodes[i].getColor(), "fill-opacity": 0.6})
.click(function(e){ onMouseClicked(i,e); });
}
点击,我想调用一个函数,可以查看与第i个curNodes数组元素相关的数据。但是,始终将最后一个'i'传递给此函数。我的职责是:
var onMouseClicked = function(i, event){
switch (event.which) {
case 1:
this.attr({title: curNodes[i].name});
break;
}
}
调用函数时应该如何访问正确的索引?
答案 0 :(得分:3)
试试这个:
.click((function (i) {
return function (e) {
onMouseClicked(i,e);
};
})(i));
就像你注意到的那样,i
(或函数中的参数)的值是for
循环中的最后一个索引。这是因为click
事件不会立即发生 - 绑定会发生,但不会捕获i
的值。当click
处理程序实际执行时(以任何方式触发click
事件时),for
循环已完成(很久以前),并且值{ {1}}是循环的最终值。您可以使用上面的闭包来捕获i
的值。
虽然我知道另一种处理方式,但我认为更干净的是:
i
答案 1 :(得分:2)
这是因为closure变量i
。
for (var i = 0; i < curNodes.length; i++) {
(function(i) {
var node = curNodes[i];
var obj = paper.rect(node.getX(), node.getY(), node.width,
node.getHeight()).attr({
fill : nodes[i].getColor(),
"fill-opacity" : 0.6
}).click(function(e) {
onMouseClicked(i, e);
});
})(i);
}