使用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 相关文章推荐
用javascript实现给图片加链接
Aug 15 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
javascript中的关于类型转换的性能优化
Dec 14 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
javascript中怎么做对象的类型判断
Nov 11 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
Jan 26 Javascript
connect中间件session、cookie的使用方法分享
Jun 17 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 Javascript
js实现动态改变radio状态的方法
Feb 28 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
Jun 12 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 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加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
js实现京东轮播图效果
2017/06/30 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
初步剖析C语言编程中的结构体
2016/01/16 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python实现多线程端口扫描
2019/08/31 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
销售人员获奖感言
2014/02/05 职场文书
高二学生评语大全
2014/04/25 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
sql server 累计求和实现代码
2022/02/28 SQL Server