使用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 相关文章推荐
Jquery 动态添加按钮实现代码
May 06 Javascript
datagrid框架的删除添加与修改
Apr 08 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
JavaScript利用append添加元素报错的解决方法
Jul 01 Javascript
js闭包的用途详解
Nov 09 Javascript
JavaScript类继承及实例化的方法
Jul 25 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
说说Vuex的getters属性的具体用法
Apr 15 Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 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之第九天
2006/10/09 PHP
main.php
2006/12/09 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
Javascript实现计算个人所得税
2015/05/10 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
python判断数字是否是超级素数幂
2018/09/27 Python
把pandas转换int型为str型的方法
2019/01/29 Python
总结python中pass的作用
2019/02/27 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python实现低通滤波器代码
2020/02/26 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
学校门卫工作职责
2013/12/07 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
大学毕业感言50字
2014/02/07 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
行政助理的岗位职责
2014/02/18 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
情人节寄语大全
2014/04/11 职场文书
汽修专业自荐信
2014/07/07 职场文书
假释思想汇报范文
2014/10/11 职场文书
孙振耀退休感言
2015/08/01 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书