使用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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
Javascript实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
纯javascript响应式树形菜单效果
Nov 10 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
Nov 09 Javascript
js移动焦点到最后位置的简单方法
Nov 25 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 Javascript
微信小程序背景音乐开发详解
Dec 12 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php实现两个数组相加的方法
2015/02/17 PHP
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
angular动态表单制作
2018/02/23 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
Python中的True,False条件判断实例分析
2015/01/12 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python机器学习之随机森林(七)
2018/03/26 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python序列化pickle模块使用详解
2020/03/05 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
如何提高MySql的安全性
2014/06/19 面试题
大学新闻系应届生求职信
2014/06/02 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
教师党员个人整改措施
2014/10/27 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python