【JS】1678- 重学 JavaScript API - Broadcast Channel API

news2025/2/22 17:47:05

835a0d9037fc4fa35e358da19a142359.jpeg

当我们网页需要在不同的浏览器窗口之间共享数据时,可能需要使用 WebSocket 或 WebRTC 等技术。但是,这些技术会过于复杂。而浏览器自带的 Broadcast Channel API[1] 可以让我们轻松地在不同浏览器窗口之间共享数据,而无需使用复杂的技术。

本文将介绍 Broadcast Channel API 的基本和高级使用方法,并提供示例代码来帮助读者更好地理解和使用该 API。

🏝 什么是 Broadcast Channel API?

Broadcast Channel API 是一个浏览器 Web API,它允许我们创建一个「能够将数据广播给多个文档或浏览器窗口的通道」。通过该通道实现不同浏览器窗口之间的数据共享。我们可以向该频道发送消息,其他窗口则可以监听该频道以接收消息。

🎨 如何使用 Broadcast Channel API?

基础使用方法

使用 Broadcast Channel API 的基本方法非常简单。我们只需要创建一个 BroadcastChannel 实例,并使用 postMessage() 方法向该频道发送消息。以下是一个简单的例子:

// 创建一个名为 "my_channel" 的广播频道
const myChannel = new BroadcastChannel("my_channel");

// 向该频道发送消息
myChannel.postMessage("Hello world!");

然后在其他窗口中监听该频道,以接收来自该频道的消息。以下是一个简单的例子:

// 监听名为 "my_channel" 的广播频道
const myChannel = new BroadcastChannel("my_channel");

// 监听该频道并处理消息
myChannel.onmessage = function (event) {
  console.log(event.data);
};

BroadcastChannel 实例还提供了一些其他的方法和事件,例如 close() 方法和 close 事件。详细介绍可以在 MDN Web Docs[2] 上查看完整文档。

高级使用方法

Broadcast Channel API 还提供了一些高级使用方法,例如使用 ArrayBufferTransferable Objects 传递大型数据,使用 MessageEvent.source 属性来识别消息的来源,以及使用 MessageEvent.ports 属性通过 postMessage() 方法传递通信通道。 以下是一个使用 ArrayBufferTransferable Objects 传递数据的例子:

// 创建一个名为 "my_channel" 的广播频道
const myChannel = new BroadcastChannel("my_channel");

// 创建一个 ArrayBuffer,其中包含您要发送的数据
const buffer = new ArrayBuffer(1024);

// 向该频道发送包含 ArrayBuffer 的消息
myChannel.postMessage(buffer, [buffer]);

然后在其他窗口中接收该消息,并从 MessageEvent.data 属性中获取 ArrayBuffer

// 监听名为 "my_channel" 的广播频道
const myChannel = new BroadcastChannel("my_channel");

// 监听该频道并处理消息
myChannel.onmessage = function (event) {
  const buffer = event.data;
  // ...
};

Broadcast Channel API 还提供了其他高级用法,详细请查看文档。

🧭 兼容性情况

Broadcast Channel API 兼容性良好,可以在大多数现代浏览器中使用。具体如下:

  • Chrome 54+ ✅

  • Firefox 38+ ✅

  • Safari 10+ ✅

  • Opera 41+ ✅

  • Edge 16+ ✅

  • iOS Safari 10.0-10.2+ ✅

  • Android Browser 67+ ✅

  • Chrome for Android 59+ ✅

⚠️ 需要注意的是,Broadcast Channel API 目前还不支持 Internet Explorer 浏览器。如果你的网站需要支持 IE 浏览器,可能需要使用其他技术或库来实现数据共享。

aee60feabfaf28226fa8f3c0dd2b0697.png

详细兼容性情况可以在 Can I Use[3] 网站上查看。

📋 Broadcast Channel API 优缺点

