使用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解密入门之凭直觉解
Jun 25 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
Mar 29 Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
JS解析XML实例分析
Jan 30 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
jQuery ajax实现省市县三级联动
Mar 07 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 jQuery
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 Javascript
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 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自动加载的两种实现方法
2010/06/21 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
jQuery 白痴级入门教程
2009/11/11 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python正则表达式指南 推荐
2018/10/09 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
人事助理自荐信
2014/02/02 职场文书
《乌塔》教学反思
2014/02/17 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
敬老院标语
2014/06/27 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
详解JVM系列之内存模型
2021/06/10 Javascript
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL