我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue中iframe结合window.postMessage实现跨域通信

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue中iframe结合window.postMessage实现跨域通信

一、前言

什么是iframe

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

什么是postMessage

window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同协议(通常为https),端口号(443https的默认值),以及主机 (两个页面的模数 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中的windowiframe中是指什么呢?

我们首先要获取到iframecontentWindow属性放到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

Vue中iframe结合window.postMessage实现跨域通信

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue中iframe结合window.postMessage实现跨域通信

window.postMessage()方法可以安全地实现跨源通信,在一个项目的页面中嵌入另一个项目的页面,需要实现父子,子父页面的通信,对Vue中iframe结合window.postMessage实现跨域通信相关知识感兴趣的朋友跟随小编一起看看吧
2022-12-31

Vue中iframe怎么结合window.postMessage实现跨域通信

这篇文章主要介绍“Vue中iframe怎么结合window.postMessage实现跨域通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中iframe怎么结合window.postMess
2023-07-04

vue内嵌iframe跨域通信的实例代码

这篇文章主要介绍了vue内嵌iframe跨域通信,主要介绍了Vue组件中如何引入iframe,vue如何获取iframe对象以及iframe内的window对象,结合实例代码给大家介绍的非常详细需要的朋友可以参考下
2022-11-13

使用iframe和postMessage怎么实现页面跨域通信

这篇文章将为大家详细讲解有关使用iframe和postMessage怎么实现页面跨域通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。通常情况下,对于两个不同页面的脚本,只有当执行它们的页面
2023-06-09

Vue使用postMessage实现父子跨域通信

这篇文章主要介绍了Vue应用postMessage实现父子跨域通信,通过示例介绍了postMessage的使用,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
2022-12-31

Vue怎么使用postMessage实现父子跨域通信

这篇文章主要讲解了“Vue怎么使用postMessage实现父子跨域通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue怎么使用postMessage实现父子跨域通信”吧!一、跨域通信1
2023-07-04

编程热搜

目录