【问题标题】:Assign onclick function in a loop does not work in JavaScript [duplicate]在循环中分配 onclick 函数在 JavaScript 中不起作用 [重复]
【发布时间】:2013-01-15 17:03:39
【问题描述】:

可能重复:
Event handlers inside a Javascript loop - need a closure?

我在表格单元格中有 hrefs
我正在使用 'for' 循环 遍历这些单元格以更改 onclick 功能。
但这不起作用。
这里有 2 个例子:

有效

for (var i = 0; i < tbl.rows.length - 1; i++) { // for each row
    var len = document.getElementById("my_table").rows[i].cells.length-1;
    document.getElementById("my_table").rows[i].cells[len].innerHTML = "X1";
  }

不起作用

for (var i = 0; i < tbl.rows.length; i++) { // for each row
    var len = document.getElementById("my_table").rows[i].cells.length-1;
    document.getElementById("my_table").rows[i].cells[len].onclick = function() {
        deleteRows(i);
    };
  }

可能出了什么问题?

【问题讨论】:

    标签: javascript function for-loop onclick


    【解决方案1】:
    for (var i = 0; i < tbl.rows.length; i++) { // for each row
        var len = document.getElementById("my_table").rows[i].cells.length-1;
        document.getElementById("my_table").rows[i].cells[len].onclick = (function(index) { return function() {
            deleteRows(index);
        };})(i);
      }
    

    上面的代码应该可以工作。在您的情况下,它不起作用,因为您在for (var i = 0 中定义了i 的闭包基本上,您传递给deleteRowsi 指向ifor 中定义的i,此时将是相等的到tbl.rows.length 我的代码为每个循环循环创建新的闭包。欲了解更多信息谷歌 javascript 关闭。

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2018-03-19
      • 2011-06-29
      相关资源
      最近更新 更多