unique var per .click(function(){..});
问题描述:
我希望每次点击都与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]
答
相关联的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"]];
答
尝试这种情况:
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);
});
}
答
对于阅读和理解代码,所述目标框存储元件为“数据”上?
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();
});
}
作用域是**不是**在这种情况下的问题。见http://jsfiddle.net/mTK8S/在函数上下文中不能访问'k',所以闭包和词法范围在这里并不重要。 – jAndy 2011-03-07 10:47:05
@jAndy:是的。在你的小提琴中,你不能访问点击处理程序中的'k'。但是OP有。请参阅http://jsfiddle.net/mTK8S/1/ – 2011-03-07 10:49:06
@jAndy:那么评论线'// J(boxes [k] [1]).toggle()会怎么想呢? – 2011-03-07 10:50:51