其优点有以下几个 🍇:

  1. 「传递数据」:提供了一种可靠的方法,使独立的 JavaScript 应用程序在同一浏览器同一站点内传递数据。

  2. 「传输速度快」:以高速连接,提供更快的数据传输速度。

  3. 「实时性」:提供了实时,低延迟的数据传输。

  4. 「可靠性」:能够在小的数据包丢失或意外丢失时进行恢复。

不过,Broadcast Channel API 也存在以下缺点:

  1. 「仅限同源」:Broadcast Channel API 只能在同一浏览器同一站点内进行通信。这意味着,虽然不同的站点可以在同一浏览器内打开,但无法使用 Broadcast Channel API 进行通信。

  2. 「受浏览器支持限制」:与大多数 Web API 一样,Broadcast Channel API 受到不同浏览器和平台的支持和兼容性限制。

  3. 「需要共性的 API 使用」:不同的 JavaScript 应用程序需要知道如何使用 Broadcast Channel API 来共享数据。如果开发人员没有必要的知识,那么 API 就可能不如预期地使用。

👍 实际开发案例

接下来举一个实际开发案例。「案例需求」:使用了 Broadcast Channel API 将相同来源的不同浏览器选项卡之间的消息广播到其他选项卡。所有选项卡都将显示同样的结果,并且如果有任何一种选项卡更改了结果,则其他选项卡也会显示更改后的结果。 实现代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>Broadcast Channel Example</title>
  </head>
  <body>
    <h2>Broadcast Channel Example</h2>
    <div id="result">Result: <span></span></div>

    <script>
      // Create a new Broadcast Channel with name
      const channel = new BroadcastChannel("resultChannel");
      const resultEl = document.querySelector("#result span");

      // Option 1 Base
      // Listen for messages from the channel
      channel.onmessage = (e) => {
        resultEl.innerText = e.data;
      };

      // Option 2 - Using addEventListener
      // channel.addEventListener('message', e => {
      //    resultEl.innerText = e.data;
      // });

      // Listen for changes on the input
      const inputEl = document.createElement("input");
      inputEl.type = "text";

      inputEl.addEventListener("input", (e) => {
        const val = e.target.value;

        // Broadcast the change to other tabs
        channel.postMessage(val);
        resultEl.innerText = val;
      });

      // Insert the input element
      document.body.appendChild(inputEl);
    </script>
  </body>
</html>

在上面示例代码中,我们创建了一个名为 resultChannel 的 Broadcast Channel ,并使用 channel.postMessage() 函数向所有浏览器选项卡广播输入框更改的值。 当有一种选项卡更改结果时,所有选项卡都会显示更改后的结果。 此外,我们还演示了两种不同的监听消息的方法(onmessageaddEventListener)以及如何将消息发送到 Broadcast Channel 中。

🍭 仓库推荐

推荐几个基于 Broadcast Channel API 封装的 Github 开源项目:

  1. 「broadcast-channel[4] - 该项目是一个简单易用的 Broadcast Channel API 封装,拥有 1500+ ⭐️。

  2. 「react-broadcast-channel[5] - 该项目是一个 React 应用程序的 Broadcast Channel API 封装,拥有 1300+ ⭐️。

🎯 总结和建议

Broadcast Channel API 是一种 Web API,能够「方便地在不同浏览器窗口之间共享数据」。希望本文能够帮助读者更好地使用该 API。

Reference

[1]

Broadcast Channel API: https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel

[2]

MDN Web Docs: https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel

[3]

Can I Use: https://caniuse.com/broadcastchannel

[4]

broadcast-channel: https://github.com/pubkey/broadcast-channel

[5]

react-broadcast-channel: https://github.com/ReactTraining/react-broadcast

往期回顾

#

如何使用 TypeScript 开发 React 函数式组件?

#

11 个需要避免的 React 错误用法

#

6 个 Vue3 开发必备的 VSCode 插件

#

3 款非常实用的 Node.js 版本管理工具

#

6 个你必须明白 Vue3 的 ref 和 reactive 问题

#

6 个意想不到的 JavaScript 问题

#

试着换个角度理解低代码平台设计的本质

520b3501bb54d7188341ed6b08326314.gif

