sessionStorage是頁面級別的,僅在一個標籤頁生效,若是同一個瀏覽器同時打開多個標籤頁,且都訪問同一個域名,sessionStorage是不會在這多個標籤頁共用的,即每一個標籤頁都有本身的sessionStorage。
若是想突破這種侷限,實現多tab頁共享存取數據同時又有sessionStorage暫存性的功能(關閉頁面時存在裏面的數據也消失的功能),則須要本身經過一些技巧實現手動維護多tab頁面內存儲某個對象的數據,就是目前我想要講的方法。
方法:經過給localStorage存儲數據,能夠在全瀏覽器內捕獲一個storag的事件,而後再拿到該事件傳過來的數據進行本地修改維護,多個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;
引用此模塊並執行拿到的函數瀏覽器
import memory from 'memory_storage' window.memoryStorage = memory(); window.memoryStorage.setItem('Auth', 'as00f0e058585856d'); //存入Auth var Auth = window.memoryStorage.getItem('Auth'); //獲取Auth window.memoryStorage.removeItem('Auth'); //刪除Auth window.memoryStorage.clear(); //清空storage
此時memoryStorage基本實現了sessionStorage的基礎功能,setItem, getItem,removeItem,clear。session