跨页面通信有多少种技术方式可以实现?

简介: 跨页面通信有多少种技术方式可以实现?

在日常开发中难免会遇到需要跨页面通信的场景,例如我们非常常见的登录场景,点击登录按钮后,将会打开一个新的页面去授权登录,当我们授权登录成功后,需要将授权信息传递给之前的页面,这个时候就需要跨页面通信了。


除了上述场景,还会有很多其他的场景需要跨页面通信,今天我们就来看看有哪些方式可以实现跨页面通信。


LocalStorage


LocalStorage 是 HTML5 中新增的一个 API,它可以用来在本地存储数据,它的特点是:


  • 存储的数据没有过期时间
  • 存储的数据大小为 5M
  • 存储的数据只能是字符串


我们可以通过 window.localStorage 来访问 LocalStorage,它提供了一些方法来操作数据,例如:


  • setItem:用于存储数据
  • getItem:用于获取数据
  • removeItem:用于删除数据
  • clear:用于清空数据


这些都是我们常用的方法,今天不讲这些,而是正好localStorage的可以实现跨页面通信;


浏览器提供了一个事件 storage,当 localStorage 中的数据发生变化时,会触发这个事件,我们可以通过这个事件来监听数据的变化,从而实现跨页面通信。


window.addEventListener('storage', function (e) {
  console.log(e);
});


storage事件提供了一些属性,例如:


  • key:变化的数据的 key
  • newValue:变化后的数据
  • oldValue:变化前的数据


我们可以通过newValueoldValue来获取新旧数据,从而做一些自己的逻辑处理;


但是这种方式有一个缺点,就是只能在同一个域名下的页面之间通信,如果是不同的域名,是无法通信的(浏览器之间的各种通信都有这个问题);


同时如果修改的value没有任何变化的话,是不会触发storage事件的,这个可能没啥影响,但是如果你的业务逻辑需要这个的话,就需要注意了。


这里我之前写了一个案例和文章


SharedWorker


SharedWorker是我之前写的Web Worker专栏中的其中一个特性,这里就不展开讲解,就讲讲跨页面通信的实现方式;


SharedWorker是可以在多个页面之间共享的Worker,它的特点是:


  • 可以在多个页面之间共享
  • 可以在多个页面之间通信
  • 可以在多个页面之间共享数据


使用的时候只需要在页面中引入SharedWorker的脚本即可,然后通过new SharedWorker来创建一个SharedWorker实例,这个实例提供了一些方法,例如:


// 创建一个 SharedWorker 实例
const worker = new SharedWorker('worker.js');
// 向 SharedWorker 发送消息
worker.port.postMessage('hello');
// 监听 SharedWorker 的消息
worker.port.onmessage = function (e) {
  console.log(e.data);
};


这里的worker.js就是我们的SharedWorker脚本,它提供了一些方法,例如:


// 监听 SharedWorker 的消息
onconnect = function (e) {
  const port = e.ports[0];
  port.onmessage = function (e) {
    console.log(e.data);
    // 向 port 发送消息
    port.postMessage('world');
  };
};


这里因为之前写过,就不凑字数了,


BroadcastChannel


今天要讲的其实是BroadcastChannel,它是一个频道,可以向频道中发送消息,也可以监听频道中的消息;


当我们向频道中发送消息时,频道中的所有监听者都会收到消息,这样就可以实现跨页面通信了;


使用的时候不需要任何的配置或者脚本,只需要通过new BroadcastChannel来创建一个

BroadcastChannel实例,然后通过postMessage来向频道中发送消息,通过onmessage来监听频道中的消息;


// 创建一个 BroadcastChannel 实例
const channel = new BroadcastChannel('channel');
// 向频道中发送消息
channel.postMessage('hello');
// 监听频道中的消息
channel.onmessage = function (e) {
  console.log(e.data);
};


这个其实和Worker的通信方式很像,只不过Worker是在同一个页面中,而BroadcastChannel是在不同的页面中;


首先我们通过new BroadcastChannel来创建一个BroadcastChannel实例,给它传递的参数就是频道的名称,这个名称是可以自定义的,只要保证不同的页面中使用的名称是一样的即可;


然后我们通过postMessage来向频道中发送消息,通过onmessage来监听频道中的消息;


可以看我下面的一个简单的示例:


BroadcastChannelAPI非常简单,发送消息就是postMessage,监听消息就是onmessage,然后还有一个close方法,用于关闭频道;


