H5裡的postMessage API圖文詳解 詳細介紹

php中世界最好的语言
發布: 2017-12-02 14:45:05
原創
3736 人瀏覽過

關於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(&#39;compute.js&#39;);    
  //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());
登入後複製


##相信看了這些案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

相關閱讀:

以Js操作HTTP的Cookie的實作步驟


html 邊框虛線的實作步驟


AJAX的常用語法是什麼

#

以上是H5裡的postMessage API圖文詳解 詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板