使用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 相关文章推荐
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
利用jq让你的div居中的好方法分享
Nov 21 Javascript
javascript的动态加载、缓存、更新以及复用(一)
Jun 09 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
Mar 14 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
vue实现pdf导出解决生成canvas模糊等问题(推荐)
Oct 18 Javascript
vue单页面在微信下只能分享落地页的解决方案
Apr 15 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
vue 自定义右键样式的实例代码
Nov 06 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 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
PHP 模板高级篇总结
2006/12/21 PHP
php基础学习之变量的使用
2011/06/09 PHP
php笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
python使用matplotlib绘制柱状图教程
2017/02/08 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
Python元组常见操作示例
2019/02/19 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
深入理解Python 多线程
2020/06/16 Python
银行见习期自我鉴定
2014/01/29 职场文书
高中军训感言500字
2014/02/24 职场文书
优秀员工评优方案
2014/06/13 职场文书
优秀英文求职信范文
2015/03/19 职场文书
新生儿未入户证明
2015/06/23 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript