2011-03-07 44 views
0

我希望每次点击都与boxes表中正确的出现相关联。unique var per .click(function(){..});

var J = jQuery.noConflict(); 

const bNumber = 2; 
var boxes = new Array(bNumber); 

boxes[0] = new Array("#cch", "#cc"); 
boxes[1] = new Array("#sinh", "#sin"); 

for(var k=0;k<bNumber;k++) { 
J(boxes[k][0]).click(function() {   
    //J(boxes[k][1]).toggle(); 
}); 
} 

利用此解决方案,每个点击与boxes[2][1]

回答

2

相关联的JavaScript没有块范围,唯一的功能范围。这就是为什么在循环中创建函数很棘手。每一次关闭都会引用相同的变量(您的案例中的k)。在循环的最后一次迭代之后,k的值为2

要捕获循环计数器的当前值,必须引入一个新的作用域,即调用一个函数。例如。与立即功能

for(var k=0;k<bNumber;k++) { 
    (function(index) { 
     J(boxes[index][0]).click(function() {   
      J(boxes[index][1]).toggle(); 
     }); 
    }(k)); 
} 

另一种方法是创建生成单击处理函数:

function getClickHandler(element) { 
    return function() {element.toggle()}); 
} 

for(var k=0;k<bNumber;k++) { 
    J(boxes[k][0]).click(getClickHandler(J(boxes[k][1]))); 
} 

OT

你不应该使用new Array初始化数组。没有必要事先定义数组的大小。使用阵列的文字符号更简洁:

var boxes = [["#cch", "#cc"], ["#sinh", "#sin"]]; 
+0

作用域是**不是**在这种情况下的问题。见http://jsfiddle.net/mTK8S/在函数上下文中不能访问'k',所以闭包和词法范围在这里并不重要。 – jAndy 2011-03-07 10:47:05

+0

@jAndy:是的。在你的小提琴中,你不能访问点击处理程序中的'k'。但是OP有。请参阅http://jsfiddle.net/mTK8S/1/ – 2011-03-07 10:49:06

+0

@jAndy:那么评论线'// J(boxes [k] [1]).toggle()会怎么想呢? – 2011-03-07 10:50:51

0

尝试这种情况:

var J = jQuery.noConflict(); 

const bNumber = 2; 
var boxes = new Array(bNumber); 

boxes[0] = new Array("#cch", "#cc"); 
boxes[1] = new Array("#sinh", "#sin"); 

function toggleHandler(k) { 
    J(boxes[k][1]).toggle(); 
} 

for(var k=0;k<bNumber;k++) { 
J(boxes[k][0]).click(function() {   
    toggleHandler(k); 
}); 
} 
0

对于阅读和理解代码,所述目标框存储元件为“数据”上?

for(var k=0;k<bNumber;k++) { 
J(boxes[k][0]).data("box") = $(boxes[k][1]); 
J(boxes[k][0]).click(function() {   
    J(this).data("box").toggle(); 
}); 
} 
相关问题