SessionStorage 如何在多个 tab 间共享数据?

开发 前端
sessionStorage 确实无法在多个窗口或标签之间共享数据。但是当通过 window.open 或链接打开新页面时,新页面将复制前一页面的 sessionStorage,以此来完成数据共享!​

Hello,大家好,我是 Sunday。

过了腊八就是年,Sunday 提前祝大家新年快乐,2025 暴富暴富暴富!

我们知道 SessionStorage 是不可以在多个 tab 之间共享数据的。但是一个同学在面试的时候,却被面试官问到:“SessionStorage 如何在多个 tab 间共享数据?” 注意: 他并没有问能不能,而是问的 如何? 那么是他问错了吗?恐怕不是的~~

面试流程回顾

我听了这位同学的面试录音整个流程是由三个问题组成的:

问题一:localStorage和sessionStorage有什么区别?

  • localStorage的数据是持久化的,只要我们不主动清除它,它就会一直存在。
  • 而 sessionStorage 会随着选项卡/窗口的关闭,结束会话并清除存储的数据。

问题二:同域下localStorage可以共享数据吗?

当然可以。我们可以直接通过简单的代码来验证这个问题:

// 在一个网页中保存数据
localStorage.setItem('name', '张三')
// 从另一个同域的网站中可以直接获取
localStorage.getItem('name') // 张三

问题三:那么 sessionStorage 可以在多个 tab 间共享数据吗?

重头戏来了!

这位同学回答的是:“不可以!” 每个窗口或选项卡都有一个单独的 sessionStorage,它们之间没有数据共享!

但是你确定吗?

如何实现 sessionStorage 数据共享

我们先看下 mdn 中对 sessionStorage 的介绍:

图片图片

根据 mdn 的描述我们可以清楚的看到,打开多个相同的 URL 的 Tabs 页面,会创建各自的 sessionStorage 也就是说 不可共享。

所以,我们来做一个实验:

  1. 我们创建两个 html 文件,分别为 test.html  和  test02.html
// test.html
<body>
  <button id="btn">点我</button>

  <script>
    const btn = document.querySelector('#btn')
    btn.addEventListener('click', () => {
      window.sessionStorage.setItem('name', '张三')
      window.open('http://127.0.0.1:5500/test02.html')
    })
  </script>
</body>
// test02.html
<body>
  <div id="name"></div>

  <script>
    const nameEle = document.querySelector('#name')
    nameEle.innerHTML = window.sessionStorage.getItem('name')
  </script>
</body>

两块代码并不复杂,在 test 中我们保存了 name 到 sessionStorage 同时打开了 test02.html ,并且 保证他们是同域的,然后再 test02 中,输出了保存的 name(注意: 以上代码需要运行在服务上)。

执行以上代码之后,可以发现在 test02 中 成功 的打印出了保存的数据 张三!

分析原因

那么以上实验证明 sessionStorage 似乎可以共享数据。难道 mdn 上说的是错误的吗?当然不是。

以下是结论:

sessionStorage 确实无法在多个窗口或标签之间共享数据。但是当通过 window.open 或链接打开新页面时,新页面将复制前一页面的 sessionStorage,以此来完成数据共享!


责任编辑:武晓燕 来源: 程序员Sunday
相关推荐

2023-07-11 16:01:47

共享数据开发

2024-12-26 10:28:44

2011-06-30 17:21:56

Qt 线程 共享

2019-07-08 08:59:41

Docker容器主机

2020-02-24 13:06:55

Python数据帧开发

2011-03-24 17:28:58

网络数据库

2022-03-07 05:40:34

桌面LinuxKDE Plasma

2018-06-26 08:55:35

LinuxWindows共享文件

2018-05-04 08:57:00

LinuxWindows共享文件

2019-07-10 09:30:49

Windows 10WindowsAlt + Tab

2015-10-15 10:24:01

数据Laravel 5

2022-05-03 10:08:53

WindowsLinux文件共享

2018-08-27 10:24:03

UbuntuPHP版本

2018-05-04 09:32:32

Linux快速监控rwho

2017-02-16 08:13:17

2020-08-10 08:28:19

ZeroMQCPython

2024-01-30 15:29:20

Django数据库Python

2017-04-19 22:00:40

UbuntuLinux Mint桌面共享

2018-01-12 14:35:00

Linux进程共享内存

2017-02-10 20:00:17

Linux共享目录命令
点赞
收藏

51CTO技术栈公众号