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 相关文章推荐
javascript编程起步(第四课)
Feb 27 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
js对象基础实例分析
Jan 13 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
使用gulp构建前端自动化的方法示例
Dec 25 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
详解Node.js一行命令上传本地文件到服务器
Apr 22 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
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
js停止输出代码
2008/07/20 Javascript
XENON基于JSON变种
2010/07/27 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Python实现word2Vec model过程解析
2019/12/16 Python
python名片管理系统开发
2020/06/18 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
门卫人员岗位职责
2013/12/24 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
《藏戏》教学反思
2016/02/23 职场文书