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 相关文章推荐
分享CSS3制作卡片式图片的方法
Jul 08 HTML / CSS
HTML5中的postMessage API基本使用教程
May 20 HTML / CSS
把富文本的回车转为br标签
Aug 09 HTML / CSS
HTML5边玩边学(1)画布实现方法
Sep 21 HTML / CSS
html5 兼容IE6结构的实现代码
May 14 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
Jan 30 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
Apr 30 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
Mar 17 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
Aug 20 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 HTML / CSS
血轮眼轮回眼特效 html+css
Mar 31 HTML / CSS
不要在HTML中滥用div
May 08 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中的时间显示
2007/01/18 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
用Python编写简单的微博爬虫
2016/03/04 Python
Python简单的制作图片验证码实例
2017/05/31 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
python如何实现一个刷网页小程序
2018/11/27 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
行政专员岗位职责
2014/01/02 职场文书
2014年学前班工作总结
2014/12/08 职场文书