postMessage()方法容許來自不一樣源的腳本採用異步方式進行有限的通訊,能夠實現跨文本檔、多窗口、跨域消息傳遞。html
postMessage的優勢html5
postMessage()方法容許來自不一樣源的腳本採用異步方式進行有限的通訊,能夠實現跨文本檔、多窗口、跨域消息傳遞。 postMessage(data,origin)方法接受兩個參數
json
例如:跨域
// A頁面 [http://a.com]
const data = document.getElementById('name').value;
window.frames[0].postMessage(data,'http://b.com');
複製代碼
在B頁面監聽message事件,獲取傳遞過來的數據瀏覽器
// B頁面 [http://b.com]
window.addEventListener('message', function(ev) {
// 當咱們是父子窗口進行消息傳遞時,可使用此判斷,只接受父窗口傳遞來的消息,
if (ev.source !== window.parent) return;
var data = ev.data;
console.info('message from parent:', data);
}, false);
複製代碼
經過這樣的一個傳遞和接受的過程能夠實現一個完整的消息傳遞。無論A,B是否跨域,是否存在嵌套關係,均可以使用postMessage的方式實現消息傳遞。安全
當咱們只處理某些源發送過來的消息時,咱們可使用origin來作判斷,只處理某一些源的message,這樣方便過濾一些沒必要要的值。bash
最近遇到一個問題,本身的代碼【A_child】是經過Iframe的方式放在A系統中的,由於代碼中須要A系統登陸時的用戶信息去獲取資源,因此須要A系統中的cookie信息。目前的處理方式就是講個人代碼部署到A系統的服務器上,而後指定不一樣的端口,這樣使用嵌入iframe的方式實現cookie共享。可是缺點就是每次更新代碼都須要A系統的負責人去作更新。耗費了大量的人力和時間成本。服務器
注意:相同的域名,不一樣的端口能夠共享cookie信息。微信
最近爲了減輕本身的工做負擔,決定寫一箇中間層頁面,放在A系統下,菜單的指向不變,只是在中間層的頁面中在作一次iframe嵌套,而且在這個頁面中將A系統中的cookie信息使用postMessage的方式發送給origin端。cookie
注意:由於我本身代碼進入時就須要帶着用戶信息請求表格數據,因此頁面的全部操做必須在收到message後才進行。因此就有了下面的這個代碼
window.addEventListener('message', (ev) => {
if (ev.source !== window.parent) return;
const data = ev.data;
...
...
...
Vue.prototype.userInfo = data;
new Vue({
el: '#app',
router,
store,
render: h => h(renderComponents),
});
}, false);
複製代碼
html5新增的特性,postMessge主要是更方便的解決了多頁面的消息傳遞,而且有效解決了跨域問題。使用起來更加的簡單方便。不過根據本身的需求選擇不一樣的處理方式。
歡迎關注微信公衆號