重学 JavaScript API - Broadcast Channel API

LogicNebulaRhapsody
• 阅读 5158

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

本文将介绍 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 上查看完整文档。

高级使用方法

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 浏览器,可能需要使用其他技术或库来实现数据共享。

重学 JavaScript API - Broadcast Channel API

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

📋 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 - 该项目是一个简单易用的 Broadcast Channel API 封装,拥有 1500+ ⭐️。
  2. react-broadcast-channel - 该项目是一个 React 应用程序的 Broadcast Channel API 封装,拥有 1300+ ⭐️。

🎯 总结和建议

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
LogicNebulaRhapsody
LogicNebulaRhapsody
Lv1
放下屠刀,立地成佛、救人一命,胜造七级浮屠。
文章
4
粉丝
0
获赞
0