使用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 浮点数运算 精度问题
Oct 06 Javascript
利用jquery操作select下拉列表框的代码
Jun 04 Javascript
JS获取后台Cookies值的小例子
Mar 04 Javascript
Javascript实现滑块滑动改变值的实现代码
Apr 12 Javascript
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
详解vue.js全局组件和局部组件
Apr 10 Javascript
微信小程序日期选择器实例代码
Jul 18 Javascript
Node.js 使用request模块下载文件的实例
Sep 05 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
国内php原创论坛
2006/10/09 PHP
PHP 第一节 php简介
2012/04/28 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python+微信接口实现运维报警
2016/08/27 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
《赵州桥》教学反思
2014/02/17 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
政风行风整改方案
2014/10/25 职场文书
诚信考试主题班会
2015/08/17 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS