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 bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
JavaScript实现快速排序(自已编写)
Dec 19 Javascript
表单元素与非表单元素刷新区别详细解析
Nov 06 Javascript
js操作table示例(个人心得)
Nov 29 Javascript
第一章之初识Bootstrap
Apr 25 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
JS求解三元一次方程组值的方法
Jan 03 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
May 22 Javascript
详解KOA2如何手写中间件(装饰器模式)
Oct 11 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 Javascript
js中Object.create实例用法详解
Oct 05 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
PHP 事件机制(2)
2011/03/23 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
Python实现把xml或xsl转换为html格式
2015/04/08 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python实现简单图书管理系统
2019/11/22 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
意大利团购网站:Groupon意大利
2016/10/11 全球购物
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
会计电算化个人自我评价
2013/11/17 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
英文推荐信格式范文
2014/05/09 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
会计学专业求职信
2014/07/17 职场文书
上诉答辩状范文
2015/05/22 职场文书
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript