BroadcastChannel 通讯原理

BroadcastChannel 是一种用于在同一来源(同一协议、主机名和端口号)下不同浏览器上下文(如标签页、iframe、Worker、Service Worker)之间进行消息广播的 API。它提供了一种简便、可靠的方法来实现跨上下文的实时通讯。

BroadcastChannel 的基本概念

  1. 广播频道BroadcastChannel 创建的实例代表一个特定的广播频道,所有监听该频道的上下文都能接收该频道发送的消息。
  2. 消息广播:通过 postMessage 方法发送消息,所有监听该频道的上下文都会收到消息。
  3. 消息监听:通过 onmessage 事件处理器接收和处理来自该频道的消息。

基本用法

1. 创建频道

在多个上下文中使用相同的频道名称创建 BroadcastChannel 实例。

const channel = new BroadcastChannel('my_channel');
2. 发送消息

在任意一个上下文中,通过 postMessage 方法向频道发送消息。

channel.postMessage('Hello from one context');
3. 接收消息

在其他上下文中,通过监听 onmessage 事件接收消息。

channel.onmessage = (event) => {console.log('Received message:', event.data);
};

工作流程图

以下是 BroadcastChannel 实现不同标签页之间通讯的工作流程图:

┌──────────────────────┐                ┌──────────────────────┐
│      Page A          │                │      Page B          │
│                      │                │                      │
│ BroadcastChannel     │                │ BroadcastChannel     │
│   'my_channel'       │                │   'my_channel'       │
│          │           │                │          │           │
│          ▼           │                │          ▼           │
│ channel.postMessage  │                │                      │
│ ('Hello from A')     │────────────────│   channel.onmessage  │
│                      │                │   event.data ===     │
│                      │                │   'Hello from A'     │
│                      │                │                      │
└──────────────────────┘                └──────────────────────┘

示例代码

标签页 A 的代码
<!DOCTYPE html>
<html>
<head><title>Page A</title>
</head>
<body><button onclick="sendMessage()">Send Message</button><script>const channel = new BroadcastChannel('my_channel');function sendMessage() {channel.postMessage('Hello from Page A');}</script>
</body>
</html>
标签页 B 的代码
<!DOCTYPE html>
<html>
<head><title>Page B</title>
</head>
<body><script>const channel = new BroadcastChannel('my_channel');channel.onmessage = (event) => {console.log('Received message in Page B:', event.data);};</script>
</body>
</html>

BroadcastChannel 的特点和优缺点

特点
  1. 实时通讯:能够在不同浏览器上下文之间进行实时消息传递。
  2. 简洁易用:API 简单明了,只需少量代码即可实现。
  3. 同源策略:确保安全性,只有同源的上下文才能相互通讯。
优点
  1. 实时性好:消息几乎是实时传递的,适用于需要即时通讯的场景。
  2. 使用简单:不需要复杂的设置,易于实现和维护。
  3. 跨上下文:支持标签页、iframe、Worker 和 Service Worker 之间的通讯,适用范围广。
缺点
  1. 不持久化:消息不会持久化,页面刷新或关闭后,之前的消息无法再获取。
  2. 同源限制:只能在同源上下文之间通讯,不同来源无法相互通讯。

实际应用场景

1. 用户登录状态同步

当用户在一个标签页中登录或注销,其他打开同一应用的标签页需要同步登录状态。

