這篇文章主要介紹H5中如何使用postMessage實(shí)現(xiàn)兩個(gè)網(wǎng)頁(yè)間傳遞數(shù)據(jù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在解放等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,解放網(wǎng)站建設(shè)費(fèi)用合理。
估計(jì)很少人知道HTML5 APIS里有一個(gè)window.postMessage API。window.postMessage的功能是允許程序員跨域在兩個(gè)窗口/frames間發(fā)送數(shù)據(jù)信息?;旧?,它就像是跨域的AJAX,但不是瀏覽器跟服務(wù)器之間交互,而是在兩個(gè)客戶端之間通信。讓我們來(lái)看一下window.postMessage是如何工作的。除了IE6、IE7之外的所有瀏覽器都支持這個(gè)功能。
數(shù)據(jù)發(fā)送端
首先我們要做的是創(chuàng)建通信發(fā)起端,也就是數(shù)據(jù)源”source”。作為發(fā)起端,我們可以open一個(gè)新窗口,或創(chuàng)建一個(gè)iframe,往新窗口里發(fā)送數(shù)據(jù),簡(jiǎn)單起見(jiàn),我們每6秒鐘發(fā)送一次,然后創(chuàng)建消息監(jiān)聽(tīng)器,從目標(biāo)窗口監(jiān)聽(tīng)它反饋的信息。
//彈出一個(gè)新窗口 var domain = 'http://scriptandstyle.com'; var myPopup = window.open(domain + '/windowPostMessageListener.html','myWindow'); //周期性的發(fā)送消息 setInterval(function(){ var message = 'Hello! The time is: ' + (new Date().getTime()); console.log('blog.local: sending message: ' + message); //send the message and target URI myPopup.postMessage(message,domain); },6000); //監(jiān)聽(tīng)消息反饋 window.addEventListener('message',function(event) { if(event.origin !== 'http://scriptandstyle.com') return; console.log('received response: ',event.data); },false);
這里我使用了window.addEventListener,但在IE里這樣是不行的,因?yàn)镮E使用window.attachEvent。如果你不想判斷瀏覽器的類型,可以使用一些工具庫(kù),比如jQuery或Dojo。
假設(shè)你的窗口正常的彈出來(lái)了,我們發(fā)送一條消息——需要指定URI(必要的話需要指定協(xié)議、主機(jī)、端口號(hào)等),消息接收方必須在這個(gè)指定的URI上。如果目標(biāo)窗口被替換了,消息將不會(huì)發(fā)出。
我們同時(shí)創(chuàng)建了一個(gè)事件監(jiān)聽(tīng)器來(lái)接收反饋信息。有一點(diǎn)極其重要,你一定要驗(yàn)證消息的來(lái)源的URI!只有在目標(biāo)方合法的情況才你才能處理它發(fā)來(lái)的消息。
如果是使用iframe,代碼應(yīng)該這樣寫(xiě):
//捕獲iframe var domain = 'http://scriptandstyle.com'; var iframe = document.getElementById('myIFrame').contentWindow; //發(fā)送消息 setInterval(function(){ var message = 'Hello! The time is: ' + (new Date().getTime()); console.log('blog.local: sending message: ' + message); //send the message and target URI iframe.postMessage(message,domain); },6000);
確保你使用的是iframe的contentWindow屬性,而不是節(jié)點(diǎn)對(duì)象。
數(shù)據(jù)接收端
下面我們要開(kāi)發(fā)的是數(shù)據(jù)接收端的頁(yè)面。接收方窗口里有一個(gè)事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)“message”事件,一樣,你也需要驗(yàn)證消息來(lái)源方的地址。消息可以來(lái)自任何地址,要確保處理的消息是來(lái)自一個(gè)可信的地址。
//響應(yīng)事件 window.addEventListener('message',function(event) { if(event.origin !== 'http://davidwalsh.name') 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ù)。
這三個(gè)屬性是消息傳輸中必須用到的數(shù)據(jù)。
使用window.postMessage
跟其他很web技術(shù)一樣,如果你不校驗(yàn)數(shù)據(jù)源的合法性,那使用這種技術(shù)將會(huì)變得很危險(xiǎn);你的應(yīng)用的安全需要你對(duì)它負(fù)責(zé)。window.postMessage就像是PHP相對(duì)于JavaScript技術(shù)。window.postMessage很酷,不是嗎?
以上是H5中如何使用postMessage實(shí)現(xiàn)兩個(gè)網(wǎng)頁(yè)間傳遞數(shù)據(jù)的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!