这里有一个坑,就是BroadcastChannel是需要在页面关闭的时候手动关闭的,否则会导致内存泄漏,所以我们需要在页面关闭的时候手动关闭它;


window.addEventListener('beforeunload', function () {
  channel.close();
});


因为BroadcastChannel是一个广播频道,所以浏览器不知道你什么时候不需要它了,所以需要我们手动关闭它;


总结


今天我们讲了一下跨页面通信的三种方式,分别是localStorageSharedWorkerBroadcastChannel


localStorage是通过监听storage事件来实现的,使用起来非常简单,缺点是只能传递字符串;


SharedWorker是可以在多个页面之间共享的Worker,它的特点是可以在多个页面之间共享和通信,使用起来稍微复杂一点,但是功能也比较强大;


BroadcastChannel是一个频道,可以向频道中发送消息,也可以监听频道中的消息,使用起来简直不用太方便,但是需要注意的是需要手动关闭它;


在日常开发中如果对于兼容性要求非常高的话,可以使用localStoragelocalStorage兼容性直接无障碍;


如果对于兼容性要求不高的话,可以使用BroadcastChannel,它的兼容性还是很不错的,在chrome 54之后就支持了,而且使用起来也非常简单;


如果对于兼容性要求不高的话,还可以使用SharedWorker,它的兼容性还算可以,但是使用起来稍微复杂一点,而且功能也比较强大;



目录
相关文章
|
8月前
|
域名解析 人工智能 API
学生看过来!白嫖阿里云服务器自建DeepSeek个人网站,3分钟站点上线,超简单!
学生看过来!利用阿里云服务器自建DeepSeek个人网站,3分钟快速上线,超简单!学生用户可领取300元代金券,实现0成本部署;普通用户则可选择99元/年的服务器。通过阿里云计算巢“DeepSeek个人站点-快速部署”服务,无需代码,最快5分钟即可体验多个AI模型。教程详情涵盖从打开部署页面、选择套餐、设置实例密码到获取API-KEY的完整步骤,助你轻松搭建专属AI网站。
430 1
|
12月前
|
数据采集 JavaScript 搜索推荐
ssr(Nuxt+Next.js)
服务器端渲染(SSR)技术可在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js基于Vue.js,提供自动化路由管理、页面级数据获取和模块化扩展;Next.js基于React.js,支持SSR、静态生成和文件系统路由。两者均具备快速加载、SEO友好和处理复杂页面的优点,但也存在服务器压力大、开发限制和调试困难的缺点。开发者可根据项目需求和技术栈选择合适的框架。
180 2
|
9月前
|
缓存 小程序 API
微信小程序页面导航与路由:实现多页面跳转与数据传递
本文深入探讨微信小程序的页面导航与路由机制,介绍多种页面跳转方式如`wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`等,并讲解通过URL、全局变量和事件传递数据的方法。结合案例实现多页面跳转与数据传递,帮助开发者掌握这一重要技能。
|
分布式计算 关系型数据库 MySQL
Sqoop【部署 01】CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
【2月更文挑战第8天】Sqoop CentOS Linux release 7.5 安装配置 sqoop-1.4.7 解决警告并验证(附Sqoop1+Sqoop2最新版安装包+MySQL驱动包资源)
657 1
|
机器学习/深度学习 数据采集 人工智能
揭开大模型幻觉之谜:深入剖析数据偏差与模型局限性如何联手制造假象,并提供代码实例助你洞悉真相
【10月更文挑战第2天】近年来,大规模预训练模型(大模型)在自然语言处理和计算机视觉等领域取得卓越成绩,但也存在“大模型幻觉”现象,即高准确率并不反映真实理解能力。这主要由数据偏差和模型局限性导致。通过平衡数据集和引入正则化技术可部分缓解该问题,但仍需学界和业界共同努力。
353 4
|
存储 缓存 IDE
CAN通信的基本原理与实现方法
CAN通信的基本原理与实现方法
2412 1
|
Java 数据库连接 mybatis
使用Mybatis获取sqlSession对象老爆红的问题解决
使用Mybatis获取sqlSession对象老爆红的问题解决
|
存储 弹性计算 Docker
深入探讨Docker的主要功能及其影响力
【8月更文挑战第24天】
348 0
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
656 1
|
数据采集 存储 自然语言处理
Python爬虫与数据可视化:构建完整的数据采集与分析流程
Python爬虫与数据可视化:构建完整的数据采集与分析流程