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 相关文章推荐
JS BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
关于jquery中attr()和prop()方法的区别
May 28 jQuery
使用Jenkins部署React项目的方法步骤
Mar 11 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
Apr 28 Javascript
jquery检测上传文件大小示例
Apr 26 jQuery
Vue 中获取当前时间并实时刷新的实现代码
May 12 Javascript
基于Electron实现桌面应用开发代码实例
Jul 07 Javascript
JQuery基于FormData异步提交数据文件
Sep 01 jQuery
详解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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
php递归实现无限分类的方法
2015/07/28 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
python中下标和切片的使用方法解析
2019/08/27 Python
Python-for循环的内部机制
2020/06/12 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
师德学习感言
2014/01/31 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
旅游节目策划方案
2014/05/26 职场文书
爱护花草树木的标语
2014/06/11 职场文书
大学生实习介绍信
2015/05/05 职场文书
商标侵权律师函
2015/05/27 职场文书
MySQL Server 层四个日志
2022/03/31 MySQL