浏览器跨标签页通信的方式都有哪些

news2024/10/7 8:25:21

跨标签页的实际应用场景:

1. 共享登录状态:

用户登录后,多个标签页中需要及时获取到登录状态,以保持一致的用户信息。这种情况,可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态,并通过监听storage时间来实现不同标签页之间的状态同步。

2. 实时通知和消息推送:

如果用户在一个标签页上收到了新消息或通知,可以通过跨标签页通信将该消息或通知传递给其他标签页。一种常见的处理方式是使用浏览器的localStorage或IndexedDB来存储未读消息或通知,然后通过监听storage事件或定时轮询来检查新消息或通知的变化。

3. 跨标签页数据共享:

有时候需要在不同的标签页之间共享一些数据,例如购物车数据、选项设置等。这可以通过在localStorage或IndexedDB中存储数据,并借助storage事件或定时轮询来实现数据的同步更新。

4. 标签页之间的导航同步:

当用户在一个标签页中进行导航操作(例如点击链接或提交表单)时,其他标签页可能也需要跟随导航到相应的页面。这可以通过在标签页之间发送消息或共享状态来实现导航的同步。

浏览器跨标签页通信实现方式:

1. 使用localStorage或sessionStorage存储共享数据,并通过监听storage事件来实现数据的变化检测和同步更新。

监听storage变化可以使用 window.addEventListener 来实现,操作简单,同域名下共享数据

    window.addEventListener("storage", e => {
        console.log('变了', e)
        console.log("被修改的键: ", e.key);
        console.log("旧值: ", e.oldValue);
        console.log("新值: ", e.newValue);
    })

storage 包括一些属性如下:

  1. key:被修改的键;

  2. newValue:修改后的新值;

  3. oldValue:修改前的值;

  4. storageArea:事件监听对应的 Storage 对象

2. 使用BroadcastChannel API,它提供了一种跨窗口通信的机制,可以在不同标签页之间发送消息。

BroadcastChannel 通信的方式原理就是一个命名管道。它允许让指定的同源下浏览器不同的窗口来订阅它。

每个 BroadcastChannel 对象都需要使用一个唯一的名称来标识通道,这个名称在同一域名下的不同页面之间必须是唯一的。它允许同一域名下的不同页面之间进行通信。

通过 postMessage 方法,一个页面可以将消息发送到频道中,而其他页面则可以监听 message 事件来接收这些消息。通过这种方式是短线了一种实时通信的机制,可以在不同的页面之间传递信息,实现页面间的即时交流。

要想使用,首先我们创建两个不同的 html 文件分别代表不同的页面,并且使用 live server 开启一个本地服务器。通过 postMessage 向管道中发送消息,当管道中存在消息的时候,可以通过 onmessage 方法获取到信息内容。

3. 使用window.postMessage()方法,该方法允许在不同的窗口或标签页之间安全地传递消息。通常,对于两个不同页面的脚本,只有同源时,这两个脚本才能相互通信。

通过点击按钮在主窗口和弹出的新窗口之间进行通信。通过 postMessage,主窗口可以向新窗口发送数据,从而实现了简单的跨窗口通信。在实际应用中,你可以在接收消息的窗口中监听 message 事件,然后在事件处理程序中处理接收到的数据。

4. 借助服务端的实时通信技术,如WebSocket,通过服务器作为中介来实现标签页之间的消息传递和数据同步。

特点:保持连接状态;全双工通信;没有同源共享策略

其实实现原理页比较简单,假如我们pageA和pageB都与服务器建立了websocket连接,那么两个页面都可以实时接收服务端发来的消息,也可以实时向服务端发送消息。如果pageA更改了数据,那么向服务端发送一条消息或数据,服务端在将这条消息或数据发送给pageB即可,这样就简单实现了两个标签页之间的通信。
原理有点类似于"中介",我们可以通过中介来进行沟通。

好处:可实现跨域共享;

限制:需要专门起一个websocket服务器,维护成本高,不建议使用

5. Service worker,允许开发者拦截和控制页面发出的网络请求,以及管理缓存,从而实现离线访问、性能优化和推送通知等功能。

Service Worker 它是一种服务工作线程,是一种在浏览器背后运行的脚本,用于处理网络请求和缓存等任务。它是一种在浏览器与网络之间的中间层。

