使用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 相关文章推荐
extjs3 combobox取value和text案例详解
Feb 06 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
浅谈EasyUI中编辑treegrid的方法
Mar 01 Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 Javascript
angularJS Provider、factory、service详解及实例代码
Sep 21 Javascript
概述javascript在Google IE中的调试技巧
Nov 24 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
完美解决axios跨域请求出错的问题
Feb 05 Javascript
10 种最常见的 Javascript 错误(频率最高)
Feb 08 Javascript
Vue自定义指令封装节流函数的方法示例
Jul 09 Javascript
原生js无缝轮播插件使用详解
Mar 09 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编程效率 引入缓存机制提升性能
2010/02/15 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python对象属性自动更新操作示例
2018/06/15 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python猜数字算法题详解
2020/03/01 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
表彰大会主持词
2014/03/26 职场文书
高一军训感想
2015/08/07 职场文书
高二语文教学反思
2016/02/16 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL