【问题标题】:Access parent window from iframe (cross-domain)从 iframe 访问父窗口(跨域)
【发布时间】:2012-04-05 00:14:41
【问题描述】:

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

接下来我要完成这个任务:

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

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

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

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

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

【问题讨论】:

  • If I understand correctly, all modern browsers do now allow to do this. So I'm here to find the best solution.您的解决方案。你问的是不可能的。
  • postMessage 在不同域的 iframe 中工作。
  • Malgin:如果可能的话,任何 iframe 内容都可能劫持托管页面。这已被故意禁用。没有变通办法没有“最佳解决方案”。

标签: javascript html iframe cross-domain


【解决方案1】:

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

参考如下:

【讨论】:

  • 这是正确答案。现在可以在 HTML5 中使用 Window.postMessage 在窗口(或 iframe)之间进行跨域 js 调用。
  • 在 IE
  • 是的,window.postmessage 是要走的路……但是,您并不总是可以访问子 iframe 代码!因此,如果您将您的答案与我的答案结合使用,您就有了一个完整的解决方案!
【解决方案2】:

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

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

查看相关问题:

编辑

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

Ways to circumvent the same-origin policy

【讨论】:

  • 我知道从子窗口操纵父窗口是不可能的。我正在寻找的是如何模仿这种操作。换句话说,来自子窗口的一些标志,父窗口将在其上运行一些代码。
  • @Malgin,同样,这是不可能的。您要求页面之间进行脚本级交互。这不可能。您无法模仿无法完成的事情。有很多关于 SO 的问题可以解决这个问题。见编辑。
  • 您回答我唯一不清楚的是,也无法从父窗口操作子窗口。这是我的想法,使我更加坚持。再次感谢。
  • 但是,您可以更改窗口位置。如果您知道有问题的 URL 并且可以控制这两个域,则可以使用查询字符串在两者之间发送消息。不过,听起来您应该寻求更好的解决方案。
  • 正如其他人所指出的,这实际上可能的,例如通过 postMessage。所以@jeremysawesome 的答案应该是被接受的。
【解决方案3】:

但您可以更改iframesrc 属性(例如添加#hashtag)并在子窗口中监听onhashchange 事件。鉴于您可以更改两个页面。

【讨论】:

  • 我的回答允许您在不控制两个页面的情况下执行此操作!
【解决方案4】:

另一种方法是:在加载后 500 毫秒将 iframe 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,更多信息可以在@jeremysawesome 's answer找到

【讨论】:

    【解决方案5】:

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

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

    记住:生活总会找到出路... ;-)

    【讨论】:

    • 问题是跨域访问。无法跨域访问本地存储/会话存储?
    • 知道变量名就可以跨域使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2018-12-18
    • 2018-09-12
    • 2017-02-05
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多