浏览器跨tab页面通信方式总结

需求:

浏览器不同 tab 标签页之间是独立的, 如果要通信必须通过特殊手段来实现跨标签页通信。 

1.StorageEvent 事件

当一个标签页 localStorage 变化时(sessionStorage 无效),同源下另一个或其他所有标签页使用 DOM2 监听 storage 事件监听,不能使用 DOM0 监听,最新 Chrome 不支持。

StorageEvent:当前页面使用的 storage 被其他页面修改时会触发 StorageEvent 事件。

事件在同一个域下的不同页面之间触发,即在 A 页面注册了 storge 的监听处理,只有在跟 A 同域名下的 B 页面操作 storage 对象,A 页面才会被触发 storage 事件

示例代码:

// 在一个标签页中设置localStorage
window.localStorage.setItem("sendMessage", "Hello,Bro!");// 在同源下另一个或所有的标签页下所有数据 监听storage 事件
window.addEventListener("storage", e => {console.log(e.key);console.log(e.oldValu);console.log(e.newValue);if (e.key === "sendMessage") {console.log(e.newValue); // Hello,Bro!}
});

事件对象包含以下属性:

2.window.open 配合 window.postMessage

otherWindow.postMessage(message, targetOrigin, [transfer]);

message:要发送的消息,可以是任意类型的数据。

targetOrigin:通过窗口的 origin 属性来指定哪些窗口能接收到消息事件,其值可以是字符串"_"(表示无限制)或者一个 URI。在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配 targetOrigin 提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。这个机制用来控制消息可以发送到哪些窗口;例如,当用 postMessage 传送密码时,这个参数就显得尤为重要,必须保证它的值与这条包含密码的信息的预期接受者的 origin 属性完全一致,来防止密码被恶意的第三方截获。如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的 targetOrigin,而不是 _。不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。

transfer:可选的,是一串和 message 同时传递的 Transferable 对象。这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。

targetOrigin 值可以是以下任意一个:

一个 URI,表示该 URI 所表示的源。

示例代码:

// 在一个标签页中发送消息
const baidu = window.open("baidu.com");
baidu.postMessage("Hello,Bro!", "*");
// 在window.open()打开的另一个标签页中接受消息
window.addEventListener("message", event => {console.log("Received", event.data); // Received Hello,Bro!
});

3.BroadcastChannel(webworker 可用)

BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

BroadcastChannel 顾名思义 广播频道,这个 WEB API 设计用来跨标签页之间通信

属性

BroadcastChannel.name 频道名称,返回 DOMString。

事件处理程序

BroadcastChannel.onmessage(),或 BroadcastChannel.addEventListener('message',callback) 事件处理器,用于定义当该对象上触发了 message 事件时要执行的函数。BroadcastChannel.onmessageerror(),或 BroadcastChannel.addEventListener('messageerror', callback) 事件处理器,用于定义当该对象上触发了类型为 MessageError 的 MessageEvent 事件时要执行的函数。当接收到一条无法反序列化的消息时会触发此事件。

方法

BroadcastChannel.postMessage() 向所有监听了相同频道的 BroadcastChannel 对象发送一条消息,消息内容可以是任意类型的数据。BroadcastChannel.close() 关闭频道对象,告诉它不要再接收新的消息,并允许它最终被垃圾回收。

示例代码:

// 在一个标签页中发送消息
const channel = new BroadcastChannel("myChannel");
channel.postMessage("Hello,Bro!");
// 在另一个或其他所有标签页中接受同频道消息
const channel = new BroadcastChannel("myChannel");
channel.addEventListener("message", event => {console.log("Received", event.data); // Hello,Bro!
});
// 断开频道连接
channel.close();

4.SharedWorker(注意兼容性)

创建一个执行指定 url 脚本的共享 web worker。如果要使 SharedWorker 连接到多个不同的页面,这些页面必须是同源的(相同的协议、host 以及端口)。

示例代码:

// worker.js
onconnect = function (e) {var port = e.ports[0];port.addEventListener("message", function (e) {var workerResult = "Result: " + e.data;port.postMessage(workerResult);});port.start(); // 使用addEventListener 要手动加上. 如果使用onmessage则可以省略
};
// 在不同页面中创建共享 web worker
this.shareWorker = new SharedWorker("./worker.js");
// 接受信息
this.shareWorker.port.onmessage = e => {console.log(e.data);
};
// 发送信息,可以传递任何东西
this.shareWorker.port.postMessage({type: "notifyTab",payload: {}
});

5.其他一些偏方

IndexedDB 定时器轮询,cookie 定时器轮询,Websocket 等

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

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

相关文章

python多级表头汇总

需求:将图一的数据展示为图二样式 图一: 图二: 图一具体的Excel截图 图二具体样式 python解决办法: # 导入 pandas 库,用于数据处理 import pandas as pd# 加载 Excel 文件 file_path 多级表头读取实例.xl…

科研绘图系列:R语言circos图(circos plot)

介绍 Circos图是一种数据可视化工具,它以圆形布局展示数据,通常用于显示数据之间的关系和模式。这种图表特别适合于展示分层数据或网络关系。Circos图的一些关键特点包括: 圆形布局:数据被组织在一个或多个同心圆中,每个圆可以代表不同的数据维度或层次。扇区:每个圆被划…

【BUG】已解决:SyntaxError invalid syntax

SyntaxError invalid syntax 目录 SyntaxError invalid syntax 【常见模块错误】 错误原因: 解决办法: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于…

图书馆定位导航:RFID、VR与AR技术在图书馆中的应用

图书馆作为知识的宝库,承载着无数求知者的梦想与期待,随着馆藏书籍数量的激增与图书馆布局的日益复杂,读者在寻找目标书籍往往有许多困难。传统的索引号查询方式虽能提供书籍的基本信息,但在寻找过程中,因不熟悉图书馆…

【Android】使用视图绑定ViewBinding来代替findViewById

文章目录 介绍作用用法开启ViewBinding功能自动生成绑定类在Activity中使用访问视图控件 区别 介绍 ViewBinding 是 Android 开发中的一个功能,它简化了访问视图的过程,避免了使用 findViewById 的繁琐步骤。它通过生成与布局文件相对应的绑定类&#xf…

CentOS 7 安装Jenkins2.346.1(war方式安装)

既然想要安装Jenkins,肯定是先要从官网解读所需环境配置信息,如需了解更多自行查阅 https://www.jenkins.io/doc/book/installing/linux/ JDK17,Maven3.9 安装 先从官网分别下载JDK17与Maven3.9 下载好之后上传至服务器、并解压&#xff1a…

算法学习day13(动态规划)

一、打家劫舍III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 …

ubuntu 24 PXE Server (bios+uefi) 批量部署系统

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,…

dev c++ 添加osg包含目录失败

在dev c 中添加osg的包含目录; 编译程序,出现下图错误; 打开出错文件,修改编码为UTF-8, 错误还是没有消除; 根据资料,osg是基于opengl开发的;不过我也没在osg的目录下看到opengl的头…

2024-07-19 Unity插件 Odin Inspector10 —— Misc Attributes

文章目录 1 说明2 其他特性2.1 CustomContextMenu2.2 DisableContextMenu2.3 DrawWithUnity2.4 HideDuplicateReferenceBox2.5 Indent2.6 InfoBox2.7 InlineProperty2.8 LabelText2.9 LabelWidth2.10 OnCollectionChanged2.11 OnInspectorDispose2.12 OnInspectorGUI2.13 OnIns…

Training for Stable Diffusion

1.Training for Stable Diffusion 笔记来源: 1.Denoising Diffusion Probabilistic Models 2.最大似然估计(Maximum likelihood estimation) 3.Understanding Maximum Likelihood Estimation 4.How to Solve ‘CUDA out of memory’ in PyTorch 1.1 Introduction …

如何设计分布式锁?

1. 为什么需要使用分布式锁? 在实际项目中,经常会遇到多个客户端对同一个资源或数据进行访问,为了避免并发访问带来错误,就会对该资源或数据加一把锁,只允许获得锁的客户端进行操作。 总结来说,分布式锁是…

新能源汽车空调系统的四个工作过程

汽车空调制冷系统组成 1.汽车空调制冷系统组成 以R134a为制冷剂的汽车空调制冷系统主要包括压缩机、电磁离合器、冷凝器、 散热风扇、储液于燥器、膨胀阀、蒸发器、鼓风机、制冷连接管路、高低压检测 连接接头、调节与控制装置等组成。 汽车空调的四个过程 1压缩过程 传统车…

金融数据的pandas模块应用

金融数据的pandas模块应用 数据链接:https://pan.baidu.com/s/1VMh8-4IeCUYXB9p3rL45qw 提取码:c6ys 1. 导入所需基础库 import pandas as pd import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcP…

JAVA.1.新建项目

1.代码结构 2.如何创建项目 1.创建工程 至此,我们创建了我们的第一个工程 2.创建模块 可见已经有了p28的一个模块,删掉了再添加 展开src 3.创建包 4.新建类 5.编写代码 package demo1;public class Hello {public static void main(String[] args) {Sys…

华为od机试真题:火星符号运算(Python)

题目描述 已知火星人使用的运算符号为 #和$ 其与地球人的等价公式如下 x#y2*x3*y4 x$y3*xy2x y是无符号整数。地球人公式按照c语言规则进行计算。火星人公式中,# 号的优先级高于 $ ,相同的运算符,按从左往右的顺序计算 现有一段火星人的字符串报文&a…

基于Centos7搭建rsyslog服务器

一、配置rsyslog可接收日志 1、准备新的Centos7环境 2、部署lnmp环境 # 安装扩展源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 安装扩展源 yum install nginx -y# 安装nginx yum install -y php php-devel php-fpm php-mysql php-co…

UNiapp 微信小程序渐变不生效

开始用的一直是这个,调试一直没问题,但是重新启动就没生效,经查询这个不适合小程序使用:不适合没生效 background-image:linear-gradient(to right, #33f38d8a,#6dd5ed00); 正确使用下面这个: 生效,适合…

【TensorRT】Yolov5-DeepSORT 目标跟踪

Yolov5-DeepSORT-TensorRT 本项目是 Yolo-DeepSORT 的 C 实现,使用 TensorRT 进行推理 🚀🚀🚀 开源地址:Yolov5_DeepSORT_TensorRT,求 star⭐ ~ 引言 ⚡ 推理速度可达25-30FPS,可以落地部署&…

LeetCode-day20-2850. 将石头分散到网格图的最少移动次数

LeetCode-day20-2850. 将石头分散到网格图的最少移动次数 题目描述示例示例1:示例2: 思路代码 题目描述 给你一个大小为 3 * 3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头…