HTML5中使用postMessage实现两个网页间传递数据


Posted in HTML / CSS onJune 22, 2016

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

数据发送端

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

JavaScript Code复制内容到剪贴板
  1. //弹出一个新窗口   
  2. var domain = 'http://scriptandstyle.com';   
  3. var myPopup = window.open(domain    
  4.             + '/windowPostMessageListener.html','myWindow');   
  5.   
  6. //周期性的发送消息   
  7. setInterval(function(){   
  8.  var message = 'Hello!  The time is: ' + (new Date().getTime());   
  9.  console.log('blog.local:  sending message:  ' + message);   
  10.         //send the message and target URI   
  11.  myPopup.postMessage(message,domain);   
  12. },6000);   
  13.   
  14. //监听消息反馈   
  15. window.addEventListener('message',function(event) {   
  16.  if(event.origin !== 'http://scriptandstyle.com'return;   
  17.  console.log('received response:  ',event.data);   
  18. },false);   
  19.   

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

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

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

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

JavaScript Code复制内容到剪贴板
  1. //捕获iframe   
  2. var domain = 'http://scriptandstyle.com';   
  3. var iframe = document.getElementById('myIFrame').contentWindow;   
  4.   
  5. //发送消息   
  6. setInterval(function(){   
  7.  var message = 'Hello!  The time is: ' + (new Date().getTime());   
  8.  console.log('blog.local:  sending message:  ' + message);   
  9.         //send the message and target URI   
  10.  iframe.postMessage(message,domain);    
  11. },6000);   
  12.   

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

数据接收端

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

JavaScript Code复制内容到剪贴板
  1. //响应事件   
  2. window.addEventListener('message',function(event) {   
  3.  if(event.origin !== 'http://davidwalsh.name'return;   
  4.  console.log('message received:  ' + event.data,event);   
  5.  event.source.postMessage('holla back youngin!',event.origin);   
  6. },false);   
  7.   

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

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

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

使用window.postMessage

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。
HTML / CSS 相关文章推荐
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
Dec 28 HTML / CSS
发现两个有趣的CSS3动画效果
Aug 14 HTML / CSS
浅谈cookie和localStorage那些事
Aug 27 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
Jan 06 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
Mar 12 HTML / CSS
探讨HTML5移动开发的几大特性(必看)
Dec 30 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
Jan 20 HTML / CSS
使用phonegap获取设备的一些信息方法
Mar 31 HTML / CSS
HTML5 WebSocket实现点对点聊天的示例代码
Jan 31 HTML / CSS
详解canvas绘图时遇到的跨域问题
Mar 22 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
Jun 15 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
Jul 21 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
Jun 22 #HTML / CSS
调用HTML5的Canvas API绘制图形的快速入门指南
Jun 17 #HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
Jun 16 #HTML / CSS
浅谈html5增强的页面元素
Jun 14 #HTML / CSS
HTML5 新标签全部总汇(推荐)
Jun 13 #HTML / CSS
HTML最新标准HTML5总结(必看)
Jun 13 #HTML / CSS
HTML5通用接口详解
Jun 12 #HTML / CSS
You might like
php 各种应用乱码问题的解决方法
2010/05/09 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
js判断节假日实例代码
2017/12/27 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
python 排列组合之itertools
2013/03/20 Python
linux 下实现python多版本安装实践
2014/11/18 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python 创建守护进程的示例
2020/09/29 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
大学毕业生通用自我评价
2014/01/05 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
小学美术教学反思
2014/02/01 职场文书
会计专业导师推荐信
2014/03/08 职场文书
单位消防安全责任书
2014/07/23 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python