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

跨标签页通信的8种方式(下)

跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中,每个标签页都是相互独立的,无法直接共享数据。然而,有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作,这就需要使用跨标签页通信来实现。

常见的跨标签页方案如下:

  • BroadCast Channel

  • Service Worker

  • LocalStorage window.onstorage 监听

  • window.open、window.postMessage

  • Shared Worker 定时器轮询( setInterval

  • IndexedDB 定时器轮询( setInterval

  • cookie 定时器轮询( setInterval

  • Websocket

前面4种方式可见: 跨标签页通信的8种方式(上)

本文介绍后面4种

Shared Worker

Shared Worker 是一种在多个浏览器标签页之间共享的 JavaScript 线程。它可以用于实现跨标签页的通信。

SharedWorker 接口代表一种特定类型的 worker,可以从几个浏览上下文中访问,例如几个窗口、iframe 或其他 worker。它们实现一个不同于普通 worker 的接口,具有不同的全局作用域,

备注:  如果要使 SharedWorker 连接到多个不同的页面,这些页面必须是同源的(相同的协议、host 以及端口)。

兼容性

  1. 下面是一个使用 Shared Worker 进行通信的示例:

在主页面中:

// 创建一个 Shared Worker
const worker = new SharedWorker('worker.js');// 监听来自 Shared Worker 的消息
worker.port.onmessage = function(event) {console.log('Received message from worker:', event.data);
};// 向 Shared Worker 发送消息
worker.port.postMessage('Hello from main page!');

在 worker.js 文件中:

// 监听来自主页面的消息
self.onconnect = function(event) {const port = event.ports[0];// 监听来自主页面的消息port.onmessage = function(event) {console.log('Received message from main page:', event.data);// 向主页面发送消息port.postMessage('Hello from shared worker!');};
};

IndexedDB

IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。

IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。然而,不像 RDBMS 使用固定列表,IndexedDB 是一个基于 JavaScript 的面向对象数据库。IndexedDB 允许你存储和检索用索引的对象;可以存储结构化克隆算法支持的任何对象。你只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务

使用 IndexedDB 执行的操作是异步执行的,以免阻塞应用程序。

IndexedDB 是浏览器提供的一种本地数据库,可以用于在多个标签页之间共享数据。可以使用 setInterval 定时轮询 IndexedDB 来实现跨标签页通信。下面是一个示例:

在发送消息的标签页中:

// 打开或创建 IndexedDB 数据库
const request = indexedDB.open('messageDatabase', 1);request.onupgradeneeded = function(event) {const db = event.target.result;// 创建一个对象存储空间用于存储消息db.createObjectStore('messages', { keyPath: 'id', autoIncrement: true });
};request.onsuccess = function(event) {const db = event.target.result;// 向数据库中添加一条新消息const transaction = db.transaction(['messages'], 'readwrite');const objectStore = transaction.objectStore('messages');const message = { content: 'Hello from sender!' };objectStore.add(message);transaction.oncomplete = function() {console.log('Message sent successfully!');// 关闭数据库连接db.close();};
};request.onerror = function(event) {console.error('Error opening database:', event.target.error);
};

在接收消息的标签页中:

// 打开或创建 IndexedDB 数据库
const request = indexedDB.open('messageDatabase', 1);request.onsuccess = function(event) {const db = event.target.result;// 创建一个定时器,每隔一段时间轮询数据库中的消息setInterval(function() {// 创建一个事务const transaction = db.transaction(['messages'], 'readwrite');const objectStore = transaction.objectStore('messages');// 获取存储在对象存储中的所有消息const request = objectStore.getAll();request.onsuccess = function(event) {const messages = event.target.result;// 处理消息messages.forEach(function(message) {console.log('Received message:', message.content);// 在处理完消息后,删除该消息objectStore.delete(message.id);});// 关闭事务transaction.oncomplete = function() {console.log('Messages processed successfully!');};};request.onerror = function(event) {console.error('Error retrieving messages:', event.target.error);// 关闭事务transaction.abort();};}, 1000);
};request.onerror = function(event) {console.error('Error opening database:', event.target.error);
};

在上述示例中,我们创建了一个名为 "messageDatabase" 的 IndexedDB 数据库,并在其中创建了一个名为 "messages" 的对象存储空间用于存储消息。在发送消息的标签页中,我们向数据库中添加一条新消息。而在接收消息的标签页中,我们创建了一个定时器,每隔一段时间轮询数据库中的消息,并处理这些消息。处理完消息后,我们将其从数据库中删除。

请注意,在实际应用中,您可能需要更复杂的逻辑来处理跨标签页通信,并确保数据同步和一致性。此示例仅提供了一个基本的框架来演示如何使用 IndexedDB 实现跨标签页通信。

cookie

Cookie 是一种在浏览器和服务器之间传递的小型文本文件,可以用于在多个标签页之间共享数据。可以使用 setInterval 定时轮询 Cookie 来实现跨标签页通信。下面是一个示例:

在发送消息的标签页中:

// 设置一个 Cookie,将消息存储在 Cookie 中
document.cookie = 'message=Hello from sender!';

在接收消息的标签页中:

// 创建一个定时器,每隔一段时间轮询 Cookie 中的数据
setInterval(function () {// 获取存储在 Cookie 中的消息const cookies = document.cookie.split(';')let message = ''for (let i = 0; i < cookies.length; i++) {const cookie = cookies[i].trim()if (cookie.startsWith('message=')) {message = cookie.substring('message='.length)break}}// 处理消息if (message) {console.log('Received message:', decodeURIComponent(message))// 清除 Cookiedocument.cookie = 'message=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'}
}, 1000)

在上述示例中,我们在发送消息的标签页中设置了一个名为 "message" 的 Cookie,并将消息存储在其中。而在接收消息的标签页中,我们创建了一个定时器,每隔一段时间轮询 Cookie 中的数据。通过解析和处理 Cookie,我们可以获取到存储的消息,并进行相应的处理。处理完消息后,我们清除了该 Cookie。 请注意,在使用 Cookie 进行跨标签页通信时,需要注意以下几点:

  • 跨域名通信:Cookie 默认只能在同一域名下共享。如果需要在不同域名下进行跨标签页通信,需要设置合适的域名和路径。
  • Cookie 大小限制:Cookie 的大小有限制,通常为几 KB。如果消息较大,可能需要拆分成多个 Cookie 进行存储。
  • 安全性考虑:Cookie 中的数据可以被用户和其他脚本访问和修改。因此,不适合存储敏感信息。 以上示例提供了一个基本的框架来演示如何使用 Cookie 实现跨标签页通信。在实际应用中,您可能需要更复杂的逻辑来处理跨标签页通信,并确保数据同步和一致性。

websocket

Websocket 是一种在浏览器和服务器之间进行全双工通信的协议,可以用于实现实时的跨标签页通信。下面是一个使用 Websocket 进行通信的示例:

在发送消息的标签页中:

// 创建一个 WebSocket 连接
const socket = new WebSocket('ws://example.com');
// 监听连接成功的事件
socket.onopen = function() {// 发送消息到服务器socket.send('Hello from sender!');
};

在接收消息的标签页中:

// 创建一个 WebSocket 连接
const socket = new WebSocket('ws://example.com');
// 监听来自服务器的消息
socket.onmessage = function(event) {console.log('Received message:', event.data);
};

在服务器端:

// 创建一个 WebSocket 服务器
const WebSocketServer = require('ws').Server
const wss = new WebSocketServer({ port: 8080 })
// 监听来自客户端的连接
wss.on('connection', function (socket) {// 监听来自客户端的消息socket.on('message', function (message) {console.log('Received message:', message)// 向所有客户端发送消息wss.clients.forEach(function (client) {client.send(message)})})
})

在上述示例中,我们在发送消息的标签页中创建了一个 WebSocket 连接,并在连接成功后发送一条消息到服务器。而在接收消息的标签页中,我们也创建了一个 WebSocket 连接,并监听来自服务器的消息。当服务器收到来自任何客户端的消息时,它会将该消息广播给所有连接的客户端。

总结

这些通信方式各有优劣,选择适合的方式取决于具体的需求和场景。Shared Worker 和 Websocket 提供了实时性和双向通信的能力,适用于需要实时更新和交互的应用。IndexedDB 和 Cookie 则适用于需要存储和同步数据的场景,但相对于实时性较差。根据具体需求,可以选择合适的通信方式来实现跨标签页的通信。

相关文章:

跨标签页通信的8种方式(下)

跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中&#xff0c;每个标签页都是相互独立的&#xff0c;无法直接共享数据。然而&#xff0c;有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作&#xff0c;这就需要使用跨…...

笔记二十、使用路由Params进行传递参数

20.1、在父组件中设置路由参数 <NavLink to{classify/${this.state.name}} className{this.activeStyle}>classify</NavLink> 父组件 Home/index.jsx import React from "react"; import {NavLink, Outlet} from "react-router-dom";class Ap…...

K8S----taint、tolerations、label

一、污点(taint),针对的是节点,只有node才有污点的概念 1、 给节点增加一个污点 kubectl taint nodes node1 key1=value1:NoSchedule给节点 node1 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule。 这表示只有拥有和这个污点相匹配的容忍度的 Pod 才能…...

【双指针】三数之和

三数之和 在做这道题之前&#xff0c;建议建议先将两数之和做完再做&#xff0c;提升更大~ 文章目录 三数之和题目描述算法原理解法一解法二思路如下&#xff1a;处理细节问题&#xff1a; 代码编写Java代码编写C代码编写 15. 三数之和 - 力扣&#xff08;LeetCode&#xff0…...

CH01_适应设计模式

Iterator模式&#xff08;迭代器模式&#xff09; 迭代器模式&#xff08;Iterator&#xff09;,提供一种方法&#xff0c;顺序访问一个聚合对象中各个元素&#xff0c;而不是暴露该对象的内部表示。 类图结构 说明 Iterator&#xff08;迭代器&#xff09; 该角色负责定义按…...

电机工作制

电机工作制 1.什么是电机工作制2.电机工作制的分类 最近在做电机控制器&#xff0c;看到很多电机铭牌上写着工作制&#xff1a;S*&#xff0c;有S1&#xff0c;有S2&#xff0c;查了一下&#xff0c;学习一下是什么意思。 1.什么是电机工作制 根据GBT 755-2019《旋转电机定额…...

qt国际化多语言

vs + qt 方法 一 (1)生成.pro文件 如果报错: cannot find any qt projects to export 则执行如下: 然后重新生成 pro文件。 (2)生成ts文件 (方法1)在项目文件(xxx.pro) 文件添加: TRANSLATIONS += en.ts zh_CN.ts 然后打开cmd命令,进入项目目录,执行 l…...

Java Excel Poi 单元格内置的数据格式

位置 //在类 org.apache.poi.ss.usermodel.BuiltinFormats 中的私有成员变量_formats中 private static final String[] _formats new String[]{"General", "0", "0.00", "#,##0", "#,##0.00", "\"$\"#,##…...

【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是一个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录&#xff08;比如 /tmp&#xff09;下进行操作’而完全不会受宿主机以及其他容器的影响。 容器…...

竞赛选题 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…...

开源WIFI继电器之源代码

源代码:WiFiRelay: 基于ESP8285的WiFi继电器代码 1、环境搭建 开发环境搭建请参照win10搭建ESP8266_RTOS_SDK编译环境_xtensa-lx106 下载-CSDN博客 2、下载代码 在sdk路径下创建一个projects的文件夹&#xff0c;将WiFiRelay的代码克隆到此目录下&#xff1a; mkdir projec…...

NX二次开发UF_CURVE_create_arc_point_point_radius 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_point_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_point_radius(tag_t point1, tag_t point2, double radius, UF_CURVE_limit_p_t l…...

Unsupervised MVS论文笔记(2019年)

Unsupervised MVS论文笔记&#xff08;2019年&#xff09; 摘要1 引言2 相关工作3 实现方法3.1 网络架构3.2 通过光度一致性学习3.3 MVS的鲁棒光度一致性3.4 学习设置和实施的细节3.5.预测每幅图像的深度图 4 实验4.1 在DTU上的结果4.2 消融实验4.3 在ETH3D数据集上的微调4.4 在…...

2-Python与设计模式--前言

0-Python与设计模式–前言 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验&#xff0c; 考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言&#xff0c; 它是一种解决问题的思…...

如何判别使用的junit是4还是5

Junit4与Junit5的版本中&#xff0c;Test注解的包位置不同。 Junit4的Test注解是在org.junit包下&#xff0c;儿Junit5的Test注解是在org.junit.jupiter.api包下。 可据此判定是使用的Junit4还是Junit5。 Junit4 import org.junit.Test;Junit5 import org.junit.jupiter.api…...

C#-创建用于测试的父类StartupBase用于服务注入

当写完C#代码&#xff0c;需要对某个方法进行测试。 创建一个XXXTests.cs文件之后&#xff0c;发现需要注入某个服务怎么办&#xff1f; 再创建一个StartupBase.cs文件&#xff1a; public abstract class StartupBase {public IConfiguration Configuration { get; }public …...

JMeter之压力测试——混合场景并发

在实际的压力测试场景中&#xff0c;有时会遇到多个场景混合并发的情况&#xff0c;这时就需要设置不同的并发比例对不同场景请求数量的控制&#xff0c;下面提供两种方案。 一、多线程组方案 1.业务场景设计如下&#xff1a;场景A、场景B、场景C&#xff0c;三个场景按照并发…...

Python入门04字符串

目录 1 字符串的定义2 转义字符3 字符串的常见方法4 分割字符串5 字符串反转6 字符串的链式调用7 格式化字符串8 多行字符串总结 1 字符串的定义 在Python中&#xff0c;字符串表示一个字符的序列&#xff0c;比如 str "hello,world"这里我们定义了一个字符串&…...

vue3(四)-基础入门之 fetch 与 axios

一、fetch 1、axios和fetch的区别 Axios 和 Fetch 都是 JavaScript 中用于发送 HTTP 请求的 API&#xff0c;它们的主要区别在以下方面&#xff1a; 1.Axios 支持更广泛的浏览器和 Node.js 版本&#xff0c;而 Fetch 只能在较新的浏览器中使用&#xff0c;或需要使用 polyfi…...

2016年五一杯数学建模C题二孩政策问题解题全过程文档及程序

2016年五一杯数学建模 C题 二孩政策问题 原题再现 多年来实施的严、紧计划生育政策对控制人口增长起到关键作用。在优生优育政策的指引下&#xff0c;我国人口质量显著提高&#xff0c;但也带来了不利影响&#xff0c;生育率偏低、男女比例失衡、人口老龄化情况严重等问题。2…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...