前端跨页面通信方案介绍

在浏览器中,我们可以同时打开多个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都可以,二选一,我个人倾向addEventlister
    console.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, '*');
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始为香橙派orangepi zero 3移植主线linux——2.linux kernel

从零开始为香橙派orangepi zero 3移植主线linux——2.linux kernel 0.环境搭建补档NFS服务TFTP服务 一、linux kernel编译二、运行 0.环境搭建补档 linux kernel验证时,使用tftp服务从ubuntu主机下载启动更加方便,等到验证无误后再一次性烧写到tf卡。所以…

使用 Docker 部署 Photopea 在线 PS 工具

1)Photopea 介绍 GitHub:https://github.com/photopea/photopea 官方手册:https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦,但是「PhotoShop」现在对电脑配置要求越来越高,体积越来越大…

中兴R5300 G4服务器BMC远程管理启用防火墙设置

中兴R5300 G4服务器启用了BMC远程管理,为保障设备安全配置启用防火墙只放通特定维护服务器可以访问。 一、设备初始登录信息 1、中兴R5300G4服务器,默认BMC管理地址https//192.168.5.7 2、中兴zteroot用户的默认密码为:Superuser9! 二、…

python文件处理:解析docx/word文件文字、图片、复选框

前言 因为一些项目原因,我需要提供解析docx内容功能。本来以为这是一件比较简单的工作,没想到在解析复选框选项上吃了亏,并且较长一段时间内通过各种渠道都没有真正解决这一问题,反而绕了远路。 终于,我在github pytho…

中颖51芯片学习1. 系统时钟及IO口输出操作

中颖51芯片学习1. 系统时钟及IO口输出操作 一、芯片介绍1. 规格2. 资源3. 中断源:4. 方框图5. 封装(1)32脚LQFP封装(2)28脚SOP封装(3)20脚SOP封装 二、开发环境搭建1. 安装keil2. 安装中颖keil插…

【管理咨询宝藏47】AA银行风险管理体系提升分析报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏47】AA银行风险管理体系提升分析报告 【格式】PPT版本,可编辑 【关键词】战略规划、商业分析、管理咨询 【强烈推荐】这是一套市面上…

Java入门基础day27

day27 接口 package com.saas; ​ public interface MyInterface { ​int NUM 100; ​public void test(); } package com.saas; ​ public class MyClass01 extends Object implements MyInterface{ ​int NUM 200; ​Overridepublic void test() {System.out.println(NUM)…

一文解析智慧城市,人工智能技术将成“智”理主要手段

长期以来,有关智慧城市的讨论主要围绕在技术进步方面,如自动化、人工智能、数据的公开以及将更多的传感器嵌入城市以使其更加智能化。实际上,智慧城市是一个关于未来的设想,其重要原因在于城市中存在各种基础设施、政治、地理、财…

鸿蒙开发-ArkTS语言-并发

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 文章目录 前言 一、并发概述 二、异步并发开发 1. 异步并发概述 1.1 Promise 1.2 async/await 2. 单次…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言,本文将详细介绍一段HTML和CSS代码,具体内容如下: 开始 首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],CSS的文件名…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

JavaScript 对象管家 Proxy

JavaScript 在 ES6 中,引入了一个新的对象类型 Proxy,它可以用来代理另一个对象,并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人,其提供了一个捕捉器函数,可以在代理对象上拦截…

什么是ECC?ECC 和 RSA 之间有何区别?

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。 它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。 继续阅读,进一步了解椭圆曲线密码学…

一文读懂!企业怎样才能选择适合自己的生产管理系统?

怎么选择适合所在企业的生产管理系统呢?该从哪些方面对生产管理系统进行评估?又怎样实现高效的生产管理呢? 本文我将和大家一起解决这些有关生产管理系统的问题? 生产管理系统模板,可直接查看和使用:https…

设备巡检系统革新:凡尔码平台的智能化配电箱管理

配电箱作为电气安全的关键环节,其巡检工作至关重要。传统的巡检方法依赖手工记录,不仅效率低下,而且难以确保数据的实时性和准确性。凡尔码平台的二维码设备巡检系统,以数字化解决方案,颠覆了这一过程,实现…

HWOD:自守数

一、知识点 break只会结束最里面的一层循环 int型数按位比较的时候,可以直接求余比较,无需转换为char型数组后再按下标比较 二、题目 1、描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 625,76^2 5776…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现,主要从以下三个方面: 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性,图片地址,类型 string,无默认…

数据结构——栈(C语言版)

前言: 在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。 准备工作:本人习惯将文件放在test.c…

线下陪玩小程序APP源码开发--线下游戏陪玩小程序App开发(源码平台)-APP小程序H5-前后端源码交付。

线下陪玩达人入驻服务系统软件开发(APP、公众号、小程序、H5搭建) 线下陪玩接单系统平台开发案例分析 1.丰富的娱乐项目:该平台提供了丰富的娱乐项目,包括但不限于桌游、运动、户外活动等,能够满足不同用户的需求。 2…

“不知今夕是何年”的周基年解法 | 得物技术

2024年1月5日,周五,本来是个美好的日子,期待着马上到来的周末。可是下午1点多,接到产品一个问题反馈,经过一番排查,23年7月份上线的功能,对于跨年场景的处理有问题,其核心在于“周的…