Open
Description
问题
在当前页面下开启一个新的同源tab
页sessionStorage
中的内容未有效共享到新开tab
页中,导致新开tab
页sessionStorage
为空。
解决办法
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]);
}
}
});
})();