JavaScript使用HTML5的window.postMessage实现跨域通信例子


Posted in Javascript onApril 11, 2014

JavaScript由于同源策略的限制,跨域通信一直是棘手的问题。当然解决方案也有很多:
1.document.domain+iframe的设置,应用于主域相同而子域不同;
2.利用iframe和location.hash,数据直接暴露在了url中,数据容量和类型都有限
3.Flash LocalConnection, 对象可在一个 SWF 文件中或多个 SWF 文件间进行通信, 只要

在同一客户端就行,跨应用程序, 可以跨域。
window.name 保存数据以及跨域 iframe 静态代理动态传输方案,充分的运用了window.name因为页面的url改变而name不改变的特性。
各种方案网上都有很多实例代码,大家可以自己搜索一下。

html5中最炫酷的API之一:就是 跨文档消息传输Cross Document Messaging。高级浏览器Internet Explorer 8+, chrome,Firefox , Opera 和 Safari 都将支持这个功能。这个功能实现也非常简单主要包括接受信息的”message”事件和发送消息的”postMessage”方法。

发送消息的”postMessage”方法

向外界窗口发送消息:

otherWindow.postMessage(message, targetOrigin);

otherWindow: 指目标窗口,也就是给哪个window发消息,是 window.frames 属性的成员或者由 window.open 方法创建的窗口
参数说明:
1.message: 是要发送的消息,类型为 String、Object (IE8、9 不支持)
2.targetOrigin: 是限定消息接收范围,不限制请使用 ‘*'

接受信息的”message”事件

var onmessage = function (event) { 
var data = event.data; 
var origin = event.origin; 
//do someing 
}; 
if (typeof window.addEventListener != 'undefined') { 
window.addEventListener('message', onmessage, false); 
} else if (typeof window.attachEvent != 'undefined') { 
//for ie 
window.attachEvent('onmessage', onmessage); 
}

回调函数第一个参数接收 Event 对象,有三个常用属性:
1.data: 消息
2.origin: 消息来源地址
3.source: 源 DOMWindow 对象

当然postmessage也有一些不足的地方:
1.ie8,ie9下传递的数据类型值支持字符串类型,不过可以使用用 JSON对象和字符串之间的相互转换 来解决这个问题;
2.ie6,ie7需要写兼容方案,个人认为window.name比较靠谱;

Javascript 相关文章推荐
jQuery实现类似淘宝购物车全选状态示例
Jun 26 Javascript
Script标签与访问HTML页面详解
Jan 10 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
使用Vue组件实现一个简单弹窗效果
Apr 23 Javascript
微信小程序实现之手势锁功能实例代码
Jul 19 Javascript
深入浅析var,let,const的异同点
Aug 07 Javascript
element-ui 关于获取select 的label值方法
Aug 24 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 #Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
Apr 10 #Javascript
js获取视频时长代码
Apr 10 #Javascript
js转化毫秒为时间格式代码
Apr 10 #Javascript
jquery移除、绑定、触发元素事件使用示例详解
Apr 10 #Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 #Javascript
jquery删除ID为sNews的tr元素的内容
Apr 10 #Javascript
You might like
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
献爱心活动总结
2014/05/07 职场文书
表彰大会策划方案
2014/05/13 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
工作保证书
2015/01/17 职场文书
大学生自荐书范文
2015/03/05 职场文书
2019思想汇报范文
2019/05/21 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
mysql如何查询连续记录
2022/05/11 MySQL