视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
HTML5中postMessageAPI的基本使用
2020-11-27 15:25:06 责编:小OO
文档
 window.postMessage经常被人们利用来做跨域数据传递,下面将为大家来介绍HTML5中的postMessage API基本使用教程,需要的朋友可以参考下

关于postMessage

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

应用场景

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

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

代码举例

发送信息:

//弹出一个新窗口 
var domain = 'http://haorooms.com'; 
var myPopup = window.open(domain 
 + '/windowPostMessageListener.html','myWindow'); 
 
//周期性的发送消息 
setTimeout(function(){ 
 //var message = '当前时间是 ' + (new Date().getTime()); 
 var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等 
 console.log('传递的数据是 ' + message); 
 myPopup.postMessage(message,domain); 
},1000);

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

接受的页面

//监听消息反馈 
window.addEventListener('message',function(event) { 
 if(event.origin !== 'http://haorooms.com') return; //这个判断一下是不是我这个域名跳转过来的 
 console.log('received response: ',event.data); 
},false);

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

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

//捕获iframe 
var domain = 'http://haorooms.com'; 
var iframe = document.getElementById('myIFrame').contentWindow; 
 
//发送消息 
setTimeout(function(){ 
 //var message = '当前时间是 ' + (new Date().getTime()); 
 var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等 
 console.log('传递的数据是: ' + message); 
 //send the message and target URI 
 iframe.postMessage(message,domain); 
},1000);

接受数据

//响应事件 
window.addEventListener('message',function(event) { 
 if(event.origin !== 'http://haorooms.com') return; 
 console.log('message received: ' + event.data,event); 
 event.source.postMessage('holla back youngin!',event.origin); 
},false);

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

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

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

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>Test Web worker</title> 
<script type="text/JavaScript"> 
 function init(){ 
 var worker = new Worker('compute.js'); 
 //event 参数中有 data 属性,就是子线程中返回的结果数据 
 worker.onmessage= function (event) { 
 // 把子线程返回的结果添加到 p 上 
 document.getElementById("result").innerHTML += 
 event.data+"<br/>"; 
 }; 
 } 
</script> 
</head> 
<body onload="init()"> 
<p id="result"></p> 
</body> 
</html>

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

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

var i=0; 
 
function timedCount(){ 
 for(var j=0,sum=0;j<100;j++){ 
 for(var i=0;i<100000000;i++){ 
 sum+=i; 
 } 
 } 
 // 调用 postMessage 向主线程发送消息 
 postMessage(sum); 
} 
 
postMessage("Before computing,"+new Date()); 
timedCount(); 
postMessage("After computing,"+new Date());

下载本文
显示全文
专题