【问题标题】:Communication between iFrames? [duplicate]iFrame 之间的通信? [复制]
【发布时间】:2013-05-15 11:25:43
【问题描述】:

如何让两个 iFrame 相互通信? 例如,我是第二个 iframe 的元素值,而第一个 iframe 上有显示元素。我需要从第二帧到第一帧的值。我该怎么做? 不要说使用 cookie,因为大量数据会造成伤害。

【问题讨论】:

标签: javascript html iframe


【解决方案1】:

我会首先警告您,您需要两个 iframe 的完整代码修改能力。 iframe 受到严格的安全处理;否则,我可以创建一个域“bunkofamerica.com”,将“bankofamerica.com”放在 iframe 中,然后在用户输入密码时对其进行分析。 (无论如何,银行往往都有 iframe-busting 代码,但仍然......)

您正在寻找这个原生函数: https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage

这是我公司用来使这个更跨浏览器兼容的 github 库:https://github.com/daepark/postmessage

jbabey 是正确的,如果 iframe 在同一个域和协议中,那就更容易了。

Opera Docs 用最相关的例子解释了这一点https://dev.opera.com/articles/window-postmessage-messagechannel/#channel

【讨论】:

    【解决方案2】:

    首先,框架可以与自身外部交互的唯一方式是,如果在两个位置加载的内容来自同一个域,否则您将收到 CORS 错误。

    假设这都是肉汁,我会在父框架的窗口对象上创建一个管理器对象。

    window.Mgmt = {
        frame1: $('iframe#frame1'),
        frame2: $('iframe#frame2')
    }
    

    那么在任一 iframe 中,您应该能够使用 window.parent.Mgmt.frame1 等访问该对象

    【讨论】:

      【解决方案3】:

      如果<iframe> 元素来自同一个域,那么它们可以直接相互访问。例如,在iframe1 你可以这样做:

      document.getElementById('someDiv').innerHTML = 
          top.document.getElementById('otherIframe').contentWindow.
          document.getElementById('someOtherDiv').innerHTML;
      

      【讨论】:

      • 使用 top 假设此代码本身永远不会加载到框架中,否则不会指向您期望的内容。
      • @MattBerkowitz 你是什么意思?如果您在一个页面上有两个 iframe 并从中调用 top,它会为您提供包含窗口,您可以从中找到另一个 iframe。
      • 不,它会为您提供最顶层的框架,可能是父级或祖父级等。考虑一下您刚刚提到的设置都加载到另一个 iframe 中(我们无法控制谁可能加载我们的页面在 iframe 中),top 将返回最外面的页面,该页面可能没有“otherIframe”可供查找(甚至可能不满足 CORS 要求)。使用 parent 而不是 top 可能会稍微好一些,因为它可以保证你正在做你认为你正在做的事情。
      • 尝试在top.document(或window.parent)上调用.getElementById 时出现跨域错误
      猜你喜欢
      • 2019-09-29
      • 2011-12-10
      • 1970-01-01
      • 2011-10-21
      • 2019-11-06
      • 2012-02-27
      • 2018-06-04
      • 2014-03-09
      相关资源
      最近更新 更多