使用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 相关文章推荐
ajax处理php返回json数据的实例代码
Jan 24 Javascript
你必须知道的Javascript知识点之"this指针"的应用
Apr 23 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
jQuery 插件开发指南
Nov 14 Javascript
JavaScript实现将xml转换成html table表格的方法
Apr 17 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
Jun 14 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
利用jQuery对无序列表排序的简单方法
Oct 16 Javascript
js实现彩色条纹滚动条效果
Mar 15 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
jQuery实现模糊查询的方法分析
May 10 jQuery
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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
实例讲解php实现多线程
2019/01/27 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
详解vue axios二次封装
2018/07/22 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python中os模块详解
2016/10/14 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
keras中的backend.clip用法
2020/05/22 Python
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
七年级数学教学反思
2014/01/22 职场文书
承认错误的检讨书
2014/01/30 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android