前端跨页面通信方案介绍

在浏览器中,我们可以同时打开多个Tab页,每个Tab页可以粗略理解为一个“独立”的运行环境,即使是全局对象也不会在多个Tab间共享。然而有些时候,我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。这就是本文说说的跨页面通信方案,那么目前有哪些跨页面的通信方案呢?本文重点介绍一下。

同源页面之间跨页面通信一般有如下几种方案。

一、BroadCast Channel

目前查了一下兼容性,除了ie之外,所有浏览器基本都支持这个api了,所以可以大胆用起来,假如确实要支持ie,也可以用polyfill。

具体语法和websocket有点像如下:

  const bc = new BroadcastChannel('haorooms');//可以接受一个DOMString作为 name,用以标识这个 channel。在其他页面,可以通过传入相同的 name 来使用同一个广播频道。只用同样标识的页面才能收到广播,不同的收不到。console.log(bc.name) // 输出构造实例的标识,haorooms。bc.onmessage = function(e) {// 通过onmessage监听事件console.log('receive:', e.data);};bc.addEventListener('message',(e)=>{// 通过addEventLister监听事件,和上面的onmessage都可以,二选一,我个人倾向addEventlisterconsole.log('receivebyaddEventlistener:', e.data);})bc.onmessageerror = function(e) {console.warn('error:', e);}bc.postMessage('hello haorooms test broadcastchannel')

关闭

bc.close();

备注:这种方式好处是发送广播之后,自己 不会再收到,其他使用了相同实例的页面可以时时收到。用起来也很方便,非常简单和易用。

二、Service Worker

PWA的Service Worker也可以实现 不同页面之间的通信。

步骤如下:

首先,需要在页面注册 Service Worker:

/* 页面逻辑 */
navigator.serviceWorker.register('../haorooms.sw.js').then(function () {console.log('Service Worker 注册成功');
});

其中../haorooms.sw.js是对应的 Service Worker 脚本。Service Worker 本身并不自动具备“广播通信”的功能,需要我们添加些代码,将其改造成消息中转站:

/* ../haorooms.sw.js Service Worker 逻辑 */
self.addEventListener('message', function (e) {console.log('service worker receive message', e.data);e.waitUntil(self.clients.matchAll().then(function (clients) {if (!clients || clients.length === 0) {return;}clients.forEach(function (client) {client.postMessage(e.data);});}));
});

处理完 Service Worker,我们需要在页面监听 Service Worker 发送来的消息。

/* 页面逻辑 */
navigator.serviceWorker.addEventListener('message', function (e) {const data = e.data;const text = '[receive] ' + data.msg + ' —— haorooms_tab' + data.from;console.log('[Service Worker] receive message:', text);
});

最后,当需要同步消息时,可以调用 Service Worker 的postMessage方法:

/* 页面逻辑 */
navigator.serviceWorker.controller.postMessage(mydata);

三、LocalStorage

作为前端,LocalStorage是再熟悉不过了,但是用这个作为页面通信,还是头一次。这里通信其实只是简单的通信,主要通过LocalStorage的事件来完成的。

当 LocalStorage 变化时,会触发storage事件。利用这个特性,我们可以在发送消息时,把消息写入到某个 LocalStorage 中;然后在各个页面内,通过监听storage事件即可收到通知。

window.addEventListener('storage', function (e) {if (e.key === 'haorooms_localstoragekey') {const data = JSON.parse(e.newValue);const text = '[receive] ' + data.msg + ' —— haorooms_tab1 ' + data.from;console.log('[Storage I] receive message:', text);}
});

四、其他

之所以写其他,是因为方案只是可以完成页面通信,但是不是实际意义上面的通信,例如Shared Worker、IndexedDB、cookie,可以通过共享存储的方式来完成通信。window.open + window.opener这种方式可以通过扣扣相传的方式完成通信,还有websocket方式可以通过服务中转方案完成通信。 这里不详细展开介绍,感兴趣的可以搜索。

非同源页面之间的通信

非同源通信相对较麻烦一些,我们可以使用一个用户不可见的 iframe 作为“桥”。由于 iframe 与父页面间可以通过指定origin来忽略同源限制,因此可以在每个页面中嵌入一个 iframe (例如:haorooms.com/bridge.html),而这些 iframe 由于使用的是一个 url,因此属于同源页面,其通信方式可以复用上面第一部分提到的各种方式。

/* iframe 内代码 */
const bc = new BroadcastChannel('haorooms_bc');
// 收到来自页面的消息后,在 iframe 间进行广播
window.addEventListener('message', function (e) {bc.postMessage(e.data);
}); 其他 iframe 收到通知后,则会将该消息同步给所属的页面:
/* iframe 内代码 */
// 对于收到的(iframe)广播消息,通知给所属的业务页面
bc.onmessage = function (e) {window.parent.postMessage(e.data, '*');
};

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

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

相关文章

数据结构(六)——图的存储及基本操作

6.2 图的存储及基本操作 6.2.1 邻接矩阵法 邻接矩阵存储无向图、有向图 #define MaxVertexNum 100 //顶点数目的最大值typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表int vexnum,arcnum; //图的当前…

【QingHub】QingHub Studio企业级应用作业编排

简介 QingHub作业编排中心是一个通过插件化方式,提供数据从采集,转化,计算,存储为一体的全流程数据处理方案,他一方面为前端应用提供数据源,同时也为前端应用与数据源头的通信搭建起桥梁,实现数…

kubadm部署 kubernetes-1.29版本

一、集群节点准备 ip主机名称操作系统192.168.1.160master-1Centos-7.9192.168.1.161node-1Centos-7.9 二、安装前主机环境准备 (所有主机都需要进行) 1、配置主机名解析 echo "192.168.1.160 master-1" >> /etc/hosts echo "1…

LeetCode 1379.找出克隆二叉树中的相同节点:二叉树遍历

【LetMeFly】1379.找出克隆二叉树中的相同节点:二叉树遍历 力扣题目链接:https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 给你两棵二叉树,原始树 original 和克隆树 cloned&#xff0…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可,左侧放置图片label,右侧放置文字label,就如上图所示; 但是这时的hover,press的伪状态是没有办法“传递”给里面的控件的,对btn的伪状态样式表的设置,是不…

【LeetCode热题100】79. 单词搜索(回溯)

一.题目要求 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平…

【数据结构与算法】二叉搜索树和平衡二叉树

二叉搜索树 左子树的结点都比当前结点小,右子树的结点都比当前结点大。 构造二叉搜索树: let arr [3, 4, 7, 5, 2]function Node(value) {this.value valuethis.left nullthis.right null }/*** 添加结点* param root 当前结点* param num 新的结…

Xen Server 8 Install

Xen Sevrer 前言 XenServer(以前称为 Citrix Hypervisor)是业界领先的平台,实现了经济高效的桌面、服务器和云虚拟化基础结构。XenServer 支持任意规模或类型的组织整合计算资源,以及将计算资源转换为虚拟工作负载,从…

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域,拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中,鉴于地球的广阔地域和多样的气候条件,利用图像技术捕…

SQLite中的隔离(八)

返回:SQLite—系列文章目录 上一篇:SQLite版本3中的文件锁定和并发(七) 下一篇:SQLite 查询优化器概述(九) 数据库的“isolation”属性确定何时对 一个操作的数据库对其他并发操作可见。 数据库连接之…

Hadoop安装部署-SecondaryNameNode备份版

Hadoop分布式文件系统支持NameNode节点的高可用性,本文主要描述Secondary NameNode数据备份版本的安装部署。 如上所示,NameNode主节点同步数据到NameNode备份节点,当NameNode主节点发生故障变得不可用时, NameNode主节点重新启动…

关联对象介绍

关联对象的作用 在分类里面,不可以直接为分类添加属性 在代理中,不可以直接为代理添加属性 在普通类中,property (assign, nonatomic) int age; 会做三件事: 生成age的成员变量生成age的get、set方法的声明生成age的get、set方…

【论文通读】UFO:A UI-Focused Agent for Windows OS Interaction

UFO:A UI-Focused Agent for Windows OS Interaction 前言AbstractMotivationMethodsExperimentConclusion 前言 Windows客户端第一个JARVIS,利用GPT4 Vision识别截图信息辅助智能体自动化执行操作,作为微软大肆宣传的一篇工作,其…

如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述 Redis(Remote Dictionary Server)是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value…

【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者:锡兰_CC ❣️📝 专 栏:【OpenCV • c】计算机视觉🌈 若有帮助,还请关注➕点赞➕收藏&#xff…

部署项目遇到的各种问题总结

文章目录 前言一、后端问题 jar包运行出现错误宝塔面板使用jdk17二、数据库问题 版本问题三、前端问题 连不上后端总结 前言 在做完项目之后,为了让别人访问到自己的网站,就需要部署前端后端以及数据库,但是在部署的过程中出现了各种问题和困…

docker 部署 nali 开源 IP 地理信息归属查询软件

前言 早前用到一个小巧开源的 IP 归属地查询软件,官方提供了 Dockerfile,使用了一段时间觉得还不错,非常简单便捷。 部署 docker 启动 由于该项目会在首次启动自动下载 IP 数据库,所以最好通过挂载目录的方式,将数据库目录挂在到本地,避免…

【C语言】2048小游戏【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述: 2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。 每次移动操作,所…

C++进阶--C++11(1)

C11是C编程语言的一个版本,于2011年发布。C11引入了许多新特性,为C语言提供了更强大和更现代化的编程能力。这篇文章将对C11的一些新增特性进行讲解和实际应用场景。 统一的列表初始化 {}初始化 在C98中,使用{}符号的一般只仅限于对数组和…

基于蚁群算法的三维路径规划(matlab实现)

作品简介 1 理论基础 1.1 三维路径规划问题概述 三维路径规划指在已知三维地图中,规划出一条从出发点到目标点满足某项指标最优,并且避开了所有三维障碍物的三维最优路径。现有的路径规划算法中,大部分算法是在二维规划平面或准二维规划平面…