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 相关文章推荐
jquery validate.js表单验证的基本用法入门
May 13 Javascript
js打开windows上的可执行文件示例
May 27 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
jquery中封装函数传递当前元素的方法示例
May 05 jQuery
vue-cli 3.x 修改dist路径的方法
Sep 19 Javascript
详解webpack loader和plugin编写
Oct 12 Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 Javascript
NProgress显示顶部进度条效果及使用详解
Sep 21 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
在网页中使用document.write时遭遇的奇怪问题
2010/08/24 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
在Python中调用ggplot的三种方法
2015/04/08 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
医院总经理职责
2013/12/26 职场文书
小区门卫值班制度
2014/01/24 职场文书
责任书范本
2014/08/25 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书