HTML5中的postMessage API基本使用教程

關于postMessage
window.postMessage雖然說是html5的功能,但是支持IE8+,假如你的網站不需要支持IE6和IE7,那么可以使用window.postMessage。關于window.postMessage,很多朋友說他可以支持跨域,不錯,window.postMessage是客戶端和客戶端直接的數據傳遞,既可以跨域傳遞,也可以同域傳遞。
應用場景
我只是簡單的舉一個應用場景,當然,這個功能很多地方可以使用。
假如你有一個頁面,頁面中拿到部分用戶信息,點擊進入另外一個頁面,另外的頁面默認是取不到用戶信息的,你可以通過window.postMessage把部分用戶信息傳到這個頁面中。(當然,你要考慮安全性等方面。)
代碼舉例
發(fā)送信息:
- //彈出一個新窗口
- var domain = 'http://haorooms.com';
- var myPopup = window.open(domain
- + '/windowPostMessageListener.html','myWindow');
- //周期性的發(fā)送消息
- setTimeout(function(){
- //var message = '當前時間是 ' + (new Date().getTime());
- var message = {name:"站點",sex:"男"}; //你在這里也可以傳遞一些數據,obj等
- console.log('傳遞的數據是 ' + message);
- myPopup.postMessage(message,domain);
- },1000);
要延遲一下,我們一般用計時器setTimeout延遲再發(fā)用。
接受的頁面
- 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;
- //發(fā)送消息
- 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 – 消息源,消息的發(fā)送窗口/iframe。
origin – 消息源的URI(可能包含協議、域名和端口),用來驗證數據源。
data – 發(fā)送方發(fā)送給接收方的數據。
調用實例
1. 主線程中創(chuàng)建 Worker 實例
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) {
- // 把子線程返回的結果添加到 div 上
- document.getElementById("result").innerHTML +=
- event.data+"<br/>";
- };
- }
- </script>
- </head>
- <body onload="init()">
- <div id="result"></div>
- </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 向主線程發(fā)送消息
- postMessage(sum);
- }
- postMessage("Before computing,"+new Date());
- timedCount();
- postMessage("After computing,"+new Date());
相關文章
- Microdata作為HTML5新增的一個特性,它允許開發(fā)者在HTML文檔中添加更多的語義信息,以便于搜索引擎和瀏覽器更好地理解頁面內容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
- 在HTML語法中,表格主要通過< table >、< tr >和< td >3個標簽構成,本文通過實例代碼講解HTML5表格語法格式,感興趣的朋友一起看看吧2025-04-21
- 這篇文章主要介紹了HTML5中使用媒體查詢和Flexbox進行響應式布局的方法,簡要介紹了CSS Grid布局的基礎知識和如何實現自動換行的網格布局,感興趣的朋友一起看看吧2025-04-21
基于Canvas的Html5多時區(qū)動態(tài)時鐘實戰(zhàn)代碼
本文介紹了如何使用Canvas在HTML5上實現一個多時區(qū)動態(tài)時鐘的web展示,通過Canvas的API,可以繪制出6個不同城市的時鐘,并且這些時鐘可以動態(tài)轉動,每個時鐘上都會標注出對應的2025-03-11- HTML5的自定義數據屬性(data-*)提供了一種標準化的方法在HTML元素上存儲額外信息,可以通過JavaScript訪問、修改和在CSS中使用,文章還介紹了高級用法,如存儲JSON數據、事2025-03-11
- 在HTML5中,下拉框(<select>標簽)作為表單的重要組成部分,為用戶提供了一個從預定義選項中選擇值的方式,本文將深入探討<select>標簽的屬性、樣式,并重點介2025-02-27
- 本文介紹了HTML5InputDatePicker對象表示HTML``元素,是HTML5中的新對象,介紹了日期、周、月份、時間、日期+時間、本地日期時間等不同類型的日期選擇器,感興趣的朋友一起看2025-02-17
- 本文介紹了HTML5中的超鏈接、相對路徑和圖片的使用方法,超鏈接可以創(chuàng)建指向另一個文檔或頁面內部書簽的鏈接,相對路徑用于在同一服務器內部跳轉頁面,圖片標簽用于引入外部圖2025-02-17
- 本文介紹了HTML5超鏈接的創(chuàng)建方法,包括基本語法、創(chuàng)建圖像超鏈接的邊框去除方法以及錨點鏈接的使用,還討論了超鏈接的四種不同狀態(tài)(link、visited、hover、active)的CSS樣2025-02-17
- 最近看一些技術網站發(fā)現了details 標簽的妙用,這個不用js即可實現展開/收縮信息,很方便用來讓用戶先才答案,然后下面點擊再給出答案的效果,這里就為大家簡單介紹一下,2024-11-03