Vue进阶(八十六):VUE中iframe结合window.postMessage实现跨域通信

举报
SHQ5785 发表于 2020/12/29 23:12:06 2020/12/29
【摘要】 什么是iframe? iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。 什么是postMessage? window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document....

什么是iframe

iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。

什么是postMessage

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

使用场景:

在一个项目的页面中嵌入另一个项目的页面,需要实现父子,子父页面的通信。

1.嵌入页面

iframe使用如下(端口为8080):

<iframe id="myframe" name="myframe" :src="src" ref="iframe" scrolling="no" width="350px" height="350px" frameborder="0"></iframe>

  
 
  • 1

data中定义src引入端口号为8081的页面:

src:"http://127.0.0.1:8081/#/Login",

  
 
  • 1

那么问题就来了,嵌入的登录模块属于子页面(另一个项目,端口号8081)的东西,如何能让我自己的页面知道用户点击了蓝色按钮,达到登录后隐藏登录框的效果呢?在这里,postMessage就派上了用场。

2.postMessage实现父子页面通信

window.postMessage中的window在iframe中是指什么呢?请看语法。

在这里插入图片描述

我们首先要获取到iframecontentWindow属性放到mounted钩子函数中。

mounted() {
  this.iframeWin = this.$refs.iframe.contentWindow;
},

  
 
  • 1
  • 2
  • 3

目标源写成 * ,具备了两个必要参数,我们就可以开始使用postMessage了。

一、子页面向父页面传值

在这个项目中,我需要在点击login按钮(子页面),并且登陆成功后在父页面中隐藏登录模块。

父页面如何才能知道用户点击了子页面的按钮?

postMessage只是一个沟通的桥梁。

子页面说话,父页面需要听到。所以我们在父页面的mounted函数中写一个监听。

mounted() { window.addEventListener('message', this.handleMessage); this.iframeWin = this.$refs.iframe.contentWindow;
},

  
 
  • 1
  • 2
  • 3
  • 4

下面为完整代码

子页面代码:

 submit() { // 向父vue页面发送信息 window.parent.postMessage({ data: { code:"success", test:"我是子页面的test!" } }, '*');
 }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

父页面代码:

<div class="login" v-if="!loginStatus"> <iframe id="myframe" name="myframe" :src="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;
},

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

一、父页面向子页面传值

父页面代码:

sendMessage () { // 外部vue向iframe内部传数据 this.iframeWin.postMessage({ cmd: 'success', data: "我是来自父页面的data!"
}, '*')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

子页面监听同理。

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/103281406

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。