使用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实现运动logo图片效果及运动元素对象sportBox使用方法
Dec 25 Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
Jquery实现Div上下移动示例
Apr 23 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
vue插件tab选项卡使用小结
Oct 27 Javascript
Javascript中的 “&” 和 “|” 详解
Feb 02 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 Javascript
webpack下实现动态引入文件方法
Feb 22 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
Vue实现点击按钮复制文本内容的例子
Nov 09 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 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版(3)
2006/10/09 PHP
php修改时间格式的代码
2011/05/29 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP中异常处理的一些方法整理
2015/07/03 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python黑魔法之参数传递
2016/02/12 Python
Django组件cookie与session的具体使用
2019/06/05 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
药学专业大学生自荐信
2013/09/28 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
员工年终考核评语
2014/12/31 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
通讯稿格式及范文
2015/07/22 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python