Web存儲(Web Storage)擴大EStorage

HTML5中新增了Web Storage的範例,目標是處理客戶端存儲數據,而無需將數據延續的發還服務器。它供應了兩個對象sessionStorage和localStorage,這兩個對象都是以windows對象屬性的情勢存在的,區分在於localStorage存儲的數據不會逾期,sessionStorage存儲的數據每次封閉瀏覽器后都邑被清空。

為何出這個擴大類

Web Storage的湧現處理了cookie不適合瀏覽器存儲大批數據和每次要求時,cookie都邑存放在要求頭中,傳輸到服務器端的題目。

Storage的兩個實例供應了以下五個要領:

  • clear():刪除一切值;Firefox中沒有完成。
  • getItem(name):依據指定的name獵取對應的值。
  • key(index):取得index位置處的值的名字。
  • removeItem(name):刪除由name指定的名值對。
  • setItem(name,value):為指定的name設置一個對應的值。

雖然Storage的幾個要領挪用很簡單,然則只能存儲字符串花樣的數據,這給現實編碼過程當中帶來了很大的攪擾,比方:當我存入一個Object數據時,每次存入之前都要數據轉化成字符串,掏出運用的時刻也要將字符串再轉化為對象,而且工資的要記着存入值的花樣。
所以,為了削減反覆勞動,今後少些反覆代碼,趁便提拔下效力,所以做了一個封裝。

兩個操縱對象EStorage.session和EStorage.local,離別對應sessionStorage和localStorage
供應了8個要領

  • set(key,value):為指定的key設置一個對應的值。
  • remove(key):刪除由key指定的名值對。
  • clear():刪除一切值;Firefox中沒有完成。
  • update 更新(key,value)。
  • get(key):依據指定的key獵取對應的值。
  • keyType(key): 對應key值的數據範例
  • isexist(key): 是不是存在
  • getAll(): 獵取一切的值,返回object

支撐七種數據花樣:String,Number,Boolean,Function,Date,Object,Array
特性:
1、存入什麼數據範例,掏出什麼數據範例
2、經由過程原生要領存入的數據,只能掏出字符串
3、與原生要領共存
4、易擴大

運用入門:

<script src="EStorage.js"></script>
<script>
    var objData = {
        name:王二,
        age:25
    }
    EStorage.session.set('objData',objData);//存值
    var data = EStorage.session.get('objData'); //取值
</script>

現實項目中用了,結果還能夠,生了不少代碼,手動笑容 -_-

末了貼上悉數代碼

/*
    EStorage.js
    2017-12-25
    VERSION = "1.0.0"
    DATATYPE = String,Number,Boolean,Function,Date,Object,Array 支撐的數據範例
*/
var EStorage = (function () {
    "use strict";

    var VERSION = "1.0.0";
    //支撐的數據範例
    var DATATYPE = 'String,Number,Boolean,Function,Date,Object,Array';

    //存儲範例id
    var KEYWORDID = 'KEYWORDID';
    //檢測存入數據範例
    function getType(data){
        var type = Object.prototype.toString.call(data)
        switch(type)
        {
        case '[object String]':
          return 'String'
          break;
        case '[object Number]':
          return 'Number'
          break;
        case "[object Boolean]":
          return 'Boolean'
          break;
        case "[object Function]":
          return 'Function'
          break;
        case "[object Object]":
          return 'Object'
          break;
        case "[object Array]":
          return 'Array'
          break;
        case "[object Date]":
          return 'Date'
          break;
        }
    }

    //獵取值並依據範例轉換
    function getValue(type,item){
        switch(type)
        {
        case 'String':
          return item
          break;
        case 'Number':
          return Number(item)
          break;
        case "Boolean":
          var value;
          return value = (item ==='true') ?  true : false;
          break;
        case "Function":
          var fun=(new Function("return "+item))();
          return fun;
          break;
        case "Object":
          return JSON.parse(item);
          break;
        case "Array":
          return JSON.parse(item);
          break;
        case "Date":
          return new Date(item);
          break;
        default:
          return item;
        }
    }

    //存儲類
    function EStorage(){
        this.VERSION = VERSION;
        this.DATATYPE = DATATYPE;
    }


    //會話級存儲類
    EStorage.prototype.session = {
        data:window.sessionStorage,
        //新增或更新會話級數據
        set:function(key,data){
            var type = getType(data);
            var saveData = '';

            if(type === 'String' || type === 'Number' || type === 'Boolean' || type === 'Function' || type === 'Date'){
                saveData = ''.concat(data);
            }else if(type === 'Object' || type === 'Array'){
                saveData = ''.concat(JSON.stringify(data));
            }

            this.data.setItem(key,saveData);

            if(key !==KEYWORDID){
                updateKeys(key,type,'set','session');            
            }

        },
        //獵取會話級數據
        get:function(key){
            if(!isexist(key,'session')){
                return;
            }else{
                var sessionKeys = getKeys('session');
                var item = this.data.getItem(key);
                return getValue(sessionKeys[key],item);
            }    
        },
        //獵取一切會話級數據
        getAll:function(){ 
            var obj={};
            for(var i in this.data){
                //filter,只輸出sessionS的私有屬性
                if (this.data.hasOwnProperty(i) && i !==KEYWORDID) { 
                    obj[i] = this.get(i)
                };
            }
            return obj;
        },
        //校驗是不是存在某個值
        isexist:function(key){
            return isexist(key,'session');           
        },
        //消滅會話級數據
        clear:function(){ 
            this.data.clear();
            this.set(KEYWORDID,{KEYWORDID:'Object'});
        },
        //更新key值
        update:function(key,data){ 
            if(!isexist(key,'session')) {
                return;
            }
            this.set(key,data);
        },
        //刪除key值
        remove:function(key){ 
            if(!isexist(key,'session') || key ==='') {
                return;
            }
            this.data.removeItem(key);
            updateKeys(key,'','remove','session')
        },
        //獵取數據範例
        keyType:function(key){
            var sessionKeys = getKeys('session');
            if(isexist(key,'session')) {
                return sessionKeys[key];
            }
        }
    }

    //磁盤存儲類
    EStorage.prototype.local = {
        data:window.localStorage,
        set : function(key,data){ //新增或更新瀏覽器永遠數據
            var type = getType(data);
            var saveData = '';

            if(type === 'String' 
                || type === 'Number' 
                || type === 'Boolean' 
                || type === 'Function' 
                || type === 'Date'){
                saveData = ''.concat(data);
            }else if(type === 'Object' || type === 'Array'){
                saveData = ''.concat(JSON.stringify(data));
            }

            this.data.setItem(key,saveData);
            if(key !==KEYWORDID){
                updateKeys(key,type,'set','local');
            }
        },
        //獵取key值
        get:function(key){
            if(!isexist(key,'local')){
                return;
            }else{
                var localKeys = getKeys('local');
                var item = this.data.getItem(key);
                return getValue(localKeys[key],item);
            }
        },
        //獵取一切永遠數據
        getAll:function(){
            var obj={};
            for(var i in this.data){
                //filter,只輸出sessionS的私有屬性
                if (this.data.hasOwnProperty(i) && i !==KEYWORDID) { 
                    obj[i] = this.get(i)
                };
            }
            return obj;
        },
        //校驗是不是存在某個值
        isexist:function(key){
            return isexist(key,'local');           
        },
        //消滅瀏覽器永遠數據
        clear:function(){
            this.data.clear();

        },
        //更新key值
        update:function(key,data){
            if(!isexist(key,'local')) {
                return;
            }
            this.set(key,data);
        },
        //刪除key值
        remove:function(key){
            if(!isexist(key,'local')) {
                return;
            }
            this.data.removeItem(key);
            updateKeys(key,'','remove','local')   
        },
        //獵取數據範例
        keyType:function(key){
            var localKeys = getKeys('local');
            if(isexist(key,'local')) {
                return localKeys[key];
            }
        }
    }

    var storage = new EStorage() 
    if(!sessionStorage.getItem(KEYWORDID)){
        storage.session.set(KEYWORDID,{KEYWORDID:'Object'});
    }
    if(!localStorage.getItem(KEYWORDID)){
        storage.local.set(KEYWORDID,{KEYWORDID:'Object'});
    }
    //是不是存在
    function isexist(key,type){
        if(type ==='session'){
            var flag = (key && sessionStorage.getItem(key)) ? true : false;

            // var sessionKeys = getKeys('session');
            // var flag = (key && sessionKeys[key]) ? true : false;
            return flag;
        }else if(type ==='local'){
            // var localKeys = getKeys('local');
            // var flag = (key && localKeys[key]) ? true : false;
            var flag = (key && localStorage.getItem(key)) ? true : false;
            return flag;
        }     
    }

    //獵取key列表
    function getKeys(type){
        if(type ==='session'){
            var item = sessionStorage.getItem(KEYWORDID);
            return getValue('Object',item);
        }else if(type ==='local'){
            var item = localStorage.getItem(KEYWORDID);
            return getValue('Object',item);
        }
        
    }

    //更新key值範例
    function updateKeys(key,keytype,operate,saveType){
        var keys = saveType ==='session' ? storage.session.get(KEYWORDID) : storage.local.get(KEYWORDID);

        switch(operate)
        {
        case 'set':
          keys[key] = keytype;
          break;
        case 'remove':
          delete keys[key];
          break;
        case 'clear':
          for(var i in keys){
            if(i !==KEYWORDID){
                delete keys[i];
            }
          }
          break;
        } 
        saveType ==='session' ? storage.session.set(KEYWORDID,keys) :         
             storage.local.set(KEYWORDID,keys); 
    }

    //對外供應接口
    return storage;
}());

    原文作者:長發飄飄
    原文地址: https://segmentfault.com/a/1190000014607238
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