跨域iframe内容负载检测

问题描述 投票:15回答:6

我有一个相当有趣的问题。我有一个父页面,该页面将创建一个模态jquery对话框,对话框中包含一个iframe。 iframe中将填充来自第三方域的内容。我的问题是,我需要创建一些对话框级别的javascript,以检测iframe的内容是否成功加载,以及是否在5秒钟内没有加载,然后关闭对话框并将用户返回到父页面。

我研究了许多解决方案,只有两个具有真正的价值。

  1. 获取远程站点以包含document.domain ='our-domain.com'的javascript行。
  2. 使用URL片段hack,但再次需要远程站点的请求能够通过在URL末尾附加'#some_value'来修改URL,而我的对话框窗口将不得不轮询URL,直到它看到它或超时为止。

老实说,这些是我唯一需要使用的选择吗?没有一种简单的方法可以检测到吗?

我一直在研究是否有一种方法可以轮询http响应错误,但这仍然限于相同的限制。

任何帮助将不胜感激。

谢谢

javascript iframe cross-domain
6个回答
10
投票

最简单的方法(如果您可以将代码添加到外部网站),是让它们添加一个指向您域中特殊html文件的不可见iframe。然后,可以使用parent.parent.foo()通知原始窗口有关加载事件的信息。

监听“ load”事件只会告诉您窗口是否已加载,而不是窗口已加载或文档是否准备好进行交互。


4
投票

[尼古拉斯·扎卡斯(Nicholas Zakas)有一篇有关检测是否加载iframe的文章:http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/。基本上,您有以下代码片段:

var iframe = document.createElement("iframe");
iframe.src = "simpleinner.htm";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

我还没有测试过,但是我很确定jQuery应该可以通过执行$("#iframe").load(function () { alert("Local iframe is now loaded."); });这样的操作来处理它>


2
投票

您可以尝试使用postMessage在帧之间进行通信。这将要求远程站点包含一些特定的JavaScript,以便在完成加载后将消息发布到父文档。


1
投票

可以通过iframe本身的onload处理程序来执行此操作。不幸的是(惊奇!)IE使它变得困难。我可以使之起作用的唯一方法是为iframe编写HTML,然后使用innerHTML将其附加到文档中。然后,我必须进行轮询以查看iframe何时出现在DOM中,这取决于页面是否正在加载。这是到源的链接:http://svn.openlaszlo.org/openlaszlo/trunk/lps/includes/source/iframemanager.js


0
投票

这是我检测到跨域iframe加载的方式,


-1
投票

在任何情况下,当您试图滥用Same Origin Policy (SOP)时,您都需要与其他域的服务器进行某种合作。

如果域不同,第一个解决方案document.domain=...将不起作用。如上链接所述,它仅适用于子域和端口。

© www.soinside.com 2019 - 2024. All rights reserved.