HTML5中的postMessage API基本使用教程
關(guān)于postMessage
window.postMessage雖然說(shuō)是html5的功能,但是支持IE8+,假如你的網(wǎng)站不需要支持IE6和IE7,那么可以使用window.postMessage。關(guān)于window.postMessage,很多朋友說(shuō)他可以支持跨域,不錯(cuò),window.postMessage是客戶端和客戶端直接的數(shù)據(jù)傳遞,既可以跨域傳遞,也可以同域傳遞。
應(yīng)用場(chǎng)景
我只是簡(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ā)送信息:
- //彈出一個(gè)新窗口
- var domain = 'http://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è)面
- window.addEventListener('message',function(event) {
- if(event.origin !== 'http://haorooms.com') return; //這個(gè)判斷一下是不是我這個(gè)域名跳轉(zhuǎn)過(guò)來(lái)的
- console.log('received response: ',event.data);
- },false);
如下圖,接受頁(yè)面得到數(shù)據(jù)
如果是使用iframe,代碼應(yīng)該這樣寫(xiě):
- //捕獲iframe
- var domain = 'http://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ù)
- //響應(yīng)事件
- 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);
上面的代碼片段是往消息源反饋信息,確認(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í)例
1. 主線程中創(chuàng)建 Worker 實(shí)例
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é)果添加到 div 上
- document.getElementById("result").innerHTML +=
- event.data+"<br/>";
- };
- }
- </script>
- </head>
- <body onload="init()">
- <div id="result"></div>
- </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á)到的目的。
2. compute.js 中調(diào)用 postMessage 方法返回計(jì)算結(jié)果
- 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());
相關(guān)文章

HTML5實(shí)現(xiàn)的移動(dòng)端購(gòu)物車自動(dòng)結(jié)算功能示例代碼
本文介紹HTML5實(shí)現(xiàn)移動(dòng)端購(gòu)物車自動(dòng)結(jié)算,通過(guò)WebStorage、事件監(jiān)聽(tīng)、DOM操作等技術(shù),確保實(shí)時(shí)更新與數(shù)據(jù)同步,優(yōu)化性能及無(wú)障礙性,提升用戶體驗(yàn),感興趣的朋友一起看看吧2025-06-18- 在HTML5中,<button>標(biāo)簽用于定義一個(gè)可點(diǎn)擊的按鈕,它是創(chuàng)建交互式網(wǎng)頁(yè)的重要元素之一,本文將深入解析HTML5中的<button>標(biāo)簽,詳細(xì)介紹其屬性、樣式以及實(shí)際2025-06-18
基于 HTML5 Canvas 實(shí)現(xiàn)圖片旋轉(zhuǎn)與下載功能(完整代碼展示)
本文將深入剖析一段基于 HTML5 Canvas 的代碼,該代碼實(shí)現(xiàn)了圖片的旋轉(zhuǎn)(90 度和 180 度)以及旋轉(zhuǎn)后圖片的下載功能,通過(guò)對(duì)代碼的解讀,我們可以學(xué)習(xí)到如何利用 Canvas API2025-06-18
HTML5 getUserMedia API網(wǎng)頁(yè)錄音實(shí)現(xiàn)指南示例小結(jié)
本教程將指導(dǎo)你如何利用這一API,結(jié)合Web Audio API,實(shí)現(xiàn)網(wǎng)頁(yè)錄音功能,從獲取音頻流到處理和保存錄音,整個(gè)過(guò)程將逐步詳解,此外,還討論了getUserMedia API的使用限制和最2025-06-16- HTML5的搜索框是一個(gè)強(qiáng)大的工具,能夠有效提升用戶體驗(yàn),通過(guò)結(jié)合自動(dòng)補(bǔ)全功能和適當(dāng)?shù)臉邮剑梢詣?chuàng)建出既美觀又實(shí)用的搜索界面,這篇文章給大家介紹HTML5 搜索框Search Box2025-06-13
- Checkbox是HTML5中非常重要的表單元素之一,通過(guò)合理使用其屬性和樣式自定義方法,可以為用戶提供豐富多樣的交互體驗(yàn),這篇文章給大家介紹HTML5中Checkbox標(biāo)簽的深入全面解2025-06-13
HTML5無(wú)插件拖拽圖片上傳功能實(shí)現(xiàn)過(guò)程
本實(shí)例展示了一種基于HTML5技術(shù)的圖片上傳功能,無(wú)需外部插件即可通過(guò)拖放圖片實(shí)現(xiàn)上傳,涉及到HTML5的拖放API和File API,以及使用CSS來(lái)增強(qiáng)用戶界面的交互性和視覺(jué)反饋,2025-05-16HTML5 定位大全之相對(duì)定位、絕對(duì)定位和固定定位
在HTML5和CSS中,定位(positioning)是控制元素在頁(yè)面上位置的重要機(jī)制,主要有四種定位方式:靜態(tài)定位(static)、相對(duì)定位(relative)、絕對(duì)定位(absolute)和固定定位(fixed),2025-05-13- Microdata作為HTML5新增的一個(gè)特性,它允許開(kāi)發(fā)者在HTML文檔中添加更多的語(yǔ)義信息,以便于搜索引擎和瀏覽器更好地理解頁(yè)面內(nèi)容,本文將探討HTML5中Microdata的使用方法以及2025-04-21
在HTML語(yǔ)法中,表格主要通過(guò)< table >、< tr >和< td >3個(gè)標(biāo)簽構(gòu)成,本文通過(guò)實(shí)例代碼講解HTML5表格語(yǔ)法格式,感興趣的朋友一起看看吧2025-04-21




