removeChildでIEが落ちる


0   名前: ラマ : 2006/05/05(金) 15:58  ID:ya6xOqUo
あるノードの下のノードを全て削除する関数を作ったのですが、
この関数を実行するとIE5(ブラウザ自体)が、「内部エラーにより、ウィンドウが1つ強制終了されます」で
落ちてしまいます。

IE6やNNでは問題なく、また、alert()をremoveChildの直後に挿入すると
動作するようになります。

function DeleteAllChild(id)
{
 var obj=document.getElementById(id);
 while(obj.childNodes.length>0)
 {
  obj.removeChild(obj.childNodes[0]);
 }
}

回避方法をご存知の方、ご教授よろしくお願いいたします。

1   名前: Pid ◆byEkK9OALr : 2006/05/05(金) 15:58
WinIE 5.0 なのか WinIE 5.5 なのか MacIE 5.x なのかで,話が全然違ってくると思いますが。

とりあえず,確認してませんが,WinIE 5.5 ではノード操作に描画が追い付かなくなると落ちたような記憶があります(記憶違いかもしれません)。ですから,

・対象ノードをいったん document から切り離して,処理後に復帰。
・対象ノードを cloneNode し,複製の方を処理してから replaceChild。
・setTimeout で間隔を微調整。
・obj.innerHTML = '' (まあ,できれば避けた方が良いでしょうが)


> while(obj.childNodes.length>0)

while (obj.hasChildNodes ()) で良いのでは……と思ったのですが,WinIE5.x は対応してないんでしたっけ。


なお,Mozilla/Firefox,Opera,Safari は DOM2-Range が使えますので,
var r = document.createRange ();
r.selectNodeContents (obj);
r.deleteContents ();

の方が速いし負荷も少ないです。

2   名前: ラマ : 2006/05/05(金) 15:58  ID:ya6xOqUo
Pid様

回答ありがとうございます。
勉強になります。

いろいろやってみて、
(避けたほうが良いとご指摘のあった)
innerHTMLを使用して、削除を行わないようにしました。

追加の質問で申し訳ないのですが、
innerHTMLを避ける理由を教えていただけないでしょうか。

(ちなみに問題のブラウザはIE5.0です。)

3   名前: Pid ◆byEkK9OALr : 2006/05/05(金) 15:58
> innerHTMLを避ける理由

単純に,どんなことでもできてしまうからです(妥当でないツリー構造や,破壊的な結果になっても,エラーを吐かない)。

もちろん,使った方が効率が良い/使う以外に方法が無いという場合もありますので,ケース・バイ・ケースだと思います。

4   名前: ラマ : 2006/05/05(金) 15:58  ID:ya6xOqUo
致命的な欠陥じゃなくて良かったです。
innerHTMLにもろもろ書き換えてしまったので・・。

回答いただき、大変感謝です。
ありがとうございました。

一覧へ戻る