我有一个相当有趣的问题。我有一个父页面,它将创建一个模态jquery对话框,其中包含对话框中的iframe。 iframe将填充来自第三方域的内容。我的问题是我需要创建一些对话级javascript,可以检测iframe的内容是否成功加载,如果它没有在5秒的时间范围内,然后关闭对话框并将用户返回到父页面。
我研究了很多解决方案,只有两个具有任何真正的价值。
这些是否真的是我必须与之合作的唯一选择?有没有更简单的方法来检测这个?
我一直在研究是否有一种方法来调查http响应错误,但这仍然局限于相同的限制。
非常感谢任何帮助。
由于
答案 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加载的方式,
<iframe id="crossDomainIframe" src=""> </iframe>
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不会阻止您将任何内容发布到其他域。但是你将无法阅读回复。