3

我有两个来自同一个域的 iframe,它们托管在另一个域的文档中。问题是这些 iframe 无法通过 postMessage 相互通信。我什至无法从 iframe2 访问 iframe1 的 DOM,即使它们属于同一个域。有什么解决办法吗???

我使用以下选项来引用所需的 iframe。

parent.frame[x]

我尝试了以下几行来访问 iframe 的 DOM

parent.frame[x].contentWindow returns null,

parent.frame[x].document.getElementsByTagName("body") returns null

更新:

我想我的问题还不够清楚。postMessage api没有问题,实际问题是浏览器围绕iframe文档创建了一个自定义框架集,就我而言!

所以parent.frame[x]不会指向 iframe 窗口,而是指向 iframe 窗口内的自定义框架集。

以下问题很好地解释了这个问题。

阻止浏览器在 iframe 的文档中加载自定义框架集

4

2 回答 2

1

如果要跨窗口同域通信,可以通过localStorage. 当您向 中添加项目时,您会在同一域的所有其他窗口/iframe/选项卡中localStorage获得窗口事件。"storage"

因此,您基本上localStorage.setItem('name', 'value')在一个 iframe 中收听window.addEventListener('storage', (event) => {/* handle message */})并收到消息。

于 2017-08-11T10:44:05.093 回答
-1

请看下面对postMessage函数的描述以及如何使用它。因此,在 frame1 中调用该postMessage方法,在 frame2 中订阅通知。显然,您使用的浏览器必须支持此 API。

还有一个非常好的jQuery 插件,它封装了这个 API 并简化了它的使用。它也适用于不支持postMessage使用 url 的哈希部分的方法的浏览器。

于 2011-07-09T10:31:49.113 回答