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组件的一些写法
Sep 10 Javascript
javaScript如何生成xmlhttp
Dec 16 Javascript
封装了一个支持匿名函数的Javascript事件监听器
Jun 05 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
Jan 08 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
layer弹窗插件操作方法详解
May 19 Javascript
jquery.validate表单验证插件使用详解
Jun 21 jQuery
vue组件watch属性实例讲解
Nov 07 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
May 26 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
详解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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
PHP个人网站架设连环讲(三)
2006/10/09 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
javascript数组去重小结
2016/03/07 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python如何修改装饰器中参数
2018/03/20 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Python实现上下文管理器的方法
2020/08/07 Python
一道输出判断型Java面试题
2014/10/01 面试题
办公室助理岗位职责
2013/12/25 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
企业后勤岗位职责
2014/02/28 职场文书
生物制药专业求职信
2014/03/11 职场文书
工作分析计划书
2014/04/30 职场文书
租房协议书样本
2014/08/20 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
授权收款委托书
2014/09/23 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
Tomcat用户管理的优化配置详解
2022/03/31 Servers