sessionStorage 能在多个标签页之间共享数据吗?

cnblogs 2024-06-28 08:11:00 阅读 80

🧑‍💻 写在开头

点赞 + 收藏 === 学会🤣🤣🤣

最近,我的一个朋友在面试中被一个关于sessionStorage的问题难住了。我们来聊聊这个话题。

sessionStorage 能在多个标签页之间共享数据吗?在回答这个问题之前我们先来聊聊另一个存储API localstorage

localstoragesessionStorage经常是放在一起讨论,那他们之间的区别是什么呢?

只读的localStorage属性允许你访问一个Document源(origin)的对象Storage;存储的数据将保存在浏览器会话中。localStorage类似sessionStorage,但其区别在于:存储在localStorage的数据可以长期保留;而当页面会话结束——也就是说,当页面被关闭时,存储在sessionStorage的数据会被清除。(这是来自MDN的解释)

那么 localstorage可以在同一网站下共享数据吗?答案显而易见是可以的。

// 你可以在第一个tab里面存储一个数据

localStorage.setItem('name', 'fatfish')

// 在另外一个tab读取这个数据

localStorage.getItem('name') // fatfish

那么sessionStorage呢? 来看看MDN中的解释

  • 页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。
  • 在新标签或窗口打开一个页面时会复制顶级浏览会话的上下文作为新会话的上下文,这点和 session cookie 的运行方式不同。
  • 打开多个相同的 URL 的 Tabs 页面,会创建各自的sessionStorage
  • 关闭对应浏览器标签或窗口,会清除对应的sessionStorage

根据第二点,在新打开的页面上应该是可以共享数据的,基于此我本人尝试了一下在掘金主页(juejin.cn/) 下执行以下代码

window.sessionStorage.setItem('canShare','yes')

然后随机打开首页的推荐文章(juejin.cn/post/734279…) 读取数据

window.sessionStorage.getItem('canShare') // null

所以结论是不行,MDN上的解释错了? 我们再做以下测试在掘金主页(juejin.cn/) 下执行以下代码

window.sessionStorage.setItem('canShare','yes');

window.open('https://juejin.cn/post/7342793254096109583', 'aa');

然后随机打开首页的推荐文章(juejin.cn/post/734279…) 读取数据

window.sessionStorage.getItem('canShare') // yes

回过头来我再对掘金首页做以下操作

window.sessionStorage.setItem('canShare','yes');

然后我把推荐文章链接中的target="__blank"属性删除,然后再次点击打开 然后执行

window.sessionStorage.getItem('canShare') // yes

成功的打印出了数据

结论:

因此,我们可以得出结论:

sessionStorage不能在多个窗口或标签页之间共享数据,但是当通过window.open或链接打开新页面时(不能是新窗口),新页面会复制前一页的sessionStorage。

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。