window.postMessage經常被人們利用來做跨域資料傳遞,下面將為大家來介紹HTML5中的postMessage API基本使用教程,需要的朋友可以參考下
關於postMessage
window.postMessage雖然說是html5的功能,但是支援IE8+,假如你的網站不需要支援IE6和IE7 ,那麼可以使用window.postMessage。關於window.postMessage,很多朋友說他可以支援跨域,不錯,window.postMessage是客戶端和客戶端直接的資料傳遞,既可以跨域傳遞,也可以同域傳遞。
應用場景
我只是簡單的舉一個應用場景,當然,這個功能很多地方可以使用。
假如你有一個頁面,頁面中拿到部分用戶信息,點擊進入另外一個頁面,另外的頁面默認是取不到用戶信息的,你可以通過window.postMessage把部分用戶信息傳到這個頁面中。 (當然,你要考慮安全性等方面。)
程式碼範例
##發送訊息:JavaScript Code复制内容到剪贴板 //弹出一个新窗口 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);
JavaScript Code复制内容到剪贴板 //监听消息反馈 window.addEventListener('message',function(event) { if(event.origin !== 'http://haorooms.com') return; //这个判断一下是不是我这个域名跳转过来的 console.log('received response: ',event.data); },false);
JavaScript Code复制内容到剪贴板 //捕获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);
##接受資料
JavaScript Code复制内容到剪贴板 //响应事件 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 事件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 想達到的目的。
2. 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());
以上是HTML5中的postMessage API基本上使用方法分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!