当前位置: 首页 > news >正文

浏览器跨标签页通信

浏览器跨标签页通信

过去,最常见的就是利用 localStorage 的 onstorage 事件监听来处理跨浏览器标签页通信,但其本职是存储,通信只是其副作用,且 API 不够直观。

现代浏览器已经为我们提供了一个专门为此场景设计的、更优雅、更高效的解决方案。

什么是 BroadcastChannel?
BroadcastChannel API 允许来自同源的浏览器不同上下文(如标签页、窗口、iframe)之间进行通信。

其核心特点是:同源限制、发布/订阅模式且角色可以互换、基于消息事件对高效通信、支持复杂数据,无需手动序列化。

它的 API 非常简洁,主要包含创建、发送、接收

1. 创建或加入一个频道
要进行通信,首先需要创建一个 BroadcastChannel 实例,并给它指定一个唯一的频道名称。所有希望通信的页面都必须使用相同的频道名称。

// 创建一个名为 'user_status_channel' 的频道
const channel = new BroadcastChannel('user_status_channel');

如果名为 user_status_channel 的频道已存在,这行代码会加入该频道;如果不存在,则会创建它。

和关闭四个步骤。

2. 发送消息
创建实例后,使用 postMessage() 方法向频道广播消息。所有监听该频道的其他标签页都会收到此消息。

2e21839b-99e4-4368-92db-f0d4892361d8

postMessage() 的强大之处在于它可以发送各种复杂的数据结构,包括对象、数组、Map、Set、File 对象等,浏览器会自动处理序列化和反序列化。

3. 接收消息
通过监听 message 事件来接收广播。事件对象 event 中包含了我们最关心的 data 属性,也就是发送方传递的消息。

channel.onmessage = (event) => {console.log('收到消息:', event.data);// 根据消息内容执行相应操作if (event.data && event.data.type === 'login') {updateUIForLogin(event.data.user);} else if (event.data && event.data.type === 'logout') {updateUIForLogout();}
};// 也可以使用 addEventListener
// channel.addEventListener('message', (event) => { ... });

  

4. 关闭频道
当页面不再需要接收或发送消息时(例如,在组件卸载或页面关闭时),应该调用 close() 方法来关闭频道,以释放资源。

// 当组件销毁或页面关闭时
window.onunload = () => {
channel.close();
};// 在 React 或 Vue 等框架中,可以在组件的卸载生命周期函数中调用
// useEffect(() => {
// return () => channel.close();
// }, []);

  


BroadcastChannel API 是实现同源跨标签页通信的现代化标准方案,具有简洁的 API、强大的功能和优秀的性能,完美地解决了 localStorage hack 方案的各种痛点。

至于兼容性,只要不用 IE 就行。


原文链接:https://blog.csdn.net/qq_33546296/article/details/149716088

http://www.vanclimg.com/news/239.html

相关文章:

  • 以太坊开发指南:SendTransaction vs CallContract 的区别与错误处理实践 - 若
  • Ntpdate系统时间同步
  • oracle 自增id
  • 接地气的软件开发流程.240618
  • 接地气的代码版本管理流程.240617
  • sersync同步
  • deepseek本地部署硬件资源对比表.250303
  • 【API接口】最新可用手机号归属地查询接口
  • NFS安装配置
  • Git代码分支管理模型TBD++ Flow.240520
  • deepseek-chat和deepseek-reasoner的区别.250305
  • grain和crops的区别
  • 【macOS】Homebrew更换国内镜像源(2025.7更新)
  • 第二十三天
  • SqlSugar的无实体(匿名)插入、更新、删除、查询以及多库和跨库查询 - microsoft
  • Cursor:IT专业人员必备神器,从开发到运维的全能助手.250423
  • 工作要开心:与其挣扎,不如选择自洽.250411
  • CSP-S模拟赛28 比赛总结
  • 校招季人效提升50%:Moka校招系统AI筛选与雇主品牌工具
  • 【2025-07-26】连岳摘抄
  • 迎战DARPA网络挑战赛:Trail of Bits的自动化安全系统征程
  • 企业如何利用MyEMS开源能源管理系统实现节能减排
  • GPUStack v0.7重磅发布:macOS与Windows安装包、昇腾MindIE多机推理、模型使用计量与寒武纪MLU支持
  • IDEA导出数据库对应的实体配置
  • 2025最佳代码托管平台推荐
  • 搜索
  • 服务器docker
  • 一种绕定轴旋转的参照系上的惯性力推导方法
  • 划分点(Vertex)和边(Edge)的属性汇总
  • 基本算法