使用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重写Cognos右键菜单的实现代码
Apr 11 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
Sep 29 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
jquery实现用户打分评分特效
May 28 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
VUEJS实战之修复错误并且美化时间(2)
Jun 13 Javascript
JS随机打乱数组的方法小结
Jun 22 Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 Javascript
利用JS实现一个同Excel表现的智能填充算法
Aug 13 Javascript
jquery层次选择器的介绍
Jan 18 jQuery
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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
js玩一玩WSH吧
2007/02/23 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
初识JQuery 实例一(first)
2011/03/16 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
微信小程序纯文本实现@功能
2020/04/08 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Selenium定位元素操作示例
2018/08/10 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Java中compareTo和compare的区别
2016/04/12 面试题
跟单文员岗位职责
2014/01/03 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
扬尘污染防治方案
2014/06/15 职场文书
世界读书日的活动方案
2014/08/20 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python