使用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 相关文章推荐
取得一定长度的内容,处理中文
Dec 20 Javascript
ext for eclipse插件安装方法
Apr 27 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
May 17 Javascript
javascript面向对象程序设计(一)
Jan 29 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
js实现幻灯片轮播图
Aug 14 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 Javascript
js滚动条平滑移动示例代码
Mar 29 #Javascript
JavaScript头像上传插件源码分享
Mar 29 #Javascript
js解决movebox移动问题
Mar 29 #Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 #Javascript
分析js闭包引起的事件注册问题
Mar 29 #Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 #Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 #Javascript
You might like
php旋转图片90度的方法
2013/11/07 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
潜说js对象和数组
2011/05/25 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python实现批量压缩图片
2018/01/25 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
结婚典礼证婚词
2014/01/11 职场文书
食品业务员岗位职责
2014/03/18 职场文书
导师推荐信范文
2014/05/09 职场文书
本科毕业生自荐信
2014/06/02 职场文书
财务工作个人总结
2015/02/27 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL