使用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 相关文章推荐
超级简单的图片防盗(HTML),好用
Apr 08 Javascript
javascript suggest效果 自动完成实现代码分享
Feb 17 Javascript
js实现收缩菜单效果实例代码
Oct 30 Javascript
按下Enter焦点移至下一个控件的实现js代码
Dec 11 Javascript
js动态往表格的td中添加图片并注册事件
Jun 12 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 Javascript
jQuery实现高级检索功能
May 28 jQuery
ES6 Symbol在对象中的作用实例分析
Jun 06 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
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/04 冲泡冲煮
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
Python中replace方法实例分析
2014/08/20 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
python 同时读取多个文件的例子
2019/07/16 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
详解KMP算法以及python如何实现
2020/09/18 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
高考自主招生自荐信
2013/10/20 职场文书
关于赌博的检讨书
2014/01/08 职场文书
祖国在我心中演讲稿
2014/01/15 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
python pyhs2 的安装操作
2021/04/07 Python