removeChildではまる

NodeListのノードをremoveChildで順番に消していこうとしたら、半分くらい残る。なぜ。

var tbody = document.getElementsById("hoge");
var nodelist = tbody.getElementsByTagName("tr");

var len = nodelist.length; for (var i = 0; i < len; i++) { tbody.removeChild(nodelist[i]); }

上手く説明できないけど、nodelistの数値インデックスの関係がおかしくなっている。getElementsByTagNameが返すNodeListは参照で、ノードを削除していくごとに、動的にNodeListの長さも変わっていくのかな。だから、削除していくと、「そんな数字インデックスに該当するノードは無いよー」ってなってるっぽい。

ということで、ノードの削除は、常にNodeListの先頭のものを対象に実行するとキレイに行く。

while (nodelist.length > 0) {
    tbody.removeChild(nodelist[0]);
}

仕組みが分かれば、そりゃそうだって話なんだよね。リスト操作の基本か。こういうこと考えると、Iteratorがあると便利なのかもしれない。

prototype.js を使えるなら、

  $A(nodelist)

ってすれば、Iteratorアクセスが可能なんだった。気付くの遅すぎ。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/445