跨域iframe内容负载检测

rik*_*vis 15 javascript iframe cross-domain

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

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

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

这些是我必须与之合作的唯一选择吗?有没有更简单的方法来检测这个?

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

任何帮助都会非常感激.

谢谢

Sea*_*sey 10

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

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

  • +1表示我认为是我的具体问题的*唯一*解决方案!谢谢. (2认同)
  • 我不相信这在较新的 chrome 版本中不再有效(我使用 62.0.3202.45 进行了测试)。控制台显示错误:“Uncaught DOMException: Blocked a frame with origin ... form accessing a cross-origin frame”。 (2认同)

jua*_*azo 5

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);
Run Code Online (Sandbox Code Playgroud)

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