// 标签页 A 中用户登录
const authChannel = new BroadcastChannel('auth_channel');
authChannel.postMessage('User logged in');// 其他标签页中监听登录状态变化
authChannel.onmessage = (event) => {if (event.data === 'User logged in') {// 同步用户登录状态}
};
2. 实时数据更新

在一个标签页中更新数据,其他标签页需要实时显示更新结果,例如股票行情、实时聊天消息等。

// 标签页 A 中更新数据
const dataChannel = new BroadcastChannel('data_channel');
dataChannel.postMessage({ type: 'update', data: 'New data' });// 其他标签页中监听数据更新
dataChannel.onmessage = (event) => {if (event.data.type === 'update') {console.log('Received data update:', event.data.data);// 更新界面显示}
};
3. 多标签页协同工作

用户在多个标签页中打开同一个应用,需要各标签页协同工作。例如,在一个标签页中填写表单,另一个标签页显示表单预览。

// 标签页 A 中填写表单并广播数据
const formChannel = new BroadcastChannel('form_channel');
document.getElementById('formInput').addEventListener('input', (event) => {formChannel.postMessage({ type: 'form_update', value: event.target.value });
});// 标签页 B 中接收表单数据并显示预览
formChannel.onmessage = (event) => {if (event.data.type === 'form_update') {document.getElementById('formPreview').innerText = event.data.value;}
};

总结

BroadcastChannel 提供了一种简单而强大的方法,用于在同源的不同浏览器上下文之间进行实时通讯。它特别适合需要即时同步数据的应用场景,如用户登录状态同步、实时数据更新和多标签页协同工作。通过掌握 BroadcastChannel 的使用方法,开发者可以大大提升 web 应用的用户体验和功能。

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

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

相关文章

24.面向对象编程特性

目录 一、面向对象语言特征1.1 对象包含数据和行为1.2 封装1.3 继承作为类型系统与代码共享 二、使用trait对象存储不同类型的值2.1 定义共有行为的trait2.2 实现trait2.3 trait对象执行动态派发2.4 trait对象必须保证对象安全 三、面向对象设计模式四、状态模式的权衡取舍五、…

python的 pyside2 安装

pip install pyside2 pip install pyqt5-tools pycharm 在pychar 的Main Menu--setings--tool--External-tools 点击 新增自定义工具 1&#xff09;自定义 QtDesigner 目的&#xff1a;用于生成.ui文件Name &#xff1a;QtDesigner Group &#xff1a;Qt Program &a…

交通 | 机器学习 + 大规模TSP/VRP求解

封面图来源&#xff1a;https://xkcd.com/399/ 推文作者&#xff1a;丁建辉&#xff0c;陈泰劼&#xff0c;张云天 本文针对旅行商问题&#xff08;Travelling salesman problem, TSP&#xff09;和车辆路径规划问题&#xff08;Vehicle routing problem, VRP&#xff09;这一类…

Python基础技能

目录 1. 掌握基础技能2. 变量与数据类型3. 条件语句4. 循环结构for循环while循环 5. 函数定义6. 列表与元组列表元组 1. 掌握基础技能 2. 变量与数据类型 在Python中&#xff0c;变量是用来存储数据的容器。我们可以给变量赋值&#xff0c;并使用这些值进行计算或操作。Pytho…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(附示例)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

分布式系统_负载均衡

概述 大型网站都要面对庞大的用户量&#xff0c;高并发&#xff0c;海量数据等挑战。 为了提升系统整体的性能&#xff0c;可以采用垂直扩展和水平扩展两种方式。 垂直扩展&#xff1a;从单机角度扩展&#xff0c;增加单机硬件&#xff08;CPU、内存、磁盘&#xff09;处理能…

Vue进阶之Vue无代码可视化项目(五)

Vue无代码可视化项目 编排引擎smooth-dndLeftPanel.vueLayoutView.vuestores/debug.tsstores/editor.tsAppNavigator.vue添加-左侧栏添加到中间部分LayoutView.vuestore/editor.tsLeftPanel.vue移动-中间部分区域的位置更改新建文件夹utils、文件array.tsarray.tsLayoutView.vu…

基于rouyi框架的多租户改造

基于rouyi框架的多租户改造&#xff0c;重点是实现权限管理和数据隔离。权限管理相当于从原来的“顶级管理员admin-普通用户user”转变为“顶级管理员admin-租户管理员tanantAdmin-普通用户user”。数据隔离主要通过分库、分表、表内设置tenantId字段进行过滤三种方式。 本文主…

[word] word 如何在文档中进行分栏排版? #媒体#其他#媒体

word 如何在文档中进行分栏排版&#xff1f; 目标效果 将唐代诗人李白的组诗作品《清平调词》进行分栏排版&#xff0c;共分三栏&#xff0c;每一首诗作为一栏&#xff0c;参考效果如下图。

计算机图形学入门16:阴影映射

1.前言 前面几篇关于光栅化的文章中介绍了如何计算物体表面的光照&#xff0c;但是着色并不会进行阴影的计算&#xff0c;阴影需要单独进行处理&#xff0c;目前最常用的阴影计算技术之一就是Shadow Mapping技术&#xff0c;也就是俗称的阴影映射技术。 2.阴影映射 Shadow Map…

CSS中实现元素水平垂直居中的方式有哪些

在CSS中实现元素水平垂直居中的方法有很多&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用Flexbox Flexbox是一个现代的布局模型&#xff0c;可以轻松实现元素的水平垂直居中。 .container {display: flex;justify-content: center; /* 水平居中 */align-items: cent…

C++在VS2022开发Windows窗口程序2:API式的Windows窗口程序设计模式

函数API式的Windows GUI程序设计模式是一种基于Windows API函数的方式来设计和开发Windows图形用户界面&#xff08;GUI&#xff09;应用程序的模式。在这种模式下&#xff0c;开发者通过调用Windows API函数来创建窗口、处理消息、绘制图形等&#xff0c;而不依赖于特定的GUI库…

mass storage:RAID Structure , Error Detection and Correction

RAID Structure RAID – redundant array of inexpensive disks multiple disk drives provides reliability via redundancyIncreases the mean time to failureMean time to repair – exposure time when another failure could cause data lossMean time to data loss bas…

【TB作品】stm32单片机,红外遥控器,温控风扇,模拟空调,PWM风扇

空调机 硬件&#xff1a;stm32、oled显示器、ds18b20温度传感器、风扇驱动和风扇、红外接收器、遥控器 软件功能&#xff1a; &#xff08;1&#xff09;显示室内温度 &#xff08;2&#xff09;显示当前模式&#xff1a;常态、除湿、通风 &#xff08;3&#xff09;显示当前风…

Ubuntu Apache2 搭建Gerrit 环境

一、前言 时隔多年&#xff0c;好久没有更新CSDN 博客了&#xff0c;主要原因有如下两点&#xff1a; 1、平时工作繁忙&#xff0c;无暇更新。 2、工作内容涉及信息安全&#xff0c;一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境&#xff0c;最开始…

win11安装VMware虚拟机,启动系统后蓝屏,安装虚拟机卡在虚拟网卡界面的解决办法

机缘和遇到的问题 由于最近618换了台新笔记本电脑&#xff0c;然后系统自带的操作系统是windows 11 家庭版本&#xff0c;由于工作需要用到window10的环境&#xff0c;不得不安装一个虚拟机来解决问题&#xff0c;然后就把这次安装VMware虚拟机遇到的坑给大家分享一下&#xf…

研二自学嵌入式开发,就业导向,学习路线该如何规划?

研二才来问这个问题&#xff0c;有点晚&#xff0c;离你开始找工作还有大概8&#xff5e;9个月&#xff0c;你应该用应试思维来应对找工作这个事&#xff0c;尤其当前这个经济形势下。 刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入…

基于Openmv的追小球的云台

介绍 在这篇文章&#xff0c;我会先介绍需要用到且需要注意的函数&#xff0c;之后再给出整体代码 在追小球的云台中&#xff0c;比较重要的部分就是云台&#xff08;实质上就是舵机&#xff09;的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…

asp.net core反向代理

新建项目 新建空白的asp.net core web项目 安装Yarp.ReverseProxy包版本为2.2.0-preview.1.24266.1 编写代码 namespace YarpStu01;public class Program {public static void Main(string[] args){var builder WebApplication.CreateBuilder(args);builder.Services.AddRev…

JavaWeb——MySQL:DQL

3. DQL:查询 查询是使用最多、最频繁的操作&#xff0c;因为前面的修改以及删除&#xff0c;一般会交给数据库专业的人员&#xff0c;对于非数据库专业人员来说&#xff0c;老板一般会放心的让你对数据库只进行查询操作&#xff1b; 3.2 条件查询&#xff08;where&#xff09…