它在浏览器背后独立运行与网页分开,这意味着即使用户关闭了网页,Service Worker 仍然可以运行。可以用于实现推送通知功能。它可以注册为推送消息的接收者,当服务器有新的通知要发送时,Service Worker 可以显示通知给用户,即使网页没有打开。

要想使用,首先我们创建两个不同的 html 文件分别代表不同的页面,创建一个 Service Worker 文件,并且使用 live server 开启一个本地服务器。

6. SharedWorker 是一种在 Web 浏览器中使用的 Web API,它允许不同的浏览上下文,如不同的浏览器标签页之间共享数据和执行代码。它可以用于在多个浏览上下文之间建立通信通道,以便它们可以共享信息和协同工作。

与普通的 Worker 不同,SharedWorker 可以在多个浏览上下文中实例化,而不仅限于一个单独的浏览器标签页或框架。这使得多个浏览上下文可以共享同一个后台线程,从而更有效地共享数据和资源,而不必在每个标签页或框架中都创建一个独立的工作线程。

sharedWoker 特点:

  • 跨域不共享,即多个标签页不能跨域
  • 使用port发送和接收消息
  • 如果url相同,且是同一个js,那么只会创建一个sharedWorker,多个页面共享这个
  • sharedWorker
6. IndexedDB 是一种在浏览器中用于存储和管理大量结构化数据的 Web API。它提供了一种持久性存储解决方案,允许 Web 应用程序在客户端存储数据,以便在不同会话、页面加载或浏览器关闭之间保留数据。

与传统的 cookie 或 localStorage 等存储方式不同,IndexedDB 更适合存储复杂的、结构化的数据,例如对象、数组、键值对等。这使得它特别适用于应用程序需要存储大量数据、执行高级查询或支持离线工作的情况。

7. cookie,直接使用 document.cookie 可以获取cookie值

document.cookie = ''  // 可以改变cookie的值

实现逻辑:类似于 localStorage,在页面A存储数据在cookie上,页面B设置定时器每秒钟获取一次最新的cookie,就可以获取到页面A最新的数据。 

好处:简单

限制: 必须是在同域下才能共享;限制存储空间;浪费资源;

小结:

浏览器跨标签通信方式对比

实现方式优缺点
localStorage优点: 操作简单,易于理解。缺点: 存储大小限制只能监听非己页面跨域不共享 (总体来说较为推荐)
websocket优点: 理论上可是实现任何数据共享跨域共享 缺点: 需要服务端配合增加服务器压力上手不易 (总体不推荐)
sharedWorker优点: 理论上可以实现任何数据共享性能较好 缺点: 跨域不共享调试不方便兼容性不好 (总体推荐一般)
cookie优点: 兼容性好易于上手和理解 缺点: 有存储大小限制轮询消耗性能发请求会携带cookie (总体不推荐)

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

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

相关文章

面试不慌张:一文读懂FactoryBean的实现原理

大家好,我是石头~ 在深入探讨Spring框架内部机制时,FactoryBean无疑是一个关键角色,也是面试中经常出现的熟悉面孔。 不同于普通Java Bean,FactoryBean是一种特殊的Bean类型,它的存在并非为了提供业务逻辑,…

串口小项目 - 声控刷抖音

项目准备: orangepi02 语言 模块: SU-03T 电脑 接线: 语言模块 - orangepi VCC - 5V GND - GND B7(RX)--RX-5 orangepi 手机 通过usb 连接 实现思路图: 语言模块接收到语言信息,发送到 H616 去处理,H616再控制手机实现语言刷抖音的功能 …

(2022级)成都工业学院数据库原理及应用实验八: 数据库恢复技术

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、使用mysqldump实现数据库备份。 2、使用mysqldump实…

LCR 023. 相交链表

给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&#xf…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处: 对于浏览器来说,标签不够语义化对于搜索引擎来说,不利于SEO的优化 语义化标签: header:头部元素nav:导航section:定义文档某个区域的元素article:内容元素aside…

文心一言 VS 讯飞星火 VS chatgpt (241)-- 算法导论17.3 7题

七、为动态整数多重集 S (允许包含重复值)设计一种数据结构,支持如下两个操作:① INSERT(S,x) 将 x 插入 S 中;② DELETE-LARGER-HALF(S) 将最大的 ⌈|S|/2⌉ 个元素从S中删除。解释如何实现这种数据结构,使得任意 m 个 INSERT 和…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本:centos7 安装环境:vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

