使用postMesssage()实现跨域iframe页面间的信息传递方法


Posted in Javascript onMarch 29, 2016

由于web同源策略的限制,当页面使用跨域iframe链接时,主页面与子页面是无法交互的,这对页面间的信息传递造成了不小的麻烦,经过一系列的尝试,最后我发现有以下方法可以实现:

1. 子页面url传参

简单说来就是把所有需要传递的参数加到与主页面同源的url上,将子页面重定向到该url,然后主页面通过iframe的src获取这些参数

过程非常复杂,不建议使用这种方法

2. postMessage()

postMesssage()是HTML5提供的一个基于事件的消息传输API,可以实现跨文本档、多窗口、跨域消息传递。

postMessage(data,origin)方法接受两个参数

 1.data:要传递的数据,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,然而并不是所有浏览器都做到了这点儿,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果。

2.origin:字符串参数,指明目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写,这个参数是为了安全考虑,postMessage()方法只会将message传递给指定窗口,当然如果愿意也可以建参数设置为"*",这样可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

发送消息(子页面)

function sendMessage(param) {
  var url;
  if (param.url) {
    url = param.url;
  };
  var dataJson = JSON.stringify({

 type:1,

    a: param.c,
    b: param.c,
    c: param.c,
    url: url
  });
  window.parent.postMessage(dataJson, '*');
}

由于部分浏览器只能处理字符串参数,我们需要先使用JSON.stringfy()将参数转换为字符串,然后再接收页面使用JSON.parse()转换回对象。

接收消息

 对于子页面传递过来的参数,我们可以通过监听window的message事件来获取:

window.addEventListener('message', function(e) {
        var data = JSON.parse(e.data);
        switch (data.type) {
            case 1:
                alert(data.a);break;
        }
    }, false);

message事件有几个重要属性

1.data:顾名思义,是传递来的message
2.source:发送消息的窗口对象
3.origin:发送消息窗口的源(协议+主机+端口号)
通过postMesssage()方法和message事件就可以实现跨域传递消息了,需要注意的是,在demo中我们是通过子页面向父页面传递消息,所以使用的是window.parent发送,window接收:

window.parent.postMessage(dataJson, '*');如果是从主页面向子页面就需要对换,使用window发送,window.frames[0]来接收了。

以上这篇使用postMesssage()实现跨域iframe页面间的信息传递方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype String对象 学习
Jul 19 Javascript
JavaScript mapreduce工作原理简析
Nov 25 Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 Javascript
妙用缓存调用链实现JS方法的重载
Apr 30 Javascript
D3.js实现拓扑图的示例代码
Jun 30 Javascript
JS限制输入框输入的实现代码
Jul 02 Javascript
微信小程序的mpvue框架快速上手指南
May 15 Javascript
微信小程序渲染性能调优小结
Jul 30 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
Sep 25 Javascript
vue element 中的table动态渲染实现(动态表头)
Nov 21 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
Dec 18 Javascript
js滚动条平滑移动示例代码
Mar 29 #Javascript
JavaScript头像上传插件源码分享
Mar 29 #Javascript
js解决movebox移动问题
Mar 29 #Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 #Javascript
分析js闭包引起的事件注册问题
Mar 29 #Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 #Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 #Javascript
You might like
各种咖啡的英文名子是什么
2021/03/03 新手入门
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
php使用GeoIP库实例
2014/06/27 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
基于JQuery的日期联动实现代码
2011/02/24 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
jQuery实现弹幕特效
2019/11/29 jQuery
js回到页面指定位置的三种方式
2020/12/17 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python局域网ip扫描示例分享
2014/04/03 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python单元测试unittest实例详解
2015/05/11 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
高效使用Python字典的清单
2018/04/04 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
Python Django路径配置实现过程解析
2020/11/05 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
物流管理专业毕业生自荐信
2014/03/04 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
超市工作总结范文2014
2014/12/19 职场文书
汽车转让协议书
2015/01/29 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
Redis可视化客户端小结
2021/06/10 Redis
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs