0

重複の可能性:
Javascript ループ内のイベント ハンドラー - クロージャーが必要ですか?

表のセルに href があります
これらのセルを「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);
    };
  }

何が間違っている可能性がありますか?

4

1 に答える 1

8
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);
  }

上記のコードは機能するはずです。あなたの場合、 Basiclyでi定義されたクロージャーがあるため、機能しません。これは、定義されたポイントに渡され、その時点でMyコードは、ループのサイクルごとに新しいクロージャーを作成します。詳細については、googlejavascriptクロージャ。for (var i = 0ideleteRowsifortbl.rows.length

于 2013-01-15T17:10:41.990 に答える