使用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的固定表格头部的代码(IE6,7,8测试通过)
May 18 Javascript
原生JS实现加入收藏夹的代码
Oct 24 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
jQuery中layer分页器的使用
Mar 13 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
May 26 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
Jul 24 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
Jan 03 Javascript
如何将Node.js中的回调转换为Promise
Nov 10 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
初品cakephp 入门基础
2012/02/16 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python正则简单实例分析
2017/03/21 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
python小程序实现刷票功能详解
2019/07/17 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
超市优秀员工获奖感言
2014/08/15 职场文书
国家助学金感谢信
2015/01/21 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