JS实现iframe中子父页面跨域通讯的方法分析


Posted in Javascript onMarch 10, 2020

本文实例讲述了JS实现iframe中子父页面跨域通讯的方法。分享给大家供大家参考,具体如下:

在非跨域的情况下,iframe中的子父页面可以很方便的通讯,但是在跨域的情况下,只能通过window.postMessage()方法来向其他页面发送信息,其他页面要通过window.addEventListener()监听事件来接收信息;

#跨域发送信息

#window.postMessage()语法

otherWindow.postMessage(message, targetOrigin, [transfer]);
  • otherWindow
    其他窗口的一个引用,写的是你要通信的window对象。
    例如:在iframe中向父窗口传递数据时,可以写成window.parent.postMessage(),window.parent表示父窗口。
  • message
    需要传递的数据,字符串或者对象都可以。
  • targetOrigin
    表示目标窗口的源,协议+域名+端口号,如果设置为“*”,则表示可以传递给任意窗口。在发送消息的时候,如果目标窗口的协议、域名或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。例如:
    window.parent.postMessage('hello world','http://xxx.com:8080/index.html')
    只有父窗口是http://xxx.com:8080时才会接受到传递的消息。

  • [transfer]
    可选参数。是一串和message 同时传递的 Transferable 对象,这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。我们一般很少用到。

#跨域接收信息

需要监听的事件名为"message"

window.addEventListener('message', function (e) {
  console.log(e.data) //e.data为传递过来的数据
  console.log(e.origin) //e.origin为调用 postMessage 时消息发送方窗口的 origin(域名、协议和端口)
  console.log(e.source) //e.source为对发送消息的窗口对象的引用,可以使用此来在具有不同origin的两个窗口之间建立双向通信
})

#示例Demo

示例功能:跨域情况下,子父页面互发信息并接收。

  • 父页面代码:
<body>
  <button onClick="sendInfo()">向子窗口发送消息</button>
  <iframe id="sonIframe" src="http://192.168.2.235/son.html"></iframe>
  <script type="text/javascript">

    var info = {
      message: "Hello Son!"
    };
    //发送跨域信息
    function sendInfo(){
      var sonIframe= document.getElementById("sonIframe");
      sonIframe.contentWindow.postMessage(info, '*');
    }
    //接收跨域信息
    window.addEventListener('message', function(e){
        alert(e.data.message);
    }, false);
  </script>
</body>
  • 子页面代码
<body>
  <button onClick="sendInfo()">向父窗口发送消息</button>
  <script type="text/javascript">

    var info = {
      message: "Hello Parent!"
    };
    //发送跨域信息
    function sendInfo(){
      window.parent.postMessage(info, '*');
    }
    //接收跨域信息
    window.addEventListener('message', function(e){
        alert(e.data.message);
    }, false);
  </script>
</body>

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript操作DOM技巧总结》、《JavaScript页面元素操作技巧总结》、《JavaScript事件相关操作与技巧大全》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript客户端将指定区域导出到Word、Excel的代码
Oct 22 Javascript
JavaScript 拾漏补遗
Dec 27 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
Jquery 的outerHeight方法使用介绍
Sep 11 Javascript
推荐JavaScript实现继承的最佳方式
Nov 11 Javascript
非常优秀的JS图片轮播插件Swiper的用法
Jan 03 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
从零开始封装自己的自定义Vue组件
Oct 09 Javascript
vue基础之data存储数据及v-for循环用法示例
Mar 08 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
Mar 10 #Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 #Javascript
js模拟实现烟花特效
Mar 10 #Javascript
JS实现放烟花效果
Mar 10 #Javascript
JS实现烟花爆炸效果
Mar 10 #Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 #Javascript
JS实现网页烟花动画效果
Mar 10 #Javascript
You might like
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
JS中的作用域链
2017/03/01 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
通过Pandas读取大文件的实例
2018/06/07 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
购房意向书范本
2014/04/01 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
工程安全生产协议书
2014/11/21 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS