使用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 相关文章推荐
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
JqGrid web打印实现代码
May 31 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
微信小程序实现YDUI的ScrollTab组件
Feb 02 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
jQuery实现简单聊天室
Feb 08 jQuery
vue 使用原生组件上传图片的实例
Sep 08 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 Cookie的使用教程详解
2013/06/03 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
设定php简写功能的方法
2019/11/28 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python实现的多线程端口扫描功能示例
2017/01/21 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python 字符串与数字输出方法
2018/07/16 Python
python执行精确的小数计算方法
2019/01/21 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
Python中的延迟绑定原理详解
2019/10/11 Python
python批量生成条形码的示例
2020/10/10 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
python调用百度API实现人脸识别
2020/11/17 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
几个MySql的面试题
2013/04/22 面试题
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
志愿者事迹材料
2014/12/26 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS