浏览器跨标签通信

news2024/11/18 6:37:19

写在前面

今天说一下跨标签通信的一种实现方式,首先跨标签指的是同一个浏览器中不同标签之间进行数据通信,也就是说比如在第一个标签写了一个数据,在另一个标签里面进行数据的使用,而且是实时的

先说现象

在这里插入图片描述
当我点击发送消息给标签二的时候,标签二就立刻收到了发送的消息内容,并渲染到页面上,这是现象

为什么不用 vuex 或者是 pinia

使用这些的前提是单页面单标签的使用,是不涉及到多标签的,所以他们的数据在不同标签之间也是不共享的

为什么不用 localStorage

因为localStorage是共享,但是不是实时的,无法做到页面不刷新就更新数据的目的

实现方案之一:BroadcastChannel

MDN-BroadcastChannel

他的实现过程是很简单的,通过一个实例发送一条广播出去,这个时候浏览器可以通过监听消息的方式进行获取对应的实例的消息内容,如果不想监听了,就直接调用他自己的方法进行关闭即可

代码实现
// TODO: 创建一个BroadcastChannel的实例
const BC = new BroadcastChannel('tagCommunication-channel')

/**
 * TODO: 发送消息给所有的监听标签页
 * @param {any} 广播消息的内容
 */
const sendMessages = (obj = {}) => {
	console.log("🚀 广播一条消息:", obj)
	BC.postMessage(obj)
}

/**
 * TOOD: 接收消息
 * @param {Function} 接收消息的回调方法
 */
const receiveMessages = (cb) => {
	if (cb) {
		BC.addEventListener('message', (e) => {
			console.log("🚀 接收到的广播消息:", e)
			cb(e.data)
		})
	} else {
		console.error('🚀 回调函数是必传项')
	}
}

// TODO: 关闭接收广播 以便于JS的垃圾回收
const closeMessage = () => {
	BC.close()
}
函数调用- 标签一
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>标签一</title>
		<script src="./crossTagCommunication.js"></script>
	</head>
	<body>
		<button onclick="sendMsg()">发送消息给标签二</button>
		<script>
			// TODO: 发送一条广播
			function sendMsg() {
				const data = {
					name: 'tom',
					age: 16
				}
				sendMessages(data)
			}
		</script>
	</body>
</html>
函数调用-标签二
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>标签二</title>
		<script src="./crossTagCommunication.js"></script>
	</head>
	<body>
		<span id="msg">收到的消息</span>
		<script>
			// TODO: 设置获取到的消息进行处理
			const setMessage = (data) => {
				let pageDom = document.getElementById('msg')
				pageDom.innerText = data.name
				// TODO: 接收结束 关闭广播 
				closeMessage()
			}
			// TODO: 自执行函数进行接收获取到的广播消息
			(() => {
				receiveMessages(setMessage)
			})()
		</script>
	</body>
</html>

打完收工

这总跨标签的实现方案是有很多的,这只是其中一种,感兴趣的可以自己搜一下一共有多少种方案,我之前写过的 workerjs 也是可以实现的,感兴趣的可以去看看,拜拜!

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

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

相关文章

深度学习:基于循环神经网络RNN实现语句生成

目录 1 循环神经网络介绍 1.1 什么是循环神经网络 1.2 RNN的网络结构 1.3 RNN的工作原理 ​编辑 1.4 RNN的应用场景 2 基于RNN实现语句生成 2.1 句子生成介绍 2.2 基于pytorch实现语句生成 2.3 完整代码 2.4 该模型的局限 3 总结 1 循环神经网络介绍 1.1 什么是循环…

【rar密码】rar压缩包密码忘记了,如何解密?

Rar压缩包设置了加密&#xff0c;在解压、修改密码等操作时都需要输入正确的密码。忘记了密码就很麻烦了&#xff0c;如果真的忘记密码&#xff0c;唯一的方法就是找回密码了。 我们自己想要找回密码&#xff0c;最直接简单的就是自己尝试密码。如果压缩包密码是自己设置的&am…

IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found

问题&#xff1a; 使用IDEA新建spring boot项目&#xff0c;报错如下&#xff1a; Plugin org.springframework.boot:spring-boot-maven-plugin: not found解决办法&#xff1a; 1.在本地maven仓库中找到spring-boot-maven-plugin的版本号 2.在pom.xml文件中添加对应的版本…

ubuntu 22.04安装cuda、cudnn、conda、pytorch

1、cuda 视频连接 https://www.bilibili.com/video/BV1bW4y197Mo/?spm_id_from333.999.0.0&vd_source3b42b36e44d271f58e90f86679d77db7cuda 11.8 https://developer.nvidia.com/cuda-toolkit-archive点击进入 https://developer.nvidia.com/cuda-11-8-0-download-arc…

win10安装vmware17 pro和centos7及配置

1.下载地址 https://www.bear20.com/pcwin/153/725878653.htmlhttps://www.ittel.cn/archives/12099.html #以下许可证 选择其一即可 4A4RR-813DK-M81A9-4U35H-06KND NZ4RR-FTK5H-H81C1-Q30QH-1V2LA JU090-6039P-08409-8J0QH-2YR7F 4Y09U-AJK97-089Z0-A3054-83KLA 4C21U-2KK9Q-…

Vue-router路由

配置路由 相当于SpringMVC的Controller 路径然后&#xff0c;跳转到对应的组件 一键生成前端项目文档

虹科方案 | 利用扩展型 NAS 存储加速 AI/ML 工作负载

一、AI&ML变革日常生活 AI&#xff08;人工智能&#xff09;和ML&#xff08;机器学习&#xff09;的发展正逐渐渗透到我们的日常生活中&#xff0c;为我们带来了翻天覆地的变化。从智能手机中的语音助手到智能家居设备&#xff0c;AI的应用让我们的生活更加便捷和智能化。…

UWB高精度定位系统源码 UWB室内定位技术 工作考勤、电子围栏、历史轨迹回放、巡检巡查

现代制造业厂区面积大、人员数量多、物资设备不断增加&#xff0c;随着工业信息化技术的发展&#xff0c;大型制造企业中对人员、车辆、物资的管理要求越来越细致。 智慧工厂高精度定位管理系统使用UWB室内定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备…

Spring Boot 整合 Shiro(后端)

1 Shiro 什么是 Shiro 官网&#xff1a; http://shiro.apache.org/ 是一款主流的 Java 安全框架&#xff0c;不依赖任何容器&#xff0c;可以运行在 Java SE 和 Java EE 项目中&#xff0c;它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 …

【juc】ReentrantReadWriteLock之缓存(仅当学习)

目录 一、说明二、代码示例2.1 pom依赖2.2 示例代码2.3 实体类 三、示例截图 一、说明 1.针对于读多写少的情况 2.先查缓存&#xff0c;没有再去查库 二、代码示例 2.1 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"h…

leetcode 第 361 场周赛

2843. 统计对称整数的数目 核心思想&#xff1a;枚举每一个数是否是对称整数,第一种写法为python写法&#xff0c;第二种为一般写法我觉得更好&#xff0c;非常有思想性。 2844. 生成特殊数字的最少操作 核心思想&#xff1a;枚举特殊数字结尾的几种可能。其实自己做的时候一…

postman9.12.汉化版(附有下载链接)

想用英文版本的可以直接点击下载最新版本 这里直接付上9.12.2版本的下载链接&#xff0c;如果大家要下载别的版本&#xff0c;可以直接修改链接里面的版本号即可 &#xff0c;下面是汉化包下载 链接&#xff1a;https://pan.baidu.com/s/1izK3HfqlfXJdq6KIYeJ2zw?pwdpetk 提…

MySQL加密的几种常见方式

MySQL提供了多种加密方式来保护数据的安全性。下面是几种常见的MySQL加密方式&#xff1a; 密码加密&#xff1a; MySQL5.7及以上版本使用SHA-256算法对密码进行加密。这种加密方式更安全&#xff0c;可以防止密码泄露。 之前的MySQL版本使用SHA-1算法进行密码加密。这种加密方…

解决DNS服务器未响应错误的方法

​当你将设备连接到家庭网络或具有互联网接入功能的Wi-Fi热点时,由于各种原因,互联网连接可能无法正常工作。本文中的说明适用于Windows 10、Windows 8和Windows 7。 无法连接到DNS服务器的原因 故障的一类与域名系统有关,域名系统是世界各地互联网提供商使用的分布式名称…

[C++][pcl]pcl安装后测试代码3

测试环境&#xff1a; vs2019 pcl1.12.1 代码&#xff1a; #include<iostream> #include <thread>#include <pcl/common/common_headers.h> #include <pcl/features/normal_3d.h> #include <pcl/io/pcd_io.h> #include <pcl/visualizatio…

Debian离线安装mysql

PS:虽然已经分享了很多安装各种环境订的教程&#xff0c;但是每个客户的环境不一样&#xff0c;那就得重新来一次&#xff0c;其实都是大同小异的&#xff0c;但是里面其实也是存在不少坑的&#xff0c;今天我们就来安装一个新的东西&#xff0c;Debian 11离线安装mysql,为什么…

FinClip 支持创建 H5应用类小程序;PC 终端 优化升级

FinClip 的使命是使您能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型。不妨让我们看看本月产品与市场发布亮点&#xff0c;是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f447;&#x1f447; FinClip 支持创建 H5应用类小程序 近期我们…

微服务01-基本介绍+注册中心EureKa

基本介绍 服务集群&#xff1a;一个请求由多个服务完成&#xff0c;服务接口暴露&#xff0c;以便于相互调用&#xff1b; 注册中心&#xff1a;每个服务的状态&#xff0c;需要进行维护&#xff0c;我们可以在注册中心进行监控维护服务&#xff1b; 配置中心&#xff1a;这些…

机器学习笔记之最优化理论与方法(六)无约束优化问题——最优性条件

机器学习笔记之最优化理论与方法——无约束优化问题[最优性条件] 引言无约束优化问题无约束优化问题最优解的定义 无约束优化问题的最优性条件无约束优化问题的充要条件无约束优化问题的必要条件无约束优化问题的充分条件 引言 本节将介绍无约束优化问题&#xff0c;主要介绍无…

周赛361(模拟、枚举、记忆化搜索、统计子数组数目(前缀和+哈希)、LCA应用题)

文章目录 周赛361[2843. 统计对称整数的数目](https://leetcode.cn/problems/count-symmetric-integers/)模拟 [2844. 生成特殊数字的最少操作](https://leetcode.cn/problems/minimum-operations-to-make-a-special-number/)记忆化搜索枚举 [2845. 统计趣味子数组的数目](http…