關(guān)于postMessage
window.postMessage雖然說是html5的功能,但是支持IE8+,假如你的網(wǎng)站不需要支持IE6和IE7,那么可以使用window.postMessage。關(guān)于window.postMessage,很多朋友說他可以支持跨域,不錯(cuò),window.postMessage是客戶端和客戶端直接的數(shù)據(jù)傳遞,既可以跨域傳遞,也可以同域傳遞。
應(yīng)用場景
我只是簡單的舉一個(gè)應(yīng)用場景,當(dāng)然,這個(gè)功能很多地方可以使用。
假如你有一個(gè)頁面,頁面中拿到部分用戶信息,點(diǎn)擊進(jìn)入另外一個(gè)頁面,另外的頁面默認(rèn)是取不到用戶信息的,你可以通過window.postMessage把部分用戶信息傳到這個(gè)頁面中。(當(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ā)用。
接受的頁面
//監(jiān)聽消息反饋 window.addEventListener( message ,function(event) { if(event.origin !== http://haorooms.com ) return; //這個(gè)判斷一下是不是我這個(gè)域名跳轉(zhuǎn)過來的 console.log( received response: ,event.data); },false);如下圖,接受頁面得到數(shù)據(jù)

如果是使用iframe,代碼應(yīng)該這樣寫:
//捕獲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é)議、域名和端口),用來驗(yàn)證數(shù)據(jù)源。
data – 發(fā)送方發(fā)送給接收方的數(shù)據(jù)。
調(diào)用實(shí)例
1. 主線程中創(chuàng)建 Worker 實(shí)例,并監(jiān)聽 onmessage 事件
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 中,只是簡單的重復(fù)多次加和操作,最后通過 postMessage 方法把結(jié)果返回給主線程,目的就是等待一段時(shí)間。而在這段時(shí)間內(nèi),主線程不應(yīng)該被阻塞,用戶可以通過拖拽瀏覽器,變大縮小瀏覽器窗口等操作測試這一現(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 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());以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,更多相關(guān)內(nèi)容請關(guān)注PHP !
相關(guān)推薦:
新增HTML5的八類INPUT輸入
如何用HTML5操作WebSQL數(shù)據(jù)庫
以上就是HTML5中postMessage API的基本使用的詳細(xì)內(nèi)容,html教程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
|
新聞熱點(diǎn)
疑難解答
圖片精選