使用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的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
jQuery.extend()的实现方式详解及实例
Jun 29 Javascript
jquery ajax方式直接提交整个表单核心代码
Aug 15 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
Oct 20 Javascript
jQuery简单实现网页选项卡特效
Nov 24 Javascript
JS+CSS实现DIV层的展开、收缩效果
Jan 28 Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
vue-openlayers实现地图坐标弹框效果
Sep 24 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实现的MySQL数据浏览器
2007/03/11 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
jquery foreach使用示例
2013/09/12 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
Python中多线程及程序锁浅析
2015/01/21 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python实现单词翻译功能
2017/06/06 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
办理生育手续介绍信
2014/01/14 职场文书
师德师风承诺书
2014/05/23 职场文书
导游词之襄阳古城
2019/09/27 职场文书
2022年显卡天梯图(6月更新)
2022/06/17 数码科技