HTML5中的postMessage API基本使用教程


关于postMessage

window.postMessage虽然说是html5的功能,但是支持IE8+,假如你的网站不需要支持IE6和IE7,那么可以使用window.postMessage。关于window.postMessage,很多朋友说他可以支持跨域,不错,window.postMessage是客户端和客户端直接的数据传递,既可以跨域传递,也可以同域传递。

应用场景

我只是简单的举一个应用场景,当然,这个功能很多地方可以使用。

假如你有一个页面,页面中拿到部分用户信息,点击进入另外一个页面,另外的页面默认是取不到用户信息的,你可以通过window.postMessage把部分用户信息传到这个页面中。(当然,你要考虑安全性等方面。)

代码举例

发送信息:

JavaScript Code复制内容到剪贴板
  1. //弹出一个新窗口   
  2. var domain = 'http://haorooms.com';   
  3. var myPopup = window.open(domain    
  4.             + '/windowPostMessageListener.html','myWindow');   
  5.   
  6. //周期性的发送消息   
  7. setTimeout(function(){   
  8.     //var message = '当前时间是 ' + (new Date().getTime());    
  9.         var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等   
  10.     console.log('传递的数据是  ' + message);   
  11.     myPopup.postMessage(message,domain);   
  12. },1000);  

要延迟一下,我们一般用计时器setTimeout延迟再发用。

接受的页面

JavaScript Code复制内容到剪贴板
  1. //监听消息反馈   
  2. window.addEventListener('message',function(event) {   
  3.     if(event.origin !== 'http://haorooms.com'return; //这个判断一下是不是我这个域名跳转过来的   
  4.     console.log('received response:  ',event.data);   
  5. },false);  

如下图,接受页面得到数据

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

JavaScript Code复制内容到剪贴板
  1. //捕获iframe   
  2. var domain = 'http://haorooms.com';   
  3. var iframe = document.getElementById('myIFrame').contentWindow;   
  4.   
  5. //发送消息   
  6. setTimeout(function(){   
  7.     //var message = '当前时间是 ' + (new Date().getTime());    
  8.         var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等   
  9.     console.log('传递的数据是:  ' + message);   
  10.         //send the message and target URI   
  11.     iframe.postMessage(message,domain);    
  12. },1000);  

接受数据

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

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

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

调用实例
1. 主线程中创建 Worker 实例,并监听 onmessage 事件

JavaScript Code复制内容到剪贴板
  1. <html>    
  2. <head>    
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">    
  4. <title>Test Web worker</title>    
  5. <script type="text/JavaScript">    
  6.  function init(){    
  7.   var worker = new Worker('compute.js');    
  8.   //event 参数中有 data 属性,就是子线程中返回的结果数据   
  9.   worker.onmessage= function (event) {    
  10.    // 把子线程返回的结果添加到 div 上   
  11.    document.getElementById("result").innerHTML +=    
  12.       event.data+"<br/>";    
  13.   };    
  14.  }    
  15. </script>    
  16. </head>    
  17. <body onload="init()">    
  18. <div id="result"></div>    
  19. </body>    
  20. </html>  

在客户端的 compute.js 中,只是简单的重复多次加和操作,最后通过 postMessage 方法把结果返回给主线程,目的就是等待一段时间。而在这段时间内,主线程不应该被阻塞,用户可以通过拖拽浏览器,变大缩小浏览器窗口等操作测试这一现象。这个非阻塞主线程的结果就是 Web Workers 想达到的目的。

2. compute.js 中调用 postMessage 方法返回计算结果

JavaScript Code复制内容到剪贴板
  1. var i=0;    
  2.   
  3. function timedCount(){    
  4.  for(var j=0,sum=0;j<100;j++){    
  5.   for(var i=0;i<100000000;i++){    
  6.    sum+=i;    
  7.   }    
  8.  }    
  9.  // 调用 postMessage 向主线程发送消息   
  10.  postMessage(sum);    
  11. }    
  12.   
  13. postMessage("Before computing,"+new Date());    
  14. timedCount();    
  15. postMessage("After computing,"+new Date());  



相关阅读:
php中smarty模板条件判断用法实例
HTML5新增的Css选择器、伪类介绍
JavaScript字符串常用的方法
Javascript玩转继承(二)
jQuery事件绑定与解除绑定实现方法
一行命令搞定node.js 版本升级
ThinkPHP模板替换与系统常量及应用实例教程
举例说明如何为JavaScript的方法参数设置默认值
Win8如何使用自带的开始屏幕上的SkyDrive应用
Win8系统单击变双击怎么修复 Win8系统单击变双击修复方法
如何实现修改密码时密码框显示保存到cookie的密码
php限制上传文件类型并保存上传文件的方法
解析javascript中鼠标滚轮事件
升级Win10遭遇错误代码0xc0000017的解决办法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 怨天尤人难翻身 我的梦——中国梦 难忘的张丽霞老师 入团志愿书范文600字 记叙文范文:童年的味道 当往事不再回首 深爱一个人而永远不去伤害她 百家讲坛最佳学术主讲人王立群经典语录大全摘抄 在全市招商引资外经外贸暨民营经济总结表彰大会上的讲话 鸽子作文300字 最美的一道风景 我经历的事作文600字 托管事业部二O一二年年度工作总结 初中初一作文350字:蚊子为什么"喜欢"我? 那年她笑颜如花 【候翔原创】 读书200字作文 初中初一作文150字:芳香中略带一丝仇恨 年华末端 行香子 意难逢 月季花开了 喜爱作文500字 2011第一场雪 亲爱的张老师作文1300字 感人日志,对你的爱,永不停歇 保护小动物作文200字 寒假社会实践调查报告(高中生人际关系处理) 三月的情诗(22) 第二回 杨圣使针灸治哑 小银猿远游求道 莫愁湖作文 小学六年级作文600字:无赖 海上的婚礼 一种戒不掉的瘾——外遇 拥抱绿色作文600字 纪检监察干部关于创新工作的演讲稿 叔叔的爱好作文200字 日语翻译面试 清明扫墓由来 《圆梦巨人》:奇幻世界,斯皮尔伯格的神奇和低调 春季运动会讲话稿 小学四年级作文400字:两棵柳树 小学四年级作文350字:带你游玩美丽的花果山 读《十六年前的回忆》有感作文750字 中秋节对父母的祝福短信 廉政教育情景剧剧本 愿一切都安好,一切都幸福 谢谢你们,爸爸妈妈作文500字 阳光暖暖的作文1200字 韦应物的代表作 区委常委班子“三严三实”专题民主生活会讲话稿 《六项精进》读后感1000字

Copyright © 2016 phpStudy |