多页面共用sessionStorage的实现(转载)
sessionStorage的局限:
sessionStorage是页面级别的,仅在一个标签页生效,如果同一个浏览器同时打开多个标签页,且都访问同一个域名,sessionStorage是不会在这多个标签页共用的,即每个标签页都有自己的sessionStorage。 如果想突破这种局限,实现多tab页共享存取数据同时又有sessionStorage暂存性的功能(关闭页面时存在里面的数据也消失的功能),则需要自己通过一些技巧实现手动维护多tab页面内存储某个对象的数据,就是目前我想要讲的方法。
方法:通过给localStorage存储数据,可以在全浏览器内捕获一个storage的事件,然后再拿到该事件传过来的数据进行本地修改维护,多个tab页就以此通信,同步数据。
ES6实现:
const MemoryStorage = class { constructor(){ this.data = {}; } setItem(k, v){ this.data[k] = v; MemoryStorage.dataSendHandler( this.data ); } getItem(k){ return this.data[k]; } removeItem(k){ delete this.data[k]; MemoryStorage.dataSendHandler( this.data ); } clear(){ this.data = {}; MemoryStorage.dataSendHandler( this.data ); } static dataSendHandler( data ){ localStorage.setItem('setMemoryStorage', JSON.stringify(data)); localStorage.removeItem('setMemoryStorage'); } static dataGetHandler(){ localStorage.setItem('getMemoryStorage', new Date().getTime()); localStorage.removeItem('getMemoryStorage'); } } const initMemoryStorage = function(){ var memoryStorage = new MemoryStorage(); window.addEventListener('storage',function(e){ if( e.newValue===null ) return false; if(e.key == 'getMemoryStorage'){ console.log('有其他页面取memory') MemoryStorage.dataSendHandler( memoryStorage.data ); } else if(e.key == 'setMemoryStorage'){ let data = JSON.parse(e.newValue); if( isEmptyObj(data) ){ console.log('memory被清空了') memoryStorage.data = {}; }else{ console.log('memory被修改了') for(let k in data){ memoryStorage.data[k] = data[k]; } } } }) if( isEmptyObj(memoryStorage.data) ){ MemoryStorage.dataGetHandler(); } } function isEmptyObj(obj){ for(let i in obj){ return false; } return true; } export default initMemoryStorage;
以上内容原文地址(//blog.csdn.net/weixin_33716154/article/details/88797059)