跨标签页通信的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 则适用于需要存储和同步数据的场景,但相对于实时性较差。根据具体需求,可以选择合适的通信方式来实现跨标签页的通信。

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

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

相关文章

1233:单词倒置(C语言)

题目描述 最近birdfly收到了女友的几份信件&#xff0c;为了只要他俩知道信件的秘密&#xff0c;女友把信件里的每个单词都倒置了。这样只有birdfly将它们倒置过来才能明白女友的心思了。为此birdfly还特意请你编写程序帮他解决一下这个问题。 简单起见假定每封信只包含英文单词…

DDD全网最通俗易懂讲解(一)

基础概念 领域 领域就是用来确定范围的&#xff0c;范围即边界&#xff0c;这也是DDD在设计中不断强调边界的原因。简言之&#xff0c;DDD的领域就是这个边界内要解决的业务问题域。领域可以进一步划分为子领域。一个领域相当于一个问题域&#xff0c;领域拆分为子域的过程就…

详解二叉树

【本节目标】 1.树的概念和结构 2.二叉树的概念和结构 3.二叉树的顺序结构及实现 4.二叉树的链式结构及实现 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它由一个根结点和n(>0)个子树构成&#xff0c;之所以叫做树&#xff0c;是因为它很像生活…

Hive数据库与表操作

文章目录 一、准备工作二、Hive数据库操作&#xff08;一&#xff09;Hive数据存储&#xff08;二&#xff09;创建数据库&#xff08;三&#xff09;查看数据库&#xff08;四&#xff09;修改数据库信息 一、准备工作 二、Hive数据库操作 &#xff08;一&#xff09;Hive数据…

Python Selenium 图片资源自动搜索保存 项目实践

实现访问首页 from os.path import dirnamefrom selenium import webdriverclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self):"""初始化"""self.driver webdriver.Chrome(executable_pa…

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

oracle数据库备份2(expdp)

使用exp命令定时进行数据库备份的操作前面已经记录过&#xff1a; oralce数据库定时备份 下面记录下使用更加高效的expdp命令和impdp&#xff0c;这两个命令同样是用来做数据库备份和还原的&#xff0c;但速度更快&#xff0c;效率更高&#xff0c;缺点是只能用在服务器端进行…

阿里云ACE认证之国际版与国内版对比!

大厂疯狂裁员&#xff0c;互联网行业迎来寒冬&#xff0c;技术人员被动陷入疯狂内卷。在愈加内卷的IT领域&#xff0c;“云计算”作为少有的蓝海&#xff0c;无疑是打工人未来实现职场提升、摆脱内卷的绝佳选择&#xff01; 对于云计算行业的人来说&#xff0c;最值得考的肯定是…

洪泽湖流域建筑物、人口密度与土地利用数据技术服务

一&#xff0e;背景介绍 人类社会发展离不开土地&#xff0c;没有土地就没有人类&#xff0c;土地利用随着人类的出现而发生。人类为了一定的社会或经济方面的目的&#xff0c;会通过利用、改造等活动。从土地上获得更多的资源。土地利用既要受自然条件的制约&#xff0c;同时也…

2023年国赛试题:配置inux1 为 CA 服务器

试题内容:配置 linux1 为 CA 服务器,为 linux 主机颁发证书。证书颁发机构有 效期 10 年,公用名为 linux1.skills.lan。申请并颁发一张供 linux 服务器使用的证书,证书信息:有效期 =5 年,公用名=skills.lan, 国家=CN,省=Beijing,城市=Beijing,组织=skills,组织单位…

Unity UGUI的自动布局-LayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件&#xff1f; HorizontalLayoutGroup是Unity UGUI中的一种布局组件&#xff0c;用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小&#xff0c;使它们…

亚马逊云科技实现了奇瑞捷豹路虎SAP系统的上云目标并保持成本优化

11月23日&#xff0c;“2023第八届IDC中国数字化转型年度盛典”正式开启并揭晓“2023 IDC中国未来企业大奖-卓越奖”获奖企业&#xff0c;奇瑞捷豹路虎汽车有限公司&#xff08;以下简称“奇瑞捷豹路虎”&#xff09;凭借“基于云原生的智慧化运营平台”项目&#xff0c;继获得…

自动驾驶HWP功能规范

HWP功能规范 Highway Pilot Functional Specification 文件状态&#xff1a; 【√】草稿 【】正式发布 【】正在修改 文件起草分工 撰写&#xff1a; 审核&#xff1a; 编制&#xff1a; 签名&#xff1a; 日期&#xff1a; 审核&#xff1a; 签名&#xff1a; 日期&am…

企业业务场景如何实现自动化连接?

为什么要实现企业业务场景的自动化连接&#xff1f; 可提高效率&#xff0c;自动化连接可以减少人工操作和手动干预的需求&#xff0c;从而提高业务处理的速度和效率。通过自动化连接&#xff0c;不同的系统、应用程序和流程可以自动协同工作&#xff0c;减少了人工处理的时间和…

【计算机组成原理】存储系统

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理计算机组成原理中 存储系统的知识点和值得注意的地方 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以…

打游戏NVIDIA怎么设置性能最好?

打游戏NVIDIA怎么设置性能最好&#xff1f;当前很多用户都在Win10电脑上畅玩游戏&#xff0c;所以想知道NVIDIA控制面板最佳设置方法&#xff0c;更好地发挥NVIDIA控制面板性能&#xff0c;用户就能享受更棒的游戏乐趣。接下来小编给大家详细介绍NVIDIA显卡游戏最佳设置步骤教程…

【Proteus仿真】【51单片机】智能晾衣架设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1604液晶、按键、蜂鸣器、L298N电机、PCF8591 ADC模块、DHT11温湿度传感器、雨滴传感器、风速、光线传感器等。 主要功能&#xff1a; 系统运行…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 6》(10)

《Linux操作系统原理分析之Linux 进程管理 6》&#xff08;10&#xff09; 4 Linux 进程管理4.6 Linux 管道4.6.1 管道的概念4.6.2 无名管道1.终端使用2.程序中使用 4.6.2 命名管道1.终端使用2.程序中使用 4 Linux 进程管理 4.6 Linux 管道 4.6.1 管道的概念 1、管道是 linu…

2019年10月17日: Go生态洞察:在Go 1.13中处理错误

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…