HTML5 window/iframe跨域传递消息 API介绍


Posted in HTML / CSS onAugust 26, 2013

原文地址:HTML5′s window.postMessage API
在线示例:Using HTML5's window.postMessage(请打开控制台看日志)

我写了一个 MooTools 的插件"PostMessager"来封装window.postMessage,你可以点击这里下载!

HTML5 的 window.postMessage 接口API 还没有多少人了解。 window.postMessage允许多个 window/frame之间跨域传递数据和信息。实质上window.postMessage扮演了一个跨域Ajax请求的角色,当然,并不需要远程服务器来协作。接下来将介绍window.postMessage的工作原理,以及如何在FireFox,IE8+,Opera,Safari和Chrome中使用它.

一、消息发送端
整个过程的第一步,是设定一个"消息源"。通过这个消息源,我们可以往新打开的window(或者iframe)发送window级别的数据(消息)。在下面的示例中,给新窗口发送消息的频率是每6秒一次,并设置事件监听来处理目标window返回的响应信息。

复制代码
代码如下:

function trace(message){
var infos = Array.prototype.slice.call(arguments,0).join(" ");
if("console" in window){
console.log(infos);
} else {
alert(infos);
}
};
// 创建弹出窗口
var domain = 'http://scriptandstyle.com';
var myPopup = window.open(domain + '/windowPostMessageListener.html','myWindow');
// 定时发送消息
setInterval(function(){
var message = '现在时间: ' + (new Date().getTime());
trace('数据源.发送的消息: ' + message);
myPopup.postMessage(message,domain); //发送数据信息,并设置目标URI
},6*1000);
function bindEvent(target,noOnEventName,handler){
if(window.addEventListener){
target.addEventListener(noOnEventName,handler);
} else if(window.attachEvent){
// IE 的监听设置函数是attachEvent
target.attachEvent("on"+noOnEventName,handler);
} else {
target["on"+noOnEventName]=handler;
}
};
// 监听收到的信息.
bindEvent(window,'message',function(event) {
// 只接收特定域的消息
if(event.origin !== 'http://scriptandstyle.com') return;
trace('收到的响应信息: ',event.data);
},false);

原文作者使用的是window.addEventListener方法来绑定事件,但是在IE下将会报错(IE是window.attachEvent).当然,你可以创建函数来包装事件,或者使用现成的类库,比如MooTools或者jQuery/dojo来实现。
在上面的示例中,如果新窗口打开正常,那我们可以通过window对象的引用myPopup发送消息,并指定必须匹配的URI(协议、主机名、端口号)(如果用户在子窗口中跳到其他页面,则消息将不会发送).
同样我们也绑定了事件处理函数来接收消息message。在此提醒,校验message事件的origin(源)属性很重要,因为可能接收到所有URI发给自己的消息,在多个frame交互时才不至于混淆。 校验过origin之后,如何处理此消息,取决于你具体的业务和需求。

如果使用iframe的话,那么代码如下:

复制代码
代码如下:

// 同样创建另一个window(iframe,frame,frameset,top,window这些都属于window相关的对象。)
var domain = 'http://scriptandstyle.com';
var iframe = document.getElementById('myIFrame').contentWindow;
// 循环发送消息,当然,也可以采用事件驱动之类的。。。
setInterval(function(){
var message = '现在时间: ' + (new Date().getTime());
trace('数据源.发送的消息: ' + message);
iframe.postMessage(message,domain); //发送数据信息,并设置目标URI
},6*1000);

确保能访问到iframe对象的contentWindow 属性——而不仅仅是iframe对象。

二、消息接收端
整个流程的第二步就是让目标window就绪。目的窗口所要做的,就是监听message事件,当然也要验证事件的origin消息源。再次提醒:message事件处理函数可以接受任何域名发给他的消息,所以验证origin以及只处理信任列表的message非常重要。

复制代码
代码如下:

// 监听收到的信息.
bindEvent(window,'message',function(event) {
// 只接收特定域的消息
if(event.origin !== 'http://davidwalsh.name') return;
trace('监听到信息: ',event.data);
// 回复消息
event.source.postMessage(""你好,小伙伴们,我已经收到消息了,event.origin);
},false);

上面的示例回复了响应信息给请求方。
message事件重要的属性有:
source - 发送message的window/iframe对象
origin - 对应着发送消息window的URI (protocol, domain, and port, 如果有指定的话)
data - 具体的数据信息
对于消息系统以及校验来说,这三个对象是必不可少的。

window.postMessage 使用注意事项
就和其他所有的Web技术一样,如果使用不当(没有验证事件源)那危险性是显而易见的。当然,安全性由你自己来保证。
window.postMessage 很像JavaScript技术中的PHP(哈哈,小广告!).window.postMessage 算是一种很酷炫的技术,你觉得呢?

HTML / CSS 相关文章推荐
css3绘制百度的小度熊
Oct 29 HTML / CSS
css3让div随鼠标移动而抖动起来
Feb 10 HTML / CSS
CSS3对背景图片的裁剪及尺寸和位置的设定方法
Mar 07 HTML / CSS
html5指南-2.如何操作document metadata
Jan 07 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
May 07 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
Oct 15 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
Apr 24 HTML / CSS
举例详解HTML5中使用JSON格式提交表单
Jun 16 HTML / CSS
HTML5中的拖放实现详解
Aug 23 HTML / CSS
教你使用Canvas处理图片的方法
Nov 28 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
Jun 20 HTML / CSS
浅谈为什么我的 z-index 又不生效了
Jul 15 HTML / CSS
HTML5在a标签内放置块级元素示例代码
Aug 23 #HTML / CSS
HTML5 script元素async、defer异步加载使用介绍
Aug 23 #HTML / CSS
html5基础教程常用技巧整理
Aug 20 #HTML / CSS
HTML5中div、article、section的区别及使用介绍
Aug 14 #HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
Aug 14 #HTML / CSS
HTML5 embed 标签使用方法介绍
Aug 13 #HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 #HTML / CSS
You might like
Admin generator, filters and I18n
2011/10/06 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
JavaScript库 开发规则
2009/01/31 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
pyqt5实现登录界面的模板
2020/05/30 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
群众路线教育党课主持词
2014/04/01 职场文书
法院授权委托书格式
2014/09/28 职场文书
普通党员整改措施
2014/10/24 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
python多线程方法详解
2022/01/18 Python