如何使用postMessage从嵌套的iframe到根文档进行通信
how to use postMessage to communicate from nested iFrames to the root document?
我正在开发一个插件,它必须管理相当复杂的页面嵌套iframes
,像这样:
page.html
<body>
<iframe A>
<iframe B>
<div bla></div>
</iframe>
</iframe>
<iframe C>
<div foo></div>
</iframe>
</body>
插件将在多个实例中运行(一个在主页上,一个为每个iFrame)。为了通知iFrame关于root
实例,我在生成iFrame时将根URL作为参数传递,如下所示:
...
newHTML = document.createElement("iframe");
newHTML.setAttribute("src", options.src + "?" + priv.encodeURI(rootPath));
那么iFrame将被加载一个URL,像这样:
http://www.path/to/iFrame.html?base=...encodeURI(window.location.href.of.root)
我的问题是,我需要postMessage
从一个嵌套的iFrame到根,我不能让它工作。下面是我正在做的:
// sending a message
var adressArray = window.location.href.split("?");
options.src = options.src || adressArray[0];
window.postMessage(options, options.src);
// receiving
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event) {
console.log(event.data);
console.log(event.origin);
console.log(window);
}
我的问题是,调用和侦听器都在同一个插件中,但应该在插件的不同实例中侦听。因此,postmessage
将由frame B
实例触发,并且page.html
实例上的侦听器应该检测到该消息。
我认为targetOrigin属性是指定目的地的postMessage应该被发送到哪里。相反,我最终发送了我的张贴iFrame (B)的URL,这是由父iFrame (A)记录的,而不是page.html实例侦听它。
问题:
是否有可能"跨"两个(或任意数量的)父节点发送postMessage,而不需要人为地将其"冒泡"到树中?说iFrame的实例B想说"你好"的实例page.html,我将如何使用postMessage
做到这一点,当我可以使"根实例URL"提供给每个iFrame?
谢谢!
问题:
window.top
似乎是我的朋友,因为它返回最顶部的窗口元素。
当我postMessage to:
var top = window.top;
top.postMessage("foo", currentFrameUrl);
工作正常
我将继续传递URL虽然,因为在跨域iFrames, window.top
肯定不会工作…
parent.postMessage("foo");
应该可以满足您的要求,如果您只想增加一层嵌套的话。
注意:window
是隐含的,所以你实际执行的是window.parent.postMessage("foo");
第二个参数只有在跨域工作时才需要(即,如果您的父和嵌套的iframe具有不同的协议/子域/域/端口),在这种情况下,"*"
是技术上可接受的跨域发送postMessage的解决方案,尽管这可能不太安全。
- 使用promise和mongoose对文档进行排序
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- Ajax请求文档就绪会导致jquery加载缓慢
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 谷歌文档表面引擎
- 来自文档或下一个静态父级的事件委派
- 如何将childNodes用于XML文档
- 文档就绪提供了错误的选择器高度
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- BrowserId登录请求在文档加载时被调用
- 从Javascript和Php变量创建Html模板文档
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在jquery文档准备好之前加载Modernizr
- 如何判断何时将dom节点添加到文档中
- 无法获取文档.GetElementById工作正常
- 为什么是文档.旧版应用程序中的DOM-object.properties为null
- 使用easyXDM在父文档和从不同域(amazon)加载的子iframe之间进行通信
- 如何使用postMessage从嵌套的iframe到根文档进行通信
- IE阻止同一域iframe通信.(文档.域设置在所有框架上)