1

親しみやすい iframe (同じドメイン) を作成し、 JavaScript で DOM に追加しました。マイページに表示されます。HTML の検査は次のようになります。

<iframe id="test_frame" frameSpacing="0" height="100" src="javascript:window['contents']" width="100" name="test_frame">
  <!DOCTYPE html>
  <html>
    <head>
      <title>test_frame</title>
      <base target=_top>
    </head>
    <body style="margin: 0px; padding: 0px">
      <p>Hello World</p>
    </body>
  </html>
</iframe>

次に、iframe のマークアップにアクセスするために次を実行します<body>

    alert(window.frames["test_frame"].document.body.innerHTML);

これは、Internet Explorer 6-10 では失敗するためbodyですnull。iframeのdocumentオブジェクトは存在しますが、読み取り可能なプロパティがないようです。他のブラウザは単に文字列を表示します<p>Hello World</p>

しかし興味深いことに、以下は IE 6-10 および他のすべてのブラウザーで機能します。

    window.setTimeout(function(){
      alert(window.frames["test_frame"].document.body.innerHTML);
    }, 1);

私の知る限りsetTimeout、渡された関数はグローバル スコープで実行されます。だから私はcallを使ってみましたが、うまくいきませ:

    (function(){
      alert(window.frames["test_frame"].document.body.innerHTML);
    }).call(window);

setTimeout でコードをラップすることで IE iframe の問題が解決する、同様のケースを見てきました。IE でのこの背後にあるメカニズムまたはロジックは何ですか? 適切な回避策はありますか?

上記のテストは標準モードで実行され、記載されている以外のエラーはありませんでした。

4

1 に答える 1

1

IEのこの背後にあるメカニズムまたはロジックは何ですか?適切な回避策はありますか?

メカニズムは非常に単純です。1ミリ秒(実際には4ミリ秒)待ってから、iFrameへのアクセスを試みます。

タイミングが全てだ。電話をかけるのが早すぎると、空のiFrameが表示されます。がjavascriptコードであってもsrc、コードを実行させる必要があります。


  • DOMで検出された直後にiFrameにアクセスすると、ほとんどの場合、空になります。まだインターネットから取得されていません。であっても、iFrameは空になりsrcますjavascript:...

  • ページの読み込みから1ミリ秒後に実行した場合、ほとんどの場合、まだフェッチされていません。ただし、ブラウザのキャッシュにある場合(通常はページは存在しないはずです)、またはデータ(またはこの場合はjavascript)のURLである場合は、これで機能する可能性があります(ただし、何も許可されません)。要素は、document.body空になる場合でも、この時点ですでに存在している可能性があります。

  • load目的のワークフローは、iFrameイベントを待つことです。iFrameを作成した後、または設定した直後に、安全にアタッチできますsrc。これを確実にメッセージ化するクロスブラウザのイベントセットを見つけるのは難しい問題ですが、loadクロスブラウザで機能するはずです。

  • loadイベントが十分に遅れない場合は、さらに1ミリ秒待ちます。これは必要ではないはずですが、IEにばかげたバグがあるかもしれません(私はそうは思わない)。

  • コンソールから起動している場合、これは成功するはずです。確かに、私の観察によれば、これは常に当てはまります。

于 2013-01-11T23:02:06.200 に答える