回复“加群”,一起学习进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis入门到实战(实战篇)缓存更新、穿透、雪崩、击穿!

Redis基础篇 Java面试宝典-redis 实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信…

电脑屏幕录制软件哪个好用?推荐这2款!

案例&#xff1a;怎样才能找到一款好用的电脑录屏工具&#xff1f; 【我工作时&#xff0c;需要经常录制电脑屏幕&#xff0c;而我现在使用的录屏工具不好用&#xff0c;十分影响我的工作效率。我需要一款好用的电脑录屏工具&#xff0c;小伙伴们有没有推荐&#xff1f;】 如…

Java并发编程之AQS

目录 一&#xff0c;什么是AQS二&#xff0c;AQS核心知识1&#xff0c;核心思想2&#xff0c;AQS中的共享状态值-state3&#xff0c; 同步队列为什么称为FIFO4&#xff0c; Condition队列-单向队列 三&#xff0c;具体实现1&#xff0c;独占模式下的AQS2&#xff0c;共享模式下…

RdViewer远控隐蔽利用及钓鱼攻击

本文转载于&#xff1a; https://mp.weixin.qq.com/s?__bizMzg4NzkwMDA5NQ&mid2247484000&idx1&sn56b24135aa0aa77a690ff29566341c4e&chksmcf8210b0f8f599a6eaa7743bc65ad4e79400839c40289a8f5407e9732e22a4ae693c0701d1b0&mpshare1&scene23&srci…

未来城市的无限可能

生命体&#xff1a;Mix ta没有棱角但又泾渭分明 冰冷而又生机勃勃 最近受《环球》杂志记者邀请&#xff0c;对未来城市展开了若干讨论&#xff0c;分享给大家&#xff1a; 《环球》杂志 未来城市是什么样子的&#xff1f;请用几个关键词或几句话描述。 我理想中的未来城市应该具…

蒙特卡洛方法的基本介绍和简单应用(求圆周率和定积分)

目录 一、什么是蒙特卡洛方法 二、蒙特卡洛方法的基本思想 三、用蒙特卡洛方法求圆周率 π 四、用蒙特卡洛方法求定积分 你听说过 "蒙特卡洛法" 吗&#xff1f;哦&#xff0c;那是一种计算不规则图形面积的计算机程序算法&#xff0c;具体做法是在软件中用大量的…

【银河麒麟V10】【服务器】麒麟容器常见问题

一、麒麟容器镜像下载链接 &#xff08;1&#xff09;kylin-V10-SP1-0711-x86_64 docker镜像下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/10WyBYRoOykqgnagjnoxdXw?pwdt4h5 提取码&#xff1a;t4h5 二、容器基础使用 #导入镜像 docker load < k…

6.100ASK_V853-PRO开发板支持MIPI摄像头

0.前言 ​ 100ASK_V853-PRO开发板支持4LINE的MIPI摄像头和2LINE的MIPI摄像头&#xff0c;使用百问网提供的Tina SDK包生成的镜像&#xff0c;系统已经配置好了&#xff0c;可以直接使用。本章介绍如何去适配一个MIPI摄像头&#xff0c;本文所用的2LINE的MIPI摄像头&#xff0c…

什么是应用交付网络(ADN)

从CDN到ADN CDN&#xff08;内容分发网络&#xff09;在90年代末受到麻省理工学院的启发并完成发明&#xff0c;00年代初成立第一家成功的CDN商业企业Akamai。CDN的目标是相对于最终用户在空间上分配服务&#xff0c;以提供高可用性和高性能。随着互联网的发展&#xff0c;CDN…

建筑行业搭建BI数据可视化平台,已成为大势所趋

建筑行业的项目管理是一个系统而复杂的过程&#xff0c;其重点主要是寻求造价、质量、工期等几个方面的平衡点&#xff0c;并且对项目的整个过程必须要有一个清晰和直观的了解。 因此可以通过BI数据可视化分析将各个节点的系统数据、业务数据完整的呈现&#xff0c;将各管理层…

