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 交通频道 作文范文 【精品】2014年辅导员年终总结 有情不必终老 小学四年级作文400字:爬山记 未来的五十年“天降美食” 跌到了,要自己爬起来 夫妻就是搞笑之家 创意高考祝福语 较量650字 清风明月,自然真实 小学三年级作文350字:谁的功劳大 甜蜜的陷阱 安然的落 学校关工委工作细则 梦沧海 作文50字 物业公司年度工作计划最新 大声地哭吧--读《一公升的眼泪》有感 ××管委领导在在景区工商行政管理工作会议上的讲话 浮夸的生命里,我有你们这样特别的存在。 十八届五中全会精神心得体会500字 乘车奇遇 标点家族的争吵作文200字 心内心外 高中生寒假社会实践职业体验感悟 最痛苦的不是分别,而分别后,回忆根深蒂固 梅兰芳把京剧推向世界 给母亲的生日祝福语 党员教师 群众路线教育实践活动心得体会 听着旋律的情歌,怀念曾经的你! 青衣 我发现了豆芽的生长 被遗忘的土地庙 精灵一族 教学工作计划 (英语) 春日游 预算初学者应注意哪些? 艰难的选择作文600字 如约 酒托 难忘的一天英语作文 月夜畅想 小学四年级作文500字:学校的新花坛 局长在全县防汛抗旱及地质灾害防治工作会议上的讲话 物流专业实习报告模版 小学五年级作文450字:钓鱼的“道理” 政务副主任工作总结 等待电话 邂逅李广墓 送陈七赴西军 赏析 河南科技大学农学院赴洛阳市留守老人关爱服务团圆满完成2016年暑期社会实践活动 今天我是升旗手读后感

Copyright © 2016 phpStudy |