从iframe访问父窗口(跨域)

时间:2012-03-20 14:01:54

标签: javascript html iframe cross-domain

如果iFrame中的窗口是从另一个域加载的,我遇到了从iFrame访问父窗口的任务。如果我理解正确,现在所有现代浏览器都允许这样做。所以我在这里找到最好的解决方案。

我将以下一个方式完成:

我在其中有一个带有iFrame的叠加层。这将有效,而不是弹出窗口阻止弹出窗口阻止程序阻止我的内容。任务是在iFrame中的文档完成某些工作时重新加载主页面。 在将加载到iFrame的文档中,我将添加

<div id="is_closed" class="false"></div>

在父窗口中,我将添加函数,该函数将每秒调用一次并检查此div是否仍具有类名“false”。如果将其更改为“true”,我将调用一些回调。

如果您有更好的解决方案,请与我分享。将不胜感激任何帮助。

编辑:这是不可能的,因为不仅无法从子窗口操作父窗口,反之亦然。我的想法是从父窗口操纵子窗口。我错了。

5 个答案:

答案 0 :(得分:41)

如果我是你,我会查看window.postMessage。它可能会做你想要的:

供参考,请参阅以下内容:

答案 1 :(得分:12)

  

如果我理解正确,现在所有现代浏览器都允许这样做。所以我在这里找到最佳解决方案。

您的解决方案。你不能问的是什么。

参见相关问题:

修改

如下面的评论所述,@JeremysAwesome's answer提供了一种在某些情况下允许跨域请求的方法。有关详细信息,请参阅下面的SO问题。

Ways to circumvent the same-origin policy

答案 2 :(得分:7)

但您可以更改src的{​​{1}}属性(例如添加iframe)并在子窗口中收听#hashtag事件。鉴于您有能力更改两个页面。

答案 3 :(得分:0)

另一种方法是:在加载iframe src后将其设置为javascript:链接500-ish毫秒。示例:

setTimeout(function() {
  document.getElementsByTagName("iframe")[0].src = `javascript: 
      (function(){
          setInterval(function() {
          if (document.getElementById("is_closed").className.match(/true/g)) {
              ...//see @jeremysawesome on how to do window.postMessage
          }
      })()`
}, 500);

虽然@jeremysawesome的答案确实有效,但无论主机域是什么,它都可以在嵌入式iframe上使用,这在处理托管在blogspot.com之类的域(不允许您更改)的网站时非常有用这类内容很容易...

现在显然您仍然需要启动window.postMessage,有关更多信息,请访问@jeremysawesome 's answer

答案 4 :(得分:-4)

在sessionStorage中设置变量/项目,并根据需要在两侧使用它。 localStorage可以做更长的时间。

安全风险是有人使用并操纵它来劫持你的一方。但如果有人想这样做 - 总会有可能。

记住:生活找到了方法......; - )