在前端,咱們常常會用postMessage
來實現頁面間的通訊,但這種方式更像是點對點的通訊。對於一些須要廣播(讓全部頁面知道)的消息,用postMessage
不是很是天然。Broadcast Channel 就是用來彌補這個缺陷的。前端
顧名思義,Broadcast Channel 會建立一個全部同源頁面均可以共享的(廣播)頻道,所以其中某一個頁面發送的消息能夠被其餘頁面監聽到。git
下面就來速覽一下它的使用方法。github
Broadcast Channel 的 API 很是簡單易用。瀏覽器
首先咱們會使用構造函數建立一個實例:函數
const bc = new BroadcastChannel('alienzhou');
複製代碼
能夠接受一個DOMString
做爲 name,用以標識這個 channel。在其餘頁面,能夠經過傳入相同的 name 來使用同一個廣播頻道。用 MDN 上的話來解釋就是:post
There is one single channel with this name for all browsing contexts with the same origin.ui
該 name 值能夠經過實例的.name
屬性得到this
console.log(bc.name);
// alienzhou
複製代碼
Broadcast Channel 建立完成後,就能夠在頁面監聽廣播的消息:spa
bc.onmessage = function(e) {
console.log('receive:', e.data);
};
複製代碼
對於錯誤也能夠綁定監聽:code
bc.onmessageerror = function(e) {
console.warn('error:', e);
};
複製代碼
除了爲
.onmessage
賦值這種方式,也可使用addEventListener
來添加'message'
監聽。
Broadcast Channel 實例也有一個對應的postMessage
用於發送消息:
bc.postMessage('hello')
複製代碼
能夠看到,上述短短几行代碼就能夠實現多個頁面間的廣播通訊,很是方便。而有時咱們但願取消當前頁面的廣播監聽:
'message'
事件監聽close
方法。bc.close();
複製代碼
二者是有區別的:
取消'message'
監聽只是讓頁面不對廣播消息進行響應,Broadcast Channel 仍然存在;而調用close
方法這會切斷與 Broadcast Channel 的鏈接,瀏覽器纔可以嘗試回收該對象,由於此時瀏覽器纔會知道用戶已經不須要使用廣播頻道了。
在關閉後調用postMessage
會出現以下報錯
若是以後又再須要廣播,則能夠從新建立一個相同 name 的 Broadcast Channel。
下面是 Broadcast Channel Demo 的演示效果:
Broadcast Channel 是一個很是好用的多頁面消息同步 API,然而兼容性卻不是很樂觀。
好在咱們還有些其餘方案能夠做爲補充(或者做爲polyfill),其餘的前端跨頁面通訊能夠參考個人另外一篇文章《前端跨頁面通訊的方法》。
對文章感興趣的同窗歡迎關注 個人博客 >> https://github.com/alienzhou/blog