跨域

关于跨域的详细资料:跨域,这里只需要明确什么情况下跨域了(等同于两个url什么情况下是非同源关系)。

协议、域名、端口三者有其一不同,就算是跨域,就算是非同源

本地环境模拟

借助phpstudy创建两个非同源网站,分别为www.a.com以及www.b.com。其中www.b.com的创建过程如下。



以上创建出来的www.b.com网页就是一个vue页面,访问如下:

同理创建出www.a.com页面,访问页面如下:

vue中使用iframe、postMessage跨域通信

  1. 获取iframe的window对象

要使用postMessage()发送消息,需要先获取iframe的window对象,共有三种方式可获取:

window.frames[iframe的name值]
document.getElementById(iframe的id值).contentWindow
this.$refs.iframe的ref值.contentWindow (vue特有)


注意:如果把iframe的窗体对象存储在data对象中,会出现跨域报错!

2. 父页面发送消息,子页面接收
www.b.com父页面代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>跨域父页面</title>
</head>
<body><div id="app"><div>{{msg}}</div><iframe name="myiframe" ref="myiframe" id="myiframe" src="http://www.a.com/index.html"></iframe><div><input type="button" value="与子页面通信" @click="sendMessage('父页面发来消息~')"></div></div><script src="./vue.js"></script><script>new Vue({el: '#app',data: {msg: '跨域父页面',iframeWin: null, },methods: {sendMessage(msg){//要使用postMessage方法,首先需要获取iframe的window窗体,共有三种方式:let iframeWin1 = window.frames["myiframe"];let iframeWin2 = this.$refs.myiframe.contentWindow;let iframeWin3 = document.getElementById("myiframe").contentWindow;//将iframe的window窗体存储至data对象中会出现跨域报错//this.iframeWin = window.frames["myiframe"];let data = {msg: msg};//postMessage(json数据,目标地址的协议+域名+端口)iframeWin1.postMessage(JSON.stringify(data),"http://www.a.com");}}})</script>
</body>
</html>

www.a.com子页面代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>iframe跨域子页面</title>
</head>
<body><div id="mydiv">vue、iframe、postMessage跨域子页面</div>
</body>
<script>//监听message事件,采用冒泡传递方式window.addEventListener("message",receiveMessage,false);function receiveMessage(event){let origin = event.origin;let data = JSON.parse(event.data);if (origin !== "http://www.b.com")return ;//筛选出从www.b.com(父页面)发送来的消息进行处理document.getElementById("mydiv").innerHTML = data.msg;}
</script>
</html>

效果:


3. 子页面回传数据给父页面
在子页面中使用parent.postMessage或者window.parent.postMessage向父元页面发送消息。www.a.com子页面发送消息部分代码:

父页面www.b.com接收消息部分代码:

全部代码

www.b.com页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>跨域父页面</title>
</head>
<body><div id="app"><div>{{msg}}</div><iframe name="myiframe" ref="myiframe" id="myiframe" src="http://www.a.com/index.html"></iframe><div><input type="button" value="与子页面通信" @click="sendMessage('父页面发来消息~')"></div></div><script src="./vue.js"></script><script>new Vue({el: '#app',data: {msg: '跨域父页面',iframeWin: null, },methods: {sendMessage(msg){//要使用postMessage方法,首先需要获取iframe的window窗体,共有三种方式:let iframeWin1 = window.frames["myiframe"];let iframeWin2 = this.$refs.myiframe.contentWindow;let iframeWin3 = document.getElementById("myiframe").contentWindow;//将iframe的window窗体存储至data对象中会出现跨域报错//this.iframeWin = window.frames["myiframe"];let data = {msg: msg};//postMessage(json数据,目标地址的协议+域名+端口)iframeWin1.postMessage(JSON.stringify(data),"http://www.a.com");},//处理接收的消息receiveMessage(event){let data = JSON.parse(event.data);let origin = event.origin;if (origin !== "http://www.a.com")return ;//筛选出从www.a.com(子页面)发送来的消息进行处理this.msg = data.msg;}},created(){window.addEventListener("message",this.receiveMessage,false);},//vue实例销毁时销毁一些监听事件destroyed(){window.removeEventListener("message",this.receiveMessage);}})</script>
</body>
</html>

www.a.com页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>iframe跨域子页面</title>
</head>
<body><div id="mydiv">vue、iframe、postMessage跨域子页面</div><div><input type="button" value="回传数据给父页面" onclick="sendMessage('子页面发来消息~')"></div>
</body>
<script>//监听message事件,采用冒泡传递方式window.addEventListener("message",receiveMessage,false);function receiveMessage(event){let origin = event.origin;let data = JSON.parse(event.data);if (origin !== "http://www.b.com")return ;//筛选出从www.b.com(父页面)发送来的消息进行处理document.getElementById("mydiv").innerHTML = data.msg;}//向父页面发送消息function sendMessage(msg){let data = {msg: msg};parent.postMessage(JSON.stringify(data), "http://www.b.com");}
</script>
</html>

vue页面内嵌iframe使用postMessage进行跨域通信相关推荐

  1. 页面嵌套iframe(window.postMessage()实现跨域通信)

    项目中的需求 需要外接一个iframe与主页面之间需要通信 的情况 在iframe 中: 在主页面中: window.postMessage() 方法可以安全地实现跨源通信.通常,对于两个不同页面的脚 ...

  2. ifrme嵌入外部页面,在外部页面调用本页面方法,window.postMessage实现跨域通信

    项目场景:vue页面开发的系统要继承外部系统页面,并且在外部系统页面调用本系统的方法,这样来看的话肯定会存在跨域的问题,而且直接调用方法的话,也不太安全,后来了解到window.postMessage ...

  3. 服务端转发html页面,html5关于外链嵌入页面通信问题(postMessage解决跨域通信)

    说起来挺简单的,可以直接去查询postMessage推送和window.addEventListener接收使用方式,能自己搞明白是最好的,本文章也只是记录一下自己的使用方式 使用postMessag ...

  4. window.postMessage - 前端跨域通信

    window.postMessage - 前端跨域通信 window.postMessage() 语法 The dispatched event 安全问题 示例 注意 HTMLIFrameElemen ...

  5. 使用window.postMessage实现跨域通信

    JavaScript由于同源策略的限制,跨域通信一直是棘手的问题.当然解决方案也有很多: document.domain+iframe的设置,应用于主域相同而子域不同: 利用iframe和locati ...

  6. html 内嵌iframe,html页面 内嵌iframe

    1.创建iframe scrolling="no" οnlοad="resizeIframe(this)"> 2. js将html文件字符串,write进 ...

  7. vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ?

    需求:在 vue  和 element-ui 项目中,有点击按钮预览,下载,打印 PDF 文件 需求,要求支持 PDF 的预览,上下页切换,首尾页切换,页码选择跳转,放大缩小,顺时针逆时针旋转,下载, ...

  8. vue内嵌iframe跨域通信

    1.Vue组件中如何引入iframe? <template><div class="act-form"><iframe :src="src& ...

  9. [转]html5: postMessage解决跨域和跨页面通信的问题

    [转]html5: postMessage解决跨域和跨页面通信的问题 参考文章: (1)[转]html5: postMessage解决跨域和跨页面通信的问题 (2)https://www.cnblog ...

最新文章

  1. 打开SQL Developer时,提示缺少快捷方式
  2. Python_Day4_函数
  3. 史上最全!图解浏览器的工作原理
  4. python字典更新值_Python 字典 update() 使用方法及示例
  5. Linux下.rar文件解压
  6. CentOS最小化安装后AR8151网卡驱动未安装解决办法
  7. Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)
  8. Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
  9. Excel数据生成SQL insert语句
  10. python mockito arg_that_编程高阶用法–开发者高频词汇
  11. 360安全卫士管理开机启动项的方法
  12. 正切函数半角定理推导
  13. 高分影视盒子app下载一起学技巧_大家学APP课程你学习了吗?
  14. astropy.io.fits 教程
  15. 立陶宛央行抢跑数字货币背后:前瞻的区块链战略 中国已有企业布局
  16. uni-app 支付宝小程序授权,获取用户基础信息(头像图片地址、昵称、性别、国家码、省份、所在市区)
  17. 76.0.3809.100版本的谷歌浏览器对应能用的chromedriver版本
  18. 网友反映学校计算机科学与工程学院教师,华南理工大学一院长被指篡改考生成绩 校方:四名涉事人员停职调查...
  19. 非计算机专业全国壹级,非计算机专业专科学生全国计算机一级等级考试应试策略...
  20. Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic

热门文章

  1. libVLC 视频裁剪
  2. Python之给微信好友自动发送消息
  3. python基础循环语句
  4. matlab编程画分段函数,matlab画分段函数 求程序
  5. Laravel 学习笔记 —— 神奇的服务容器
  6. css:块元素、行内元素、行内块元素以及三种元素之间的转换
  7. “网络白痴”初学SEO成长经验心得
  8. python实现读取传感器发送到串口的数据,并将读取的串口数据写入文件、数据库存储
  9. 无刷直流电机虚拟中性点分析
  10. 一种有效管控APP隐私权限的解决方案