0

私はこのコードを持っています:

var table = document.getElementById("editTable");
var row = table.insertRow(-1);
var i = row.rowIndex;

var remove = document.createElement("input");
    remove.type = "button";
    remove.value = "Remove";
    remove.onclick = (function() {
        var I = i;
        return function() {
            table.deleteRow(I);
        }
    })();

var td1 = row.insertCell(-1);
td1.appendChild(remove);

ここでいくつかの記事を読みましたが、何が間違っているのかわかりません。作成した最後の行を削除しようとすると、次のエラーが発生します。

IndexSizeError: Index or size is negative or greater than the allowed amount
table.deleteRow(I);

これは閉鎖の問題だと確信しています。スコープは理解していますが、javascript の無名関数の構文は理解していません。

4

3 に答える 3

1

ここで、関数/匿名関数/クロージャ全体を考えすぎていると思います。少し複雑すぎるようです。このコードを試してください:

var table = document.getElementById("editTable");
var row = table.insertRow(-1);

var remove = document.createElement("input");
//Append input first so you can get it's parent
var td1 = row.insertCell(-1)
             .appendChild(remove);

remove.type = "button";
remove.value = "Remove";

remove.onclick = function () {
    var parent = this.parentNode.parentNode; //get the row node
    table.deleteRow(parent.rowIndex - 1); //Delete the row index behind it.
};

jsフィドル

于 2013-06-14T02:04:52.270 に答える
1

コーリー、あなたは実用的な解決策を持っているようですが、元のアイデアに近いものに興味があるかもしれません.

元のコードの問題は、i他の行が削除された後、現在の行インデックスの信頼できない測定値になることです。クロージャでトラップiすることは解決策ではありません。トラップされたときにのみ正しいことが保証されている値をトラップするだけです。

ただし、行がテーブルに追加されたときのインデックスではなく、現在のインデックスを提供するため、それ自体をトラップし、必要なときにrow取得することは信頼できます。row.rowIndexrow.rowIndex

remove.onclick = (function(row) {
    return function() {
        table.deleteRow(row.rowIndex);
    };
})(row);
于 2013-06-14T11:54:52.687 に答える
0

ここにコードが機能しています:

var remove = document.createElement("input");
    remove.type = "button";
    remove.value = "Remove";
    remove.onclick = function () {
        var parent = this.parentNode.parentNode; //get the row node
        table.deleteRow(parent.rowIndex); //Delete the row index behind it.
    };

    var td1 = row.insertCell(-1)
         .appendChild(remove);
于 2013-06-14T03:05:27.707 に答える