使用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相关JS代码片段和浏览器模型
Aug 15 Javascript
浅析Prototype的模板类 Template
Dec 07 Javascript
js关闭父窗口时关闭子窗口
Apr 01 Javascript
JavaScript中的闭包介绍
Mar 15 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
JavaScript中String对象的方法介绍
Jan 04 Javascript
jQuery插件zTree实现的多选树效果示例
Mar 08 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 Javascript
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
Jul 23 Javascript
小程序实现上下移动切换位置
Sep 23 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
Nov 19 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 正则表达式小结
2009/08/31 PHP
php 空格,换行,跳格使用说明
2009/12/18 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP中exec与system用法区别分析
2014/09/22 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
环境科学专业个人求职信
2013/09/26 职场文书
英语硕士生求职简历的自我评价
2013/10/15 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL