使用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 相关文章推荐
学习YUI.Ext基础第一天
Mar 10 Javascript
jquery api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
javascript 跳转代码集合
Dec 03 Javascript
js计算精度问题小结
Apr 22 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
Feb 23 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
如何在JS中实现相互转换XML和JSON
Jul 19 Javascript
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
Vue 进阶之路(三)
Apr 18 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 #Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 #Javascript
JavaScript面向对象程序设计教程
Mar 29 #Javascript
jQuery实现图片加载完成后改变图片大小的方法
Mar 29 #Javascript
Web前端开发工具——bower依赖包管理工具
Mar 29 #Javascript
Jquery操作cookie记住用户名
Mar 29 #Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 #Javascript
You might like
咖啡的种类和口感
2021/03/03 新手入门
10 个经典PHP函数
2013/10/17 PHP
php的hash算法介绍
2014/02/13 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
PHP生成树的方法
2015/07/28 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
全球性的在线购物网站:Zapals
2017/03/22 全球购物
毕业自我评价范文
2013/11/17 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
客房服务员岗位职责
2015/02/09 职场文书
社会实践活动总结格式
2015/05/11 职场文书
新年晚会开场白
2015/05/29 职场文书
新闻稿件写作技巧
2015/07/18 职场文书