HTML5如何用window.postMessage在网页间传递数据

标签: HTML5教程 window.postMessage | 发表时间:2014-05-12 00:00 | 作者:sxwgf
分享到:
出处:http://www.html5tricks.com

估计很少人知道 HTML5 APIS里有一个window.postMessage API。 window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息。基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信。让我们来看一下 window.postMessage是如何工作的。除了IE6、IE7之外的所有浏览器都支持这个功能。

数据发送端

首先我们要做的是创建通信发起端,也就是数据源”source”。作为发起端,我们可以open一个新窗口,或创建一个iframe,往新窗口里发送数据,简单起见,我们每6秒钟发送一次,然后创建消息监听器,从目标窗口监听它反馈的信息。

//弹出一个新窗口
var domain = 'http://scriptandstyle.com';
var myPopup = window.open(domain 
            + '/windowPostMessageListener.html','myWindow');

//周期性的发送消息
setInterval(function(){
	var message = 'Hello!  The time is: ' + (new Date().getTime());
	console.log('blog.local:  sending message:  ' + message);
        //send the message and target URI
	myPopup.postMessage(message,domain);
},6000);

//监听消息反馈
window.addEventListener('message',function(event) {
	if(event.origin !== 'http://scriptandstyle.com') return;
	console.log('received response:  ',event.data);
},false);

这里我使用了 window.addEventListener,但在IE里这样是不行的,因为IE使用 window.attachEvent。如果你不想判断浏览器的类型,可以使用一些工具库,比如jQuery或Dojo。

假设你的窗口正常的弹出来了,我们发送一条消息——需要指定URI(必要的话需要指定协议、主机、端口号等),消息接收方必须在这个指定的URI上。如果目标窗口被替换了,消息将不会发出。

我们同时创建了一个事件监听器来接收反馈信息。有一点极其重要,你一定要验证消息的来源的URI!只有在目标方合法的情况才你才能处理它发来的消息。

如果是使用iframe,代码应该这样写:

//捕获iframe
var domain = 'http://scriptandstyle.com';
var iframe = document.getElementById('myIFrame').contentWindow;

//发送消息
setInterval(function(){
	var message = 'Hello!  The time is: ' + (new Date().getTime());
	console.log('blog.local:  sending message:  ' + message);
        //send the message and target URI
	iframe.postMessage(message,domain); 
},6000);

确保你使用的是iframe的 contentWindow属性,而不是节点对象。

数据接收端

下面我们要开发的是数据接收端的页面。接收方窗口里有一个事件监听器,监听“message”事件,一样,你也需要验证消息来源方的地址。消息可以来自任何地址,要确保处理的消息是来自一个可信的地址。

//响应事件
window.addEventListener('message',function(event) {
	if(event.origin !== 'http://davidwalsh.name') return;
	console.log('message received:  ' + event.data,event);
	event.source.postMessage('holla back youngin!',event.origin);
},false);

上面的代码片段是往消息源反馈信息,确认消息已经收到。下面是几个比较重要的事件属性:

  • source – 消息源,消息的发送窗口/iframe。
  • origin – 消息源的URI(可能包含协议、域名和端口),用来验证数据源。
  • data – 发送方发送给接收方的数据。

这三个属性是消息传输中必须用到的数据。

使用window.postMessage

跟其他很web技术一样,如果你不校验数据源的合法性,那使用这种技术将会变得很危险;你的应用的安全需要你对它负责。 window.postMessage就像是PHP相对于JavaScript技术。 window.postMessage很酷,不是吗?

原文来自: webhek

相关 [html5 window.postmessage 网页] 推荐:

用HTML5里的window.postMessage在两个网页间传递数据

- - WebHek
估计很少人知道HTML5 APIS里有一个 window.postMessage API. window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息. 基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信. 让我们来看一下 window.postMessage是如何工作的.

HTML5如何用window.postMessage在网页间传递数据

- - HTML5资源教程
估计很少人知道 HTML5 APIS里有一个window.postMessage API. window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息. 基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信. 让我们来看一下 window.postMessage是如何工作的.

HTML5和CSS3:网页设计的框架

- 壮壮爱 - 译言-每日精品译文推荐
来源HTML5 and CSS3: Wireframing in the final product. 框架是Photoshop和网页经典的比较之处. 现有的框架和原型工具不能准确体现网站的需求. 静态设计的网站不能在web浏览器上浏览. 而且当你完成网站最终建设,网页上一些元素看起来和草稿中相对应元素不完全一样,客户端会发现那些字体定位上的细微的区别.

Radi: Mac上的HTML5可视化网页编辑器

- 虫虫 - 36氪
Radi是一个Mac平台上的网页制作工具,以用来制作各种可视化内容,比如图片、动画、视频、曲线图、JavaScript等. 有了Radi,即便不会写代码你也可以制作HTML5网页, Radi从一开始就可以让你充分利用HTML5的功能,比如多媒体支持和即时图案等,对video 和canvas 元素的支持非常好.

基于HTML5 的网页APP时代即将到来?

- Feng - Tech2IPO
去年的这个时候我发博文表示我很看好 HTML5 移动网页APP的前景. 网页上的APP时代超过了我之前的预想. Kindle 已经可以再浏览器中使用了,下面是在safari 上我的图书馆:. 和Kindle  APP一样,我也可以在线下载后阅读. 我的朋友Etsy也在 Android推出了她的 HTML5 主题页面,这是在我手机上的页面效果:.

Adobe发布HTML5网页动画工具{Adobe Edge}

- Zen - 36氪
Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具{Adobe Edge},允许设计师通过HTML5、CSS和JavaScript制作网页动画. Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.

Adobe 发布 HTML5 网页动画工具 Adobe Edge

- Joji - ITeye资讯频道
    Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具Adobe Edge,允许设计师通过HTML5、CSS和JavaScript制作网页动画,无需Flash.     Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.

IBM发布开源HTML5网页编辑工具Maqetta

- jiwei - Solidot
IBM推出了一个基于浏览器的开源HTML5网页编辑工具Maqetta,支持Google Chrome、Mozilla Firefox 3.5+(推荐Firefox 4)和Mac Safari 5,为用户体验设计师提供了一个可见即可得的可视化编辑环境. Maqetta目前发布了Preview 1版,可以在浏览器上直接使用,无需安装任何插件,用户也可以选择下载和安装到自己的服务器上.

Radi: Mac上的HTML5可视化网页编辑器

- sunzengzhang - FeedzShare
来自: 36氪 - FeedzShare  . 发布时间:2011年08月03日,  已有 2 人推荐. Radi是一个Mac平台上的网页制作工具,以用来制作各种可视化内容,比如图片、动画、视频、曲线图、JavaScript等. 有了Radi,即便不会写代码你也可以制作HTML5网页, Radi从一开始就可以让你充分利用HTML5的功能,比如多媒体支持和即时图案等,对video 和canvas 元素的支持非常好.

Adobe发布HTML5网页动画工具Adobe Edge

- XcessLeo - GeekPark 捕风捉影
Flash VS HTML5之争似乎即将见分晓. Adobe刚刚发布了一个新的工具{Adobe Edge},允许设计师通过HTML5、CSS和JavaScript制作网页动画. Adboe Edge的目的是帮助专业设计师制作网页动画乃至简单游戏. 目前该工具的重点放在动画引擎上,但未来将增加更多HTML5功能,比如Canvas、HTML5音频/视频标签等.