1

私の問題の原因は、親 HTML が子 IFRAME のコントロールを呼び出すことですが、それについては速すぎます。また、サブonLoadが何かを追加する前に、スーパーonLoadがそうしようとすることもあります。 DOM。

私はそれについて何ができますか?

子のonLoadから何らかのフィードバックを設定しようとしました。非常に多くの奇妙なエラーで惨めに失敗したため、それらをまとめることはできません

私は遅延器を設定しようとしましたが、これは壮大なプロポーションで醜く、100% 信頼できるものではありません。

編集:

私はこれonloadを行います:

var stuff = getReferenceToStuff();
var someDiv = stuff.contentWindow.document.getElementById("someDiv");
someDiv.className = "classy";

問題は、参照someDivnullである場合があり、(多くの場合、F5 でページをリロードしたときに) 正しい要素を指していることです。IFRAME の内容が少し遅いためだと思います。

だから私の質問はこれです。埋め込まれた IFRAME コンポーネントのonloadがロードされ、すべてのコンポーネントがそこにあることを確認するまで、 onloadを延期するにはどうすればよいですか?

4

3 に答える 3

1

onLoadイベントが常に正しく機能しているとは限りませんdocument。ただし、各要素で正しく機能します。

var iframes = document.getElementsByTagName('iframe'),
    counter = 0,
    max = iframes.length;

[].forEach.call(iframes, iLoaded);

function iLoaded() {
    if (++counter === max) {
        callback();
    }
}

function callback() {
    // All the iframes are loaded
}
于 2012-12-22T16:06:12.913 に答える
0

window.onload のすべてのコンテンツ ( のコンテンツや画像などの他のすべてのリソースを含む) を使用する場合は、 を起動する前にロードbodyする必要があります。ただし、一部のブラウザーでは、起動のタイミングに問題がありました。つまり、ブラウザーが異なれば、ページ解析のさまざまな段階でイベントがトリガーされます。iframeonloadonload

DOMContentLoadedまたは jQuery のを使用している場合$(document).ready()、メイン ページの HTML のみが読み込まれますが、一部のリソースはまだ作業中です (iframeのコンテンツの読み込みを含む)。iframe要素自体にインラインリスナーをアタッチするとどうなるかわかりません。

iframeタイミングの問題がある場合は、メイン ウィンドウで参照が必要な関数をまったくトリガーしない可能性があります。irame代わりに、のメイン ウィンドウでその関数を呼び出しますwindow.onload。しかし、何らかの非同期手法を使用してiframe. この場合、すべてのリクエストが完了した後で、メイン ウィンドウで関数を呼び出す必要があります。

(これで、あなたの投稿で見たいコードスニペットは何かも知っているかもしれません:))。

于 2012-12-22T15:38:12.563 に答える
0

あなたの問題には2つの解決策があります:

  1. HTML5 を使用している場合は、window.postMessageを使用してください。iFrame の onload で iFrame から親にメッセージを送るだけです。親は<script>、iFrame の前に表示されるタグにハンドラーを登録する必要があります。

  2. iFrame の前の '' タグに window へのコールバック関数を追加します。この関数は、読み込みが完了すると iFrame によって呼び出されます。基本テンプレートはこちら。

サンプル テンプレートは次のとおりです。

  <script>
  window.iframeCallback = function(message) {

    // first clear the temp function we added to the window
    // It is a bad practice to corrupt the global namespace
    delete window.iframeCallback;

    // you do your work here

  };
  </script>

  ..
  ..

  <!-- iFrame should appear after the above script-->
  <iframe/>
于 2012-12-22T15:58:57.193 に答える