以下是使用 Broadcast Channel API 实现跨浏览器标签页通信的具体前端代码示例:
一、基础使用 Demo
html
<!DOCTYPE html>
<html>
<body>
<h2>标签页通信 Demo(Broadcast Channel)</h2>
<button onclick="sendMessage()">发送消息</button>
<div id="messages"></div>
<script>
// 1. 创建 Broadcast Channel(通道名称需一致)
const channel = new BroadcastChannel('my_channel');
// 2. 接收消息的监听器
channel.onmessage = (event) => {
const msg = `[接收][${
new Date().toLocaleTimeString()}] ${
event.data}`;
document.getElementById('messages').innerHTML += msg + '<br>';
};
// 3. 发送消息
function sendMessage() {
const text = `消息来自标签页 ${
Math.random().toString(36).substr(2, 5)}`;
channel.postMessage(text);
// 本地也显示发送的消息(可选)
const msg = `[发送][${
new Date().toLocaleTimeString()}] ${
text}`;
document.getElementById('messages').innerHTML += msg + '<br>';
}
// 4. 关闭通道(页面卸载时)
window.addEventListener('beforeunload', () => {
channel.close();
});
</script>
</body>
</html>
二、进阶用法(带消息类型)
javascript
// 创建通道
const channel = new BroadcastChannel('my_channel');
// 发送结构化消息
channel.postMessage({
type: 'SYNC_DATA', // 消息类型
payload: {
// 消息内容
userId: 123,
status: 'active'
}
});
// 接收消息(带类型判断)
channel.onmessage = (event) => {
const {
type, payload } = event.data;
switch (type) {
case 'SYNC_DATA':
console.log('同步数据:', payload);
break;
case 'NOTIFICATION':
alert(payload.text);
break;
}
};
四、关键特性说明
特性 说明
同源限制 只能在相同协议、域名、端口的页面间通信
通道名称 所有通信页面需要使用相同的通道名称 (new BroadcastChannel(‘name’))
消息类型 支持发送字符串/对象/ArrayBuffer 等结构化数据
性能 比 localStorage 事件更高效,无存储开销
生命周期 需要手动关闭 (channel.close()) 避免内存泄漏
五、浏览器兼容性
✅ Chrome 54+
✅ Firefox 76+
✅ Edge 79+
✅ Safari 15.4+
❌ IE 不支持
六、适用场景
多标签页状态同步(如登录状态)
跨标签页通知(如后台任务完成)
多窗口数据共享
避免重复操作(如只允许一个标签页播放音乐)
七、替代方案对比
方案 优点 缺点
Broadcast Channel 专用API、高效 兼容性要求较高
localStorage 事件 兼容性好 需要处理存储、仅字符串
SharedWorker 复杂场景适用 实现复杂度高
根据需求选择最合适的方案!
以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!