企业上云数字化转型的关键——选对服务器虚拟化

盘点市面上的主流虚拟化软件 虚拟化技术就像可以随意组合的乐高积木,可以高效、灵活地利用计算资源。世面上主流虚拟化很多,各有长处和短板。今天先来盘点一下市面上的主流虚拟化软件,一探究竟。 虚拟化的老牌巨头——VMware 老牌虚拟化巨…

Java数据结构-堆和优先级队列

目录 1. 相关概念2. PriorityQueue的实现2.0 搭建整体框架2.1 堆的创建和调整2.2 插入元素2.3 出堆顶元素 3. 全部代码(包含大根堆和小根堆)4. PriorityQueue的使用5. Top-K问题 之前我们学习的二叉树的存储方式是链式存储,(不清楚…

VLOOKUP函数使用,为什么会报错“引用有问题”?

VLOOKUP函数的使用非常广泛,在excel2007版之后的软件中,使用VLOOKUP函数也许会遇到这样的场景,明明公式是没有问题的,公式还会报错“引用有问题”。 一、报错场景 输入公式后,回车确认,显示如下报错&…

嵌入式学习57-ARM7(字符设备驱动框架led)

知识零碎: kernel 内核 printk 内核打印 cat /proc/devices mknod ? 查看指令 gcc -oapp hello.c 字符设备驱动流程 字符设备程序运行流程 gcc中-c和-o是编译时可选的参数 -c …

揭阳硕榕超市管理系统的设计与实现(论文)_kaic

摘 要 在互联网高速发展环境下,传统的管理手段无法满足对信息的高效、快速的管理要求。为顺应时代发展的需要,提高超市的管理效能,提高超市的管理速度,构建一个信息化的工作流程,揭阳硕榕超市管理系统应运而生。 根…

Jmeter04:关联

1 Jmeter组件:关联 概括:2个请求之间不是独立的,一个请求响应的结果是作为另一个请求提交的数据,存在数据交互 1.1 是什么? 就是一个请求的结果是另一个请求提交的数据,二者不再是独立 1.2 为什么&#x…

Python 面向对象——1.基本概念

本章学习链接如下: 基本概念与语法 类(Class):定义了一组对象共有的属性和方法的蓝图。类是创建对象的模板。 对象(Object):类的实例。对象包含实际的数据和操作数据的方法。 属性&#xff0…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序,将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏,给天空盒添加time of lighting材质 打开材质里的衣服,发现只有一个衣服文件 …

【Canvas与艺术】绘制黑白山间野营Camping徽章

【说明】 中间的山月图是借用的网上的成图&#xff0c;不是用Canvas绘制的。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

微信域名防封/QQ域名防封/域名状态检测/域名防红防封API平台源码

下载地址&#xff1a;API平台源码 这套源码是使用thinkphp3.1.3开发的&#xff0c;可以在PHP5.3-5.6下运行&#xff0c;程序是有一点老了&#xff0c;但是思路仍在&#xff01;然后&#xff0c;这套源码我已经成功搭建起来了&#xff0c;后台、个人&#xff08;用户&#xff0…

跟TED演讲学英文:How AI could save (not destroy) education by Sal Khan

How AI could save (not destroy) education Link: How AI could save (not destroy) education Speaker: Sal Khan Date: April 2023 文章目录 How AI could save (not destroy) educationIntroductionVocabularyTranscriptSummary后记 Introduction Sal Khan, the founder…

【UE5 C++】VS2022下载安装

先看一下UE和VS的兼容性 &#xff08;虚幻5&#xff1a;为虚幻引擎C项目设置Visual Studio开发环境&#xff09; &#xff08;虚幻4&#xff1a;设置虚幻引擎的Visual Studio&#xff09; 为了让VS更好兼容UE5&#xff0c;因此这里下载VS2022版本 步骤 1. 进入Visual Stud…

Linux 共享内存 及 利用管道实现简单协同

共享内存&#xff08;Shared Memory&#xff09;是一种多个进程之间共享某些内存区域以进行通信的机制。这些共享的内存区域可以被多个进程访问&#xff0c;从而实现对进程间数据的快速交换。共享内存是最快的IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信…