跨域iframe内容负载检测

时间:2010-05-02 17:29:45

标签: javascript iframe cross-domain

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

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

  1. 让远程网站包含一个javascript行document.domain ='our-domain.com'。
  2. 使用URL Fragment hack,但我再次需要远程站点的请求 能够通过将“#some_value”附加到URL的末尾来修改URL,并且我的对话窗口必须轮询URL,直到它看到它或超时。
  3. 这些是否真的是我必须与之合作的唯一选择?有没有更简单的方法来检测这个?

    我一直在研究是否有一种方法来调查http响应错误,但这仍然局限于相同的限制。

    非常感谢任何帮助。

    由于

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

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 :(得分:2)

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

答案 3 :(得分:1)

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

请参阅create()__finishCreate()gotload()。随意拿一份这个并自己使用它!

此致 马克斯卡尔森 OpenLaszlo.org

答案 4 :(得分:0)

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

  1. 设置iframe的唯一ID(U可以使用任何类型的标识符,都没有关系)

<iframe id="crossDomainIframe" src=""> </iframe>

  1. 设置窗口事件监听器:
document.getElementById("MICSMsgBoardIframe").addEventListener('load',

function actionToPerform(){
  //Do your onLoad actions here
}

答案 5 :(得分:-1)

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

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

允许不进行轮询的跨域通信的唯一选项是JSONP或带有JS函数回调的脚本注入。此方法适用于所有Google API,效果良好。

我们已经在our blog上解释了一种在iframe中对这些调用进行沙盒化以保护它们的方法。虽然postMessage现在更好,但window.name hack具有使用旧版浏览器的优势。

具有讽刺意味的是,SOP不会阻止您将任何内容发布到其他域。但是你将无法阅读回复。

相关问题