从iframe访问父窗口(跨域)

Access parent window from iframe (cross-domain)

本文关键字:跨域 窗口 iframe 访问      更新时间:2023-09-26

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

我将以下一种方式完成:

我有一个覆盖层,里面有一个iFrame。这将代替弹出窗口,防止弹出窗口阻止程序阻止我的内容。任务是在iFrame中的文档完成某些工作时重新加载主页面。在将加载到iFrame的文档中,我将添加

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

在父窗口中,我将添加函数,该函数将每秒调用一次,并检查该div是否仍有类名"false"。当这将更改为"true"时,我将调用一些回调。

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

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

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

参考如下:

  • MDN-Window.postMessage
  • https://stackoverflow.com/a/3076648/296889-请参阅Window.postMessage部分

如果我理解正确的话,现在所有的现代浏览器都允许这样做。所以我来这里是为了找到最好的解决方案。

您的解决方案。你的要求是不可能的。

参见相关问题:

  • 如何从JavaScript访问父Iframe
  • <iframe>javascript跨域访问父DOM
  • iframe中从子级到父级的跨域访问

编辑

正如下面的评论中所提到的,@JeremysAwesome的回答提供了一种在特定情况下允许跨域请求的方法。有关更多信息,请参阅下面的SO问题。

规避同源策略的方法

但您可以更改iframesrc属性(例如添加#hashtag)并在子窗口中侦听onhashchange事件。考虑到您可以同时更改两个页面。

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

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,更多信息可以在@jeremysawsome的回答

上找到

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

安全风险是有人利用和操纵它劫持你的一方。但如果有人想这么做,那么一切都有可能。

记住:生活会找到一条路…;-)