IFRAME 加载完成后的 Javascript 回调?

IT技术 javascript events dom iframe
2021-02-08 01:55:53

当 IFRAME 完成加载时,我需要执行回调。我无法控制 IFRAME 中的内容,因此我无法从那里触发回调。

这个 IFRAME 是通过编程方式创建的,我需要在回调中将其数据作为变量传递,同时销毁 iframe。

有任何想法吗?

编辑:

这是我现在所拥有的:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.src = url;            
    document.body.appendChild(iFrameObj);   

    $(iFrameObj).load(function() 
    {
        document.body.removeChild(iFrameObj);
        callback(iFrameObj.innerHTML);
    });
}

此回调在 iFrame 加载之前,因此回调没有返回数据。

6个回答

首先,通过函数名称xssRequest听起来您正在尝试跨站点请求 - 如果这是正确的,您将无法读取 iframe 的内容。

另一方面,如果 iframe 的 URL 在您的域中,您可以访问正文,但我发现如果我使用超时来删除 iframe,则回调可以正常工作:

// possibly excessive use of jQuery - but I've got a live working example in production
$('#myUniqueID').load(function () {
  if (typeof callback == 'function') {
    callback($('body', this.contentWindow.document).html());
  }
  setTimeout(function () {$('#frameId').remove();}, 50);
});
你可以$('body', this.contentWindow.document).html()this.contentDocument.body.outerHTML
2021-03-17 01:55:53
从 jQuery 3.0 开始,load已经消失了。.on('load', function() { ... })改用。
2021-03-20 01:55:53
知道如何在没有 jQuery 的情况下做到这一点吗?
2021-04-02 01:55:53

我正在使用 jQuery,令人惊讶的是,这似乎已加载,因为我刚刚测试并加载了一个沉重的页面,并且在看到 iframe 加载之前几秒钟没有收到警报:

$('#the_iframe').load(function(){
    alert('loaded!');
});

因此,如果您不想使用 jQuery,请查看他们的源代码,看看这个函数与 iframe DOM 元素的行为是否不同,我稍后会自己查看,因为我有兴趣并在此处发布。此外,我只在最新的 chrome 中进行了测试。

从 jQuery 3.0 开始,load已经消失了。.on('load', function() { ... })改用。
2021-03-18 01:55:53
我注意到您使用纯 javascript 创建了 DOM 元素,然后将该变量作为选择器传递给 jQuery,也许这就是您的代码不起作用的原因?
2021-03-24 01:55:53

在诸如 word 文档和 pdf 之类的文档被流式传输到 iframe 的情况下,我不得不这样做,并找到了一个非常有效的解决方案。关键是处理onreadystatechangediframe 上的事件。

假设您的框架名称是“myIframe”。首先在你的代码启动的某个地方(我在 iframe 之后的任何地方内联)添加这样的东西来注册事件处理程序:

document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;

我无法在 iframe 上使用 onreadystatechage 属性,我不记得为什么,但该应用程序必须在 IE 7 和 Safari 3 中运行,所以这可能是一个因素。

以下是如何获取完整状态的示例:

function MyIframeReadyStateChanged()
{
    if(document.getElementById('myIframe').readyState == 'complete')
    {
        // Do your complete stuff here.
    }
}

您的 iframe 的 innerHTML 是空白的,因为您的 iframe 标记没有包围父文档中的任何内容。为了从 iframe 的 src 属性引用的页面中获取内容,您需要访问 iframe 的 contentDocument 属性。如果 src 来自不同的域,则会抛出异常。这是一项安全功能,可防止您在其他人的页面上执行任意 JavaScript,这会造成跨站点脚本漏洞。这是一些示例代码,说明了我在说什么:

<script src="http://prototypejs.org/assets/2009/8/31/prototype.js" type="text/javascript"></script>

<h1>Parent</h1>

<script type="text/javascript">
function on_load(iframe) {
  try {
    // Displays the first 50 chars in the innerHTML of the
    // body of the page that the iframe is showing.
    // EDIT 2012-04-17: for wider support, fallback to contentWindow.document
    var doc = iframe.contentDocument || iframe.contentWindow.document;
    alert(doc.body.innerHTML.substring(0, 50));
  } catch (e) {
    // This can happen if the src of the iframe is
    // on another domain
    alert('exception: ' + e);
  }
}
</script>
<iframe id="child" src="iframe_content.html" onload="on_load(this)"></iframe>

为了进一步举例,请尝试将其用作 iframe 的内容:

<h1>Child</h1>

<a href="http://www.google.com/">Google</a>

<p>Use the preceeding link to change the src of the iframe
to see what happens when the src domain is different from
that of the parent page</p>
IE 7 不支持 contentDocument 属性,也许更多的 IE 也不支持,处理 IE 的方法是 window['iframeid'].document 或完全相同的 window.frames['iframeid'].document 证明链接在这里开发人员。 mozilla.org/en/…
2021-03-19 01:55:53

当 i 框架内容在 IE 上完全加载时,我想隐藏等待的微调 div,我实际上尝试了 Stackoverflow.Com 中提到的所有解决方案,但没有任何效果。

然后我有了一个想法,当 i 框架内容完全加载时, $(Window ) 加载事件可能会被触发。而这正是发生的事情。所以,我写了这个小脚本,并且像魔术一样工作:

     $(window).load(function () {
     //alert("Done window ready ");
     var lblWait = document.getElementById("lblWait");
     if (lblWait != null ) {
         lblWait.style.visibility = "false";
         document.getElementById("divWait").style.display = "none";
     }
 });

希望这可以帮助。

感谢您的评论,这个解决方案在我的案例中非常有效,因为我希望在页面加载后加载 iframe。
2021-04-06 01:55:53
这是一个简单的解决方案,如果您希望在整个页面加载后执行 javascript,则它可以正常工作。这意味着首先您会看到完全加载的页面,没有 js 效果,然后可能会在一两秒后(取决于负载)发生由 javascript 创建的任何更改。我个人尝试调整 iframe 的大小,如果您在单击页面后的前三秒内没有注意屏幕,它会起作用,但否则这可能(就像我的情况一样)显示为代码的拼凑。
2021-04-11 01:55:53