javascript - 每个 .click( function() {..} ) 都有唯一的 var;

标签 javascript jquery

我希望每次点击都与表框中的正确出现相关联。

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 没有 block 作用域,只有函数作用域。这就是为什么在循环中创建函数很棘手的原因。每个闭包都有对同一变量的引用(在您的情况下是 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])));
}
<小时/>

加类:

您不应该使用new Array来初始化数组。无需预先定义数组的大小。使用数组文字表示法更简洁:

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

关于javascript - 每个 .click( function() {..} ) 都有唯一的 var;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5218595/

相关文章:

jquery - jquery中textarea的字符数限制

javascript - 按数据属性滑入/滑出内容?

jquery - 如何在 jQuery 中使用 Transitionend?

javascript - 如何在不使用 CSS 的情况下隐藏 DIV?

Javascript/Node.JS 多次查找两个字符串之间的文本

javascript - 在 onChange 事件期间从子组件同时更新状态并调用父 onChange 处理程序

javascript - 有没有办法指定某些 HTML 内容不受 jQuery 管理?

javascript - 如何使用以下字典执行直方图?

javascript - 使用 jquery 更改打印样式(横向,纵向)

javascript - Jquery 从列表中删除元素