Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

跨tab页sessionStorage共享 #175

Open
TieMuZhen opened this issue Apr 18, 2022 · 0 comments
Open

跨tab页sessionStorage共享 #175

TieMuZhen opened this issue Apr 18, 2022 · 0 comments

Comments

@TieMuZhen
Copy link
Owner

问题

在当前页面下开启一个新的同源tabsessionStorage中的内容未有效共享到新开tab页中,导致新开tabsessionStorage

解决办法

1、使用window.open()方法打开这个同源tab页即可实现sessionStorage的有效共享。
2、通过window.addEventListener('storage', () => {})事件监听,来进行同源跨tab页的数据共享。

关于Chrome中的sessionStorage

实际测试如下
1、通过新建标签页复制打开对应URL页面,情况属于第三条,创建独立sessionStorage
2、通过window.open()打开新标签页,共享了原tab页中的sessionStorage
3、通过a标签的_blank方式打开新tab页,Chrome浏览器共享了sessionStorage而Firefox浏览器并没有共享。

不同的浏览器具有不一样的实现及表现形式。这是一个随时可能爆发的兼容性问题。

代码实现同源跨tab页的数据共享

// 通过自执行函数来确保在新开tab中直接执行
// 方法一:同步已有标签页的sessionStorage数据到新开tab页
(function() {
  // 新打开一个tab标签页并通知其他标签页同步sessionStorage的数据到本标签页
 if (!sessionStorage.length) {
  // 这个调用能触发storage事件,从而达到共享数据的目的
  localStorage.setItem('syncSessionStorage', Date.now());
 };

 // 该事件是核心
 window.addEventListener('storage', function(event) {
  if (event.key == 'syncSessionStorage') {
   // 已存在的标签页会收到这个事件
   localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
   localStorage.removeItem('sessionStorage');

  } else if (event.key == 'sessionStorage' && !sessionStorage.length) {
   // 新开启的标签页会收到这个事件
   var data = JSON.parse(event.newValue);
   for (key in data) {
    sessionStorage.setItem(key, data[key]);
   }
  }
 });
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant