Vue中iframe结合window.postMessage实现跨域通信
一、前言
什么是iframe
?
iframe
元素会创建包含另外一个文档的内联框架(即行内框架)。
什么是postMessage
?
window.postMessage()
方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同协议(通常为https
),端口号(443
为https
的默认值),以及主机 (两个页面的模数 Document.domain
设置为相同值) 时,这两个脚本才能相互通信。window.postMessage()
方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。
二、应用场景
在一个项目的页面中嵌入另一个项目的页面,需要实现父子,子父页面的通信。
2.1 嵌入页面
iframe
使用如下(端口为8080
):
<iframe id="myframe" name="myframe" :class="lazy" data-src="class="lazy" data-src" ref="iframe" scrolling="no" width="350px" height="350px" frameborder="0"></iframe>
在data
中定义class="lazy" data-src
引入端口号为8081的页面:
class="lazy" data-src:"http://127.0.0.1:8081/#/Login",
那么问题就来了,嵌入的登录模块属于子页面(另一个项目,端口号8081)的东西,如何能让我自己的页面知道用户点击了蓝色按钮,达到登录后隐藏登录框的效果呢?在这里,postMessage
就派上了用场。
2.2 postMessage 实现父子页面通信
window.postMessage
中的window
在iframe
中是指什么呢?
我们首先要获取到iframe
的contentWindow
属性放到mounted
钩子函数中。
mounted() {
this.iframeWin = this.$refs.iframe.contentWindow;
},
目标源写成 *
,具备了两个必要参数,我们就可以开始使用postMessage
了。
2.3 子页面向父页面传值
在这个项目中,我需要在点击login按钮(子页面),并且登陆成功后在父页面中隐藏登录模块。
父页面如何才能知道用户点击了子页面按钮?
postMessage
只是一个沟通的桥梁。
子页面说话,父页面需要听到。所以我们在父页面的mounted函数中写一个监听。
mounted() {
window.addEventListener('message', this.handleMessage);
this.iframeWin = this.$refs.iframe.contentWindow;
},
下面为完整代码
子页面代码:
submit() {
// 向父vue页面发送信息
window.parent.postMessage({
data: {
code:"success",
test:"我是子页面的test!"
}
}, '*');
}
submit() {
// 向父vue页面发送信息
window.parent.postMessage({
data: {
code:"success",
test:"我是子页面的test!"
}
}, '*');
}
父页面代码:
<div class="login" v-if="!loginStatus">
<iframe id="myframe" name="myframe" :class="lazy" data-src="class="lazy" data-src" ref="iframe" scrolling="no" width="350px" height="350px" frameborder="0"></iframe>
</div>
methods: {
handleMessage (event) {
const data = event.data.data
if(data.code === "success"){
alert(data.test)
}
}
}
mounted() {
window.addEventListener('message', this.handleMessage);
this.iframeWin = this.$refs.iframe.contentWindow;
},
2.4父页面代码:
sendMessage () {
// 外部vue向iframe内部传数据
this.iframeWin.postMessage({
cmd: 'success',
data: "我是来自父页面的data!"
}, '*')
子页面监听同理。
三、拓展阅读 《Vue进阶(九十二):窗口间通信postMessage》
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341