3

私はこの単純なスクリプトでFirefoxの奇妙な振る舞いに遭遇しました:

    <html>
      <head>
        <script type="text/javascript">
            window.setTimeout(function(){
                var ifr=document.createElement("iframe");
                ifr.src="about:blank";
                document.body.appendChild(ifr);
                var doc=ifr.contentDocument || ifr.contentWindow.document,
                    div=doc.createElement("div");
                div.innerHTML="test";
                window.setTimeout(function(){
                    doc.body.appendChild(div);
                },500);
            },500);
        </script>
    </head>
  </html>

このコードは、空白のiframeを作成し、それを現在のページの本文に追加します。次に、単純なテキストを含むdiv要素を作成し、それをiframeの本文に追加します。

すべてのブラウザ(IE、Safari、Chrome、Opera)で機能しますが、Firefox(バージョン3.6.3を使用)では、divがiframe内に表示されず、エラーはスローされません。

どこかにバカなエラーがあるに違いないと思いますが、見つかりません。何かアイデアはありますか?

PS:これらwindow.setTimeoutは、domがページとiframeに読み込まれていることを確認するための簡単な方法です。

4

2 に答える 2

5

iframeドキュメントの取得をタイムアウトでラップする必要があります。

        window.setTimeout(function(){
            var doc=ifr.contentWindow.document || ifr.contentDocument;
            var div=doc.createElement("div");
            div.innerHTML="test";
            doc.body.appendChild(div);
        },500);

http://jsfiddle.net/xeGSe/1/を参照してください

于 2010-07-15T13:08:51.220 に答える
4

setTimeout通話がキャッチされないタイミングの問題のようです。イベントを使用してonload要素が本当に利用可能であることを確認するDOMReady方が良いでしょう(IEではそれほど簡単ではありませんが)。これを試して:

document.body.onload = function() {
    var iframe = document.createElement("iframe");
    iframe.src = "about:blank";
    iframe.onload = function() {
        var doc = iframe.contentDocument || iframe.contentWindow.document,
            div = doc.createElement("div");
        div.innerHTML="test";
        doc.body.appendChild(div);
    }
    document.body.appendChild(iframe);
}
于 2010-07-15T13:12:49.687 に答える