くれすの開発日記〔JavaScript編〕 このページをアンテナに追加 RSSフィード

2007-07-25ハマリました

[] 子ノードを全部消す 20:04  子ノードを全部消す - くれすの開発日記〔JavaScript編〕 を含むブックマーク はてなブックマーク -  子ノードを全部消す - くれすの開発日記〔JavaScript編〕  子ノードを全部消す - くれすの開発日記〔JavaScript編〕 のブックマークコメント

こんな単純なミスなのかと思う。

とりあえずFirefox 2.0で検証しただけなんだけど。

var html_ul = document.getElementById("foo");
if(html_ul.childNodes && html_ul.childNodes.length) {
    for(var i = 0; i < html_ul.childNodes.length; i++) {
        html_ul.removeChild(html_ul.childNodes[0]);
    }
}

これだと子ノードは全部消えません。このULに、仮に10個の子要素(この場合はLI)があったとすると、半分の5個しか消えません。

要するに、コレがいけないんです。

    for(var i = 0; i < html_ul.childNodes.length; i++) {

removeChildすると、html_ul.childNodes.lengthも減っていくため、iが増えてlengthが減るという奇妙な現象が起こる。

以下のコードならOK。

var html_ul = document.getElementById("foo");
if(html_ul.childNodes && html_ul.childNodes.length) {
    var length = html_ul.childNodes.length;
    for(var i = 0; i < length; i++) {
        html_ul.removeChild(html_ul.childNodes[0]);
    }
}

while(html_ul.childNodes.length) とか書いた方が良いのかなあ。

というか、removeAllChildren みたいなメソッドが欲しい。

fvxkvnxysfvxkvnxys2011/03/11 09:54mm8Ko1 <a href="http://pcrovyoqfums.com/">pcrovyoqfums</a>, [url=http://lsmkirexomok.com/]lsmkirexomok[/url], [link=http://pbbrdnuzmfpk.com/]pbbrdnuzmfpk[/link], http://mkwkspqgamvp.com/