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 相关文章推荐
通过event对象的fromElement属性解决热区设置主实体的一个bug
Dec 22 Javascript
PNG背景在不同浏览器下的应用
Jun 22 Javascript
JavaScript 图片预览效果 推荐
Dec 22 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Oct 24 Javascript
jquery序列化表单以及回调函数的使用示例
Jul 02 Javascript
javascript arguments使用示例
Dec 16 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 Javascript
js如何打印object对象
Oct 16 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
Jul 24 Javascript
javascript防抖函数debounce详解
Jun 11 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
毕业生如何写自我鉴定
2014/03/15 职场文书
利群广告词
2014/03/20 职场文书
汽修专业自荐信
2014/07/07 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
教师岗位职责范本
2015/04/02 职场文书
听证通知书
2015/04/24 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle