sessionStorage的局限:
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。