使用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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
CSS JavaScript 实现菜单功能 改进版
Dec 09 Javascript
收集的一些Array及String原型对象的扩展实现代码
Dec 05 Javascript
JavaScript操纵窗口的方法小结
Jun 28 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
DOM基础教程之使用DOM控制表单
Jan 20 Javascript
js实现按钮控制带有停顿效果的图片滚动
Aug 30 Javascript
浅谈vuex 闲置状态重置方案
Jan 04 Javascript
WebSocket的简单介绍及应用
May 23 Javascript
json_decode 索引为数字时自动排序问题解决方法
Mar 28 Javascript
jquery实现图片放大镜效果
Dec 23 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php header Content-Type类型小结
2011/07/03 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
python二叉树遍历的实现方法
2013/11/21 Python
Python实现的tab文件操作类分享
2014/11/20 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
用pickle存储Python的原生对象方法
2017/04/28 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python如何实现转换URL详解
2019/07/02 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
Python获取时间戳代码实例
2019/09/24 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
为什么要使用servlet
2016/01/17 面试题
材料成型专业个人求职信范文
2013/09/25 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
亮化工程实施方案
2014/03/17 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书