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


估计很少人知道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很酷,不是吗?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。



相关阅读:
Java实现SSH模式加密
Mac系统如何共享扫描仪?苹果电脑Mac设置网络共享扫描仪教程
Win10系统无法识别USB设备的解决方法
jquery的ajax简单结构示例代码
基于自定义Unity生存期模型PerCallContextLifeTimeManager的问题
jquery实现不同大小浏览器使用不同的css样式表的方法
iOS中UIImagePickerController图片选取器的用法小结
iOS App的设计模式开发中对State状态模式的运用
javaweb实战之商城项目开发(二)
C++非递归建立二叉树实例
简单介绍C语言中的umask()函数和truncate()函数
win8.1关机变重启怎么办?Win8.1点了关机键却重启的解决办法介绍
Mongodb安装与配置笔记
jQuery选择器源码解读(三):tokenize方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 追思 参观汽车博物馆 小学五年级作文400字:难忘的目光 2013年11月份教师入党积极分子思想汇报材料范文 形容很感动的好句子 心中的许愿树 祝福母亲节快乐的话 高中高二作文350字:老师的火眼金睛 爱,如兰的馨香 农机4S店探讨 记忆是会呼吸的痛 六月400字作文 美丽在落叶凋谢时 女人装点傻,也是一种智慧! 一句难忘的格言450字 垃圾箱里的诉说 西餐厅服务员寒假社会实践报告 光棍节伤感句子 最牛的励志心情短语精选 2013年07月30日 01时49分16秒 那一座孤寂的城,倾了谁的一生 写水的诗句 新任学生会主席就职演讲稿 飘落在雪花的岁末 简静:一个人,去盛享生命的清幽 一个人,一杯子 — 属于我的专属 一串骊珠成语接龙 大学2014年度共青团调研活动实施方案_工作方案 小院的春色作文500字 xx市安全生产监督管理局2016工作要点 超市辞职报告怎么写 难忘的您作文700字 夸老公的话 秋水广场作文700字 XX县在京人员联谊会主持词 《高尚人格为何能够永垂不朽》主题单元设计 爱的眼睛作文 宽容 县人大2005年度工作报告 感怀诗一组 交通安全寄语精选 一转眼便是一个花开又落,找不回的过去 论如何写好毕业论文_写作指导 小学生的节约作文范文:节约小窍门 《世间最美的坟墓》课件3.rar(680)k(会员上传) 我真开心作文300字 活泼可爱的我作文400字 网络诗词創作选编续作(十三) 医院财务科工作总结与工作计划 大一学生开学自我介绍范文

Copyright © 2016 phpStudy |