iframe与父容器之间通信postMessage实践
·
近期一项目有需求在祖传代码上加一个全新的功能模块。该功能模块主要功能都靠通信完成。因此想到了直接使用iframe嵌入祖传项目。新模块使用的是vue全家桶,本文内容主要涉及到iframe与祖传代码的通信与数据共享的一些问题总结。
postMessage是什么
正确使用window.postMessage() 方法可以安全地实现跨源通信。通常一个窗口可以获得对另一个窗口的引用(比如 targetWindow =window.opener),然后在窗口上调用 targetWindow.postMessage() 方法分发MessageEvent 消息。接收消息的窗口可以根据需要自由处理此事件。传递给 window.postMessage() 的参数(比如 message )将通过消息事件对象暴露给接收消息的窗口。
postMessage使用方法(MDN关于postMessage的介绍 )
otherWindow.postMessage(message, targetOrigin, [transfer]);
//otherWindow: 目标窗口,也就是你想要发送消息的窗口
//message: 将要发送到目标窗口的数据,一般建议用JSON.stringify处理一下,防止低版本浏览器不兼容。
//targetOrigin: 可以是字符串"*"(表示无限制)或者一个URI,通过窗口的origin属性来指定哪些窗口能接收到消息事件,在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;
//transfer:可选,是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
问题1:父容器向iframe发送消息
parent.html
<iframe id="iframe" src="http://www.child.com/b.html"></iframe>
let iframe = document.getElementById('iframe');
iframe.onload = function(){
let data = {message:'传递数据'}
// 向子页面发送信息
iframe.contentWindow.postMessage(JSON.stringify(data), 'http://www.child.com');
}
//接收子页面信息
window.addEventListener('message', function(e) {
let data = JSON.parse(e.data)
//逻辑操作
}, false);
问题2:iframe向父容器发送消息
//接收父页面的信息
window.addEventListener('message', function(e) {
let data = JSON.parse(e.data)
//逻辑操作
}, false);
// 发送消息
let data = {message:'传递数据'}
window.parent.postMessage(JSON.stringify(data), 'http://www.parent.com');
问题3:iframe获取父容器的cookie
- 不同源情况(未尝试只给出思路)
在iframe的onload事件里由父容器向iframe发送一条消息。将当前页面的window或者是document对象作为参数传递。子页面接收到信息可以直接取父元素中的cookie信息。 - 同源情况
同源情况下cookie是共享的只需要直接获取就OK了,一般建议部署代码尽量部署到相同的域名下,会省去很多麻烦。
//获取cookie函数
export function getCookie(key) {
//有参数直接取参数对应的cookie值,否则返回全部cookie对象
const cookieArray = window.document.cookie.replace(/\s/g, "").split(';')
const cookieObject = {}
cookieArray.forEach(item => {
let objArr = item.split("=");
cookieObject[objArr[0]] = objArr[1]
})
if (key) {
return cookieObject [key]
} else {
return cookieObject
}
}
参考文章:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)