使用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 相关文章推荐
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
Jul 12 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
jQuery操作之效果详解
May 19 jQuery
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
Aug 25 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
Jan 16 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
详解react阻止无效重渲染的多种方式
Dec 11 Javascript
微信小程序使用npm包的方法步骤
Aug 13 Javascript
vue实现两个组件之间数据共享和修改操作
Nov 12 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
一些关于PHP的知识
2006/11/17 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
JS中call和apply函数用法实例分析
2018/06/20 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
详解Python验证码识别
2016/01/25 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
优秀团队获奖感言
2014/02/19 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
公司外出活动方案
2014/08/14 职场文书
承诺书模板
2014/08/30 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
Go语言编译原理之变量捕获
2022/08/05 Golang