在HTML5中新增了postMessage方法,postMessage能夠實現跨文檔消息傳輸(Cross Document Messaging),Internet Explorer 8, Firefox 3, Opera 9, Chrome 3和 Safari 4都支持postMessage。html
該方法能夠經過綁定window的message事件來監聽發送跨文檔消息傳輸內容。html5
1. postMessage是HTML5 XMLHttpRequest Level 2中的API,且是爲數很少能夠跨域操做的window屬性之一,它可用於解決如下方面的問題:跨域
a.) 頁面和其打開的新窗口的數據傳遞
b.) 多窗口之間消息傳遞
c.) 頁面與嵌套的iframe消息傳遞
d.) 上面三個場景的跨域數據傳遞瀏覽器
2. postMessage用法:dom
postMessage(data,origin)方法接受兩個參數
參數說明:post
data: html5規範支持任意基本類型或可複製的對象,但部分瀏覽器只支持字符串,因此傳參時最好用JSON.stringify()序列化。
origin: 協議+主機+端口號,也能夠設置爲"*",表示能夠傳遞給任意窗口,若是要指定和當前窗口同源的話設置爲"/"。spa
舉例說明: code
兩個頁面之間進行數據傳輸,postMessage示例:htm
我啓動了兩個ip地址來表明不一樣域名,頁面t_hotnotes_list.html插入以下代碼對象
<iframe id="iframe" src="http://10.73.154.73:8088/rbc/t/search_role.html" style="display:none;"></iframe> <script> var iframe = document.getElementById('iframe'); iframe.onload = function() { var data = { name: 'aym', type:'wuhan' }; // 向domain2傳送跨域數據 iframe.contentWindow.postMessage(JSON.stringify(data), 'http://10.73.154.73:8088'); }; // 接受domain2返回數據,這邊給延遲的緣由,由於同步傳輸時,頁面不必定立馬拿到數據,因此給延遲 setTimeout(function(){ window.addEventListener('message', function(e) { alert('data from domain2 sss ---> ' + e.data); }, false); },10) </script>
頁面search_role.html插入以下代碼:
<script> // 接收domain1的數據 window.addEventListener('message', function(e) { console.log(e.data); var data = JSON.parse(e.data); if (data) { data.number = 16; data.age = 89; data.icon = 'sfafdafdafasdf'; // 處理後再發回domain1 window.parent.postMessage(JSON.stringify(data), 'http://10.73.154.72:8088'); } }, false); </script>
當兩個服務啓動以後,咱們在瀏覽器中打開頁面t_hotnotes_list.html
http://10.73.154.72:8088/rbc/t/t_hotnotes_list.html
獲得以下圖結果,t_hotnotes_list.html獲得兩個頁面的數據