26

重複の可能性:
複数の要素でremove()を使用する

タグ名が「label」の要素をすべて削除しようとしています。私は次のコードを持っています。ある程度は機能しますが、削除されるラベルは1つだけです。他の5つはまだ残っています。コードを変更してすべての「ラベル」タグを削除するにはどうすればよいですか?

element = document.getElementsByTagName("label");
for (index = 0; index < element.length; index++) {
    element[index].parentNode.removeChild(element[index]);
}
4

5 に答える 5

50
var element = document.getElementsByTagName("label"), index;

for (index = element.length - 1; index >= 0; index--) {
    element[index].parentNode.removeChild(element[index]);
}
于 2012-12-22T14:26:48.297 に答える
36

問題は、ではなくをdocument.getElementsByTagName()返すことです。内にある DOM から要素を削除すると、a のコンテンツ、つまり長さが更新されます。そのため、最初の要素を削除すると、が短くなり、新しい最初の要素が0を占めます。したがって、ループ内で更新すると、少なくとも 1 つの要素が失われ、結果の長さによってはさらに多くの要素が失われる可能性があります。NodeListArrayNodeListNodeListNodeListindexindex

次のようなことを試してください:

var elements = document.getElementsByTagName('label')
while (elements[0]) elements[0].parentNode.removeChild(elements[0])
于 2012-12-22T14:31:20.683 に答える
4

ドキュメントからノードを削除すると、取得したばかりのノードのリストgetElementsByTagName()も更新されて参照が残るのを避けるため、最初のノードを削除し続ける必要があります。

var nodes = document.getElementsByTagName("label");

for (var i = 0, len = nodes.length; i != len; ++i) {
    nodes[0].parentNode.removeChild(nodes[0]);
}

ここでは、 の値nodes.lengthがキャッシュされます。そうしないと、減少し続け、半分だけを削除することになります:)

于 2012-12-22T14:31:11.303 に答える
2

「問題」はLive NodeList.getElementsByTagName()を返すことです。したがって、ヘッド (最初の) エントリを削除すると、テールがいっぱいになり、いわば左に移動します。

これが期待どおりに機能する実際のJavascript配列ではありません。このような凍結された配列を作成するには、次のようにします

var element = Array.prototype.slice.call(document.getElementsByTagName("label"),0); 

for (var index = 0, len = element.length; index < len; index++) {
    element[index].parentNode.removeChild(element[index]);
}
于 2012-12-22T14:34:47.150 に答える
2

なぜjQueryを使わないのですか? それなら単純に

$("label").remove();
于 2012-12-22T15:39:23.843 に答える