1

我刚刚发现我的问题的根源是父 HTML 调用子 IFRAME 中的控件速度太快了,有时,超级onLoad在子onLoad有机会添加内容之前尝试这样做DOM。

我能做些什么呢?

我试图在孩子的onLoad中设置某种反馈。惨遭失败,有这么多奇怪的错误,花花公子可以总结出来,请不要

我试图设置一个延迟器,它是史诗般的丑陋不是 100% 可靠的。

编辑:

onload我这样做:

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

问题是有时引用someDiv,有时(通常当我按 F5 重新加载页面时)它指向正确的元素。我知道这是因为 IFRAME 的内容有点慢。

所以我的问题是这样的。如何确保onload被推迟,直到嵌入式 IFRAME 组件的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,包括iframes 的内容和所有其他资源(如图像),应在触发之前加载。onload但是,一些浏览器在触发时间上存在问题onload,即不同的浏览器在页面解析的不同阶段触发事件。

如果您使用DOMContentLoadedjQuery 的$(document).ready(),则仅加载主页的 HTML,但某些资源仍在工作中(包括iframe的内容加载)。我不知道如果为iframe元素本身附加一个内联侦听器会发生什么。

如果有时间问题,可能根本不会触发需要iframe在主窗口中引用的功能。irame而是在's 的主窗口中调用该函数window.onload。但即使这样也无法解决问题,如果您使用一些异步技术来填充iframe. 在这种情况下,您需要在完成所有请求后在主窗口中调用该函数。

(现在您可能还知道,我希望在您的帖子中看到哪些代码片段:))。

于 2012-12-22T15:38:12.563 回答
0

I have 2 solutions to your problem:

  1. If you are on HTML5, use window.postMessage. Just message from iFrame to the parent in the onload of iFrame. Parent should register handler in <script> tag, that appears before iFrame.

  2. Add a callback function to window in the '' tag before iFrame. This function is called by iFrame when it's load is complete. Here is the basic template.

Here is the sample template:

  <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 回答