JavaScript使用Broadcast?Channel實(shí)現(xiàn)前端跨標(biāo)簽頁通信
在開發(fā)Web應(yīng)用程序時(shí),有時(shí)候需要在不同的瀏覽器標(biāo)簽頁之間進(jìn)行通信。例如,你可能需要在一個(gè)標(biāo)簽頁中做出的更改在另一個(gè)標(biāo)簽頁中反映出來,或者需要在用戶在一個(gè)標(biāo)簽頁中執(zhí)行某些操作時(shí)向其他標(biāo)簽頁發(fā)送消息。為了實(shí)現(xiàn)這樣的跨標(biāo)簽頁通信,我們可以借助HTML5提供的Broadcast Channel API。
實(shí)現(xiàn)步驟
首先,我們需要創(chuàng)建兩個(gè)文件:一個(gè)HTML文件和一個(gè)JavaScript文件。
HTML文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script type="text/javascript" src="./crossTabMsg.js"></script>
</head>
<body>
<button id="btn">發(fā)送消息</button>
<script type="text/javascript">
var btn = document.getElementById('btn');
btn.onclick = function() {
sendMsg('test', 'hello');
}
listenMsg(function(msg) {
console.log(msg);
})
</script>
</body>
</html>
JavaScript文件(crossTabMsg.js):
const channel = new BroadcastChannel('cross-tab-msg');
function sendMsg(type, msg) {
channel.postMessage({type, msg});
}
function listenMsg(callback) {
channel.addEventListener('message', e => {
callback && callback(e.data);
});
}
在HTML文件中,我們創(chuàng)建了一個(gè)按鈕,并為其添加了一個(gè)點(diǎn)擊事件處理程序。當(dāng)用戶點(diǎn)擊按鈕時(shí),我們調(diào)用sendMsg函數(shù)發(fā)送一條消息。同時(shí),我們也調(diào)用listenMsg函數(shù)來監(jiān)聽來自其他標(biāo)簽頁的消息,并在控制臺中打印出來。
在JavaScript文件中,我們創(chuàng)建了一個(gè)名為cross-tab-msg的新的Broadcast Channel,并定義了兩個(gè)函數(shù):sendMsg用于發(fā)送消息,listenMsg用于監(jiān)聽消息。當(dāng)收到消息時(shí),listenMsg函數(shù)會觸發(fā)回調(diào)函數(shù),并將接收到的消息作為參數(shù)傳遞給回調(diào)函數(shù)。
使用方法
要在不同的標(biāo)簽頁之間進(jìn)行通信,只需在這些標(biāo)簽頁中加載相同的HTML和JavaScript文件即可。當(dāng)你在一個(gè)標(biāo)簽頁中點(diǎn)擊按鈕發(fā)送消息時(shí),其他標(biāo)簽頁中的監(jiān)聽器將會接收到這條消息,并執(zhí)行相應(yīng)的操作。
結(jié)論
通過使用Broadcast Channel API,我們可以輕松地實(shí)現(xiàn)跨標(biāo)簽頁通信,使得不同標(biāo)簽頁之間可以方便地進(jìn)行消息傳遞和數(shù)據(jù)共享。這為開發(fā)復(fù)雜的Web應(yīng)用程序提供了更多的可能性和靈活性。
方法補(bǔ)充
除了上文的方法,小編還為大家整理了其他JavaScript跨標(biāo)簽頁通信的方法,希望對大家有所幫助
1.localstorage
<!-- 1.html -->
<script>
if(!localStorage.getItem('a')){
localStorage.setItem('a',1)
}else{
var sum = localStorage.getItem('a')
localStorage.setItem('a', +sum + 1)
}
</script>
<!-- 2.html -->
<script>
window.addEventListener('storage', (e) => console.log(e))
</script>
sessionStorage.setItem('message', '我是sessionStorage的值');
// 觸發(fā)自定義事件來通知其他標(biāo)簽頁
var event = new Event('sessionStorageUpdated');
window.dispatchEvent(event);
window.addEventListener('storage', function(event) {
if (event.key === 'message') {
var message = sessionStorage.getItem('message');
console.log('message:', message);
}
});
// 監(jiān)聽自定義事件來檢測 `sessionStorage` 的更新
window.addEventListener('sessionStorageUpdated', function() {
var message = sessionStorage.getItem('message');
console.log('message:', message);
});
2.postMessage
<!-- 1.html -->
<body>
<button class="pop">彈出新窗口</button>
<button class="button">發(fā)送數(shù)據(jù)</button>
<script>
const pop = document.querySelector('.pop');
const button = document.querySelector('.button');
let index = 0;
let opener = null;
pop.addEventListener('click', () => {
opener = window.open(
'2.html',
'123',
'height=600,width=600,top=20,resizeable=yes'
);
});
button.addEventListener('click', () => {
const data = {
value: `moment ${index++}`,
};
opener.postMessage(data, '*');
});
</script>
</body>
<!-- 2.html -->
<body>
<div>postMessage 2.html</div>
<script>
window.addEventListener("message", (e) => {
console.log(e.data);
});
</script>
</body>
3.SharedWorker
<!-- a.html -->
<script>
let index = 0;
const worker = new SharedWorker("worker.js");
setInterval(() => {
worker.port.postMessage(`moment ${index++}`);
}, 1000);
</script>
<!-- b.html -->
<script>
const worker = new SharedWorker("worker.js");
worker.port.start();
setInterval(() => {
worker.port.postMessage("php是世界上最好的語言");
}, 1000);
worker.port.onmessage = function (e) {
if (e.data) {
console.log(e.data);
}
};
</script>
創(chuàng)建一個(gè) worker.js 文件,并編寫以下代碼:
let data = "";
self.onconnect = (e) => {
const port = e.ports[0];
port.onmessage = function (e) {
if (e.data === "php是世界上最好的語言") {
port.postMessage(data);
data = "";
} else {
data = e.data;
}
};
};
到此這篇關(guān)于JavaScript使用Broadcast Channel實(shí)現(xiàn)前端跨標(biāo)簽頁通信的文章就介紹到這了,更多相關(guān)JavaScript Broadcast Channel跨標(biāo)簽頁通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中不同標(biāo)簽頁間通信的常見方式小結(jié)
- JavaScript中瀏覽器多標(biāo)簽頁通信的8種方案盤點(diǎn)
- JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁通信方式詳解
- JavaScript實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁之間通信
- JavaScript中實(shí)現(xiàn)跨標(biāo)簽頁通信的方法詳解
- JavaScript中跨標(biāo)簽頁通信的常見方式
- JavaScript常見的跨標(biāo)簽頁通信方式總結(jié)
- JavaScript實(shí)現(xiàn)瀏覽器不同標(biāo)簽頁通信的原理與實(shí)踐
相關(guān)文章
淺談?lì)愃朴?function(){}).call()的js語句
這篇文章主要介紹了淺談?lì)愃朴?function(){}).call()的js語句,的相關(guān)資料,需要的朋友可以參考下2015-03-03
純JavaScript代碼實(shí)現(xiàn)文本比較工具
之前項(xiàng)目需求需要寫一個(gè)純js文本比較工具,在此小編把代碼分享在腳本之家平臺供大家參考2016-02-02
js實(shí)現(xiàn)簡單的可切換選項(xiàng)卡效果
這篇文章主要介紹了js實(shí)現(xiàn)簡單的可切換選項(xiàng)卡效果的方法,涉及javascript操作css樣式實(shí)現(xiàn)切換選項(xiàng)卡的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

