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入门教程(10) 认识其他对象
Jan 31 Javascript
jQuery获取css z-index在各种浏览器中的返回值
Sep 15 Javascript
使用jQuery操作Cookies的实现代码
Oct 09 Javascript
jQuery 自定义函数写法分享
Mar 30 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
详解AngularJS过滤器的使用
Mar 11 Javascript
实用jquery操作表单元素的简单代码
Jul 04 Javascript
VsCode插件整理(小结)
Sep 14 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
Dec 11 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
JavaScript学习笔记(十)
2010/01/17 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
javascript基础知识
2016/06/07 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
python之wxPython应用实例
2014/09/28 Python
python网络编程之文件下载实例分析
2015/05/20 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
资金主管岗位职责范本
2014/03/04 职场文书
社区先进事迹材料
2014/05/19 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
中国合伙人观后感
2015/06/02 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Python中super().__init__()测试以及理解
2021/12/06 Python