数字孪生园区可视化大屏系统-广州华锐互动

工业园区是现代工业化生产的重要组成部分&#xff0c;也是推动经济发展和提升城市形象的重要载体。而数字孪生园区可视化大屏系统作为一种新兴的技术应用&#xff0c;可以为工业园区的建设、管理和发展带来很大的价值。 首先&#xff0c;数字孪生园区可视化大屏系统可以帮助工业…

[C++]普通二叉搜索树实现

目录 1 二叉搜索树的基本概念 2 二叉搜索树的构建 2.1 二叉搜索树的结点 2.2 搜索树类的结构 3 成员函数 3.1 插入 3.2 查找 3.3 删除&#xff08;重点&#xff09; 3.4 默认成员函数的辅助函数 4 普通的二叉搜索树的效率 1 二叉搜索树的基本概念 二叉搜索树又称二叉…

Java框架学习05(Spring事务详解)

1、什么是事务&#xff1f; 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 我们系统的每个业务方法可能包括了多个原子性的数据库操作&#xff0c;比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的&…

相亲交友app开发上线运营的整个流程是什么

一、相亲交友app开发基本流程 1、需求分析&#xff1a;需求分析是相亲交友app源码开发的第一步&#xff0c;也是最重要的一步。在需求分析阶段&#xff0c;可以了解客户对于系统的需求&#xff0c;确定系统功能实现的大致方向和功能。 2、系统架构&#xff1a;系统架构阶段就是…

这里有一份教你每天用领英获取20个询盘的免费课程,手慢无

于2023年3月22日&#xff0c;我们圆满完成了深圳宝安的外贸分享交流会&#xff0c;时隔两个月即将迎来我们的广州场。 在上次深圳会议&#xff0c;有幸邀请到江西省跨境电商协会会长莅临 给大家分享了&#xff1a; 如何帮助传统制造业从“0”开始做外贸、如何借助平台为企业…

浅谈霍尔电流传感器在电池柜监测中的应用

安科瑞 耿敏花 摘要&#xff1a;本文分析了霍尔电流传感器的工作原理&#xff0c;浅谈其在电池柜监测中的应用。 关键词&#xff1a;霍尔电流传感器 工作原理 充放电电流 电池柜 引言 大多数的工厂里&#xff0c;使用到的电池柜&#xff0c;它是将许多的新组装的电池一起…

不合格机器人工程讲师为何不分享成功的案例

不合格机器人工程讲师如何坦然面对失败 除了失败&#xff0c;更多的失败&#xff0c;也并非一无所获。 博客分享过&#xff0c;但是关注度&#xff08;浏览量&#xff09;不高&#xff0c;大部分成功案例都是学生/毕业生自身努力的结果&#xff0c;教育引导的作用小于他们自身…

中国品牌日:海尔智家向世界展示“中国”

品牌&#xff0c;在任何时候都是一个厚重的话题。什么是品牌&#xff1f;被咬掉一口的苹果、圆润张扬的对号、还有那个大大的黄色M&#xff0c;在诞生之初也不过是个商标。只是后来&#xff0c;它们跟智能手机、体育和快餐划上了等号&#xff0c;讲出了故事、收获了口碑&#x…

Android Framework——Binder 监控方案

作者&#xff1a;低性能JsonCodec 在 Android 应用开发中&#xff0c;Binder 可以说是使用最为普遍的 IPC 机制了。我们考虑监控 Binder 这一 IPC 机制&#xff0c;一般是出于以下两个目的&#xff1a; 卡顿优化&#xff1a;IPC 流程完整链路较长&#xff0c;且依赖于其他进程…

操作系统基础知识介绍之内存层次结构(一)

传统上&#xff0c;内存层次结构的设计者专注于优化平均内存访问时间&#xff0c;这由缓存访问时间、未命中率和未命中惩罚决定。 然而&#xff0c;最近&#xff0c;功率已成为主要考虑因素。 在高端微处理器中&#xff0c;可能有 60 MiB 或更多的片上高速缓存&#xff0c;并且…