视频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
H5里的postMessageAPI图文详解详细介绍
2020-11-27 15:27:29 责编:小采
文档

关于postMessage,虽然说是html5的功能但是支持IE8+,假如你的网站不需要支持IE6和IE7,那么可以使用window.postMessage。既可以跨域传递,也可以同域传递。

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

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

代码举例

发送信息:

JavaScript Code复制内容到剪贴板

//弹出一个新窗口 
var domain = 'https://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延迟再发用。

接受的页面

JavaScript Code复制内容到剪贴板

//监听消息反馈

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

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

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

JavaScript Code复制内容到剪贴板

//捕获iframe 
var domain = 'https://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);

接受数据

JavaScript Code复制内容到剪贴板

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

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

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

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

JavaScript Code复制内容到剪贴板

<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 想达到的目的。

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

JavaScript Code复制内容到剪贴板

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());

相信看了这些案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

相关阅读:

用Js操作HTTP的Cookie的实现步骤

html 边框虚线的实现步骤

AJAX的常用语法是什么

下载本文
显示全文
专题