使用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 文件大小判断的实现代码
Apr 07 Javascript
基于prototype扩展的JavaScript常用函数库
Nov 30 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
Dec 23 Javascript
js自定义鼠标右键的实现原理及源码
Jun 23 Javascript
javascript连续赋值问题
Jul 08 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
BootStrap 表单控件之单选按钮水平排列
May 23 Javascript
JavaScript程序设计高级算法之动态规划实例分析
Nov 24 Javascript
使用vue的transition完成滑动过渡的示例代码
Jun 25 Javascript
Vue中插入HTML代码的方法
Sep 21 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php全排列递归算法代码
2012/10/09 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python中的decorator的作用详解
2018/07/26 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
jupyter notebook 重装教程
2020/04/16 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
python中的时区问题
2021/01/14 Python
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
继电保护工岗位职责
2014/01/05 职场文书
小加工厂管理制度
2014/01/21 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
Python实现生成bmp图像的方法
2021/06/13 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