H5里的postMessage API圖文詳細(xì)說(shuō)明 詳細(xì)說(shuō)明
發(fā)表時(shí)間:2023-12-24 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]關(guān)于postMessage,雖然說(shuō)是html5的功能但是支持IE8+,假如你的網(wǎng)站不需要支持IE6和IE7,那么可以使用window.postMessage。既可以跨域傳遞,也可以同域傳遞。我只是簡(jiǎn)單的舉一個(gè)應(yīng)用場(chǎng)景,當(dāng)然,這個(gè)功能很多地方可以使用。假如你有一個(gè)頁(yè)面,頁(yè)面中拿到部分用戶信息,點(diǎn)擊進(jìn)...
關(guān)于postMessage,雖然說(shuō)是html5的功能但是支持IE8+,假如你的網(wǎng)站不需要支持IE6和IE7,那么可以使用window.postMessage。既可以跨域傳遞,也可以同域傳遞。
我只是簡(jiǎn)單的舉一個(gè)應(yīng)用場(chǎng)景,當(dāng)然,這個(gè)功能很多地方可以使用。
假如你有一個(gè)頁(yè)面,頁(yè)面中拿到部分用戶信息,點(diǎn)擊進(jìn)入另外一個(gè)頁(yè)面,另外的頁(yè)面默認(rèn)是取不到用戶信息的,你可以通過(guò)window.postMessage把部分用戶信息傳到這個(gè)頁(yè)面中。(當(dāng)然,你要考慮安全性等方面。)
代碼舉例
發(fā)送信息:
JavaScript Code復(fù)制內(nèi)容到剪貼板
//彈出一個(gè)新窗口
var domain = 'https://haorooms.com';
var myPopup = window.open(domain
+ '/windowPostMessageListener.html','myWindow');
//周期性的發(fā)送消息
setTimeout(function(){
//var message = '當(dāng)前時(shí)間是 ' + (new Date().getTime());
var message = {name:"站點(diǎn)",sex:"男"}; //你在這里也可以傳遞一些數(shù)據(jù),obj等
console.log('傳遞的數(shù)據(jù)是 ' + message);
myPopup.postMessage(message,domain);
},1000);
要延遲一下,我們一般用計(jì)時(shí)器setTimeout延遲再發(fā)用。
接受的頁(yè)面
JavaScript Code復(fù)制內(nèi)容到剪貼板
//監(jiān)聽(tīng)消息反饋
window.addEventListener('message',function(event) {
if(event.origin !== 'https://haorooms.com') return; //這個(gè)判斷一下是不是我這個(gè)域名跳轉(zhuǎn)過(guò)來(lái)的
console.log('received response: ',event.data);
},false);
如下圖,接受頁(yè)面得到數(shù)據(jù)
如果是使用iframe,代碼應(yīng)該這樣寫(xiě):
JavaScript Code復(fù)制內(nèi)容到剪貼板
//捕獲iframe
var domain = 'https://haorooms.com';
var iframe = document.getElementById('myIFrame').contentWindow;
//發(fā)送消息
setTimeout(function(){
//var message = '當(dāng)前時(shí)間是 ' + (new Date().getTime());
var message = {name:"站點(diǎn)",sex:"男"}; //你在這里也可以傳遞一些數(shù)據(jù),obj等
console.log('傳遞的數(shù)據(jù)是: ' + message);
//send the message and target URI
iframe.postMessage(message,domain);
},1000);
接受數(shù)據(jù)
JavaScript Code復(fù)制內(nèi)容到剪貼板
//響應(yīng)事件
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);
上面的代碼片段是往消息源反饋信息,確認(rèn)消息已經(jīng)收到。下面是幾個(gè)比較重要的事件屬性:
source – 消息源,消息的發(fā)送窗口/iframe。
origin – 消息源的URI(可能包含協(xié)議、域名和端口),用來(lái)驗(yàn)證數(shù)據(jù)源。
data – 發(fā)送方發(fā)送給接收方的數(shù)據(jù)。
調(diào)用實(shí)例
主線程中創(chuàng)建 Worker 實(shí)例,并監(jiān)聽(tīng) onmessage 事件
JavaScript Code復(fù)制內(nèi)容到剪貼板
<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 參數(shù)中有 data 屬性,就是子線程中返回的結(jié)果數(shù)據(jù)
worker.onmessage= function (event) {
// 把子線程返回的結(jié)果添加到 p 上
document.getElementById("result").innerHTML +=
event.data+"<br/>";
};
}
</script>
</head>
<body onload="init()">
<p id="result"></p>
</body>
</html>
在客戶端的 compute.js 中,只是簡(jiǎn)單的重復(fù)多次加和操作,最后通過(guò) postMessage 方法把結(jié)果返回給主線程,目的就是等待一段時(shí)間。而在這段時(shí)間內(nèi),主線程不應(yīng)該被阻塞,用戶可以通過(guò)拖拽瀏覽器,變大縮小瀏覽器窗口等操作測(cè)試這一現(xiàn)象。這個(gè)非阻塞主線程的結(jié)果就是 Web Workers 想達(dá)到的目的。
compute.js 中調(diào)用 postMessage 方法返回計(jì)算結(jié)果
JavaScript Code復(fù)制內(nèi)容到剪貼板
var i=0;
function timedCount(){
for(var j=0,sum=0;j<100;j++){
for(var i=0;i<100000000;i++){
sum+=i;
}
}
// 調(diào)用 postMessage 向主線程發(fā)送消息
postMessage(sum);
}
postMessage("Before computing,"+new Date());
timedCount();
postMessage("After computing,"+new Date());
相信看了這些案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
相關(guān)閱讀:
用Js操作HTTP的Cookie的實(shí)現(xiàn)步驟
html 邊框虛線的實(shí)現(xiàn)步驟
AJAX的常用語(yǔ)法是什么
以上就是H5里的postMessage API圖文詳解 詳細(xì)介紹的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語(yǔ),涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。