使用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 相关文章推荐
JQuery SELECT单选模拟jQuery.select.js
Nov 12 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
Sep 05 Javascript
jquery中ajax学习笔记一
Oct 16 Javascript
javascript动态加载二
Aug 22 Javascript
jQuery Validate验证框架经典大全
Sep 23 Javascript
json格式数据的添加,删除及排序方法
Jan 21 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
vue 手机物理监听键+退出提示代码
Sep 09 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中JSON数据操作
2015/07/01 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
Python常用内置函数总结
2015/02/08 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
python中for in的用法详解
2020/04/17 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
股权投资意向书
2014/04/01 职场文书
社区戒毒工作方案
2014/06/04 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
详解MySQL的半同步
2021/04/22 MySQL
MyBatis 动态SQL全面详解
2021/10/05 MySQL
Python正则表达式中flags参数的实例详解
2022/04/01 Python