首頁 >web前端 >H5教程 >HTML5中Localstorage的使用教學_html5教學技巧

HTML5中Localstorage的使用教學_html5教學技巧

WBOY
WBOY原創
2016-05-16 15:46:271652瀏覽

什麼是localstorage

  前幾天在舊項目中發現有對cookie的操作覺得很奇怪,諮詢下來是要緩存一些信息,以避免在URL上面傳遞參數,但沒有考慮過cookie會帶來什麼問題:

  ① cookie大小限制在4k左右,不適合存業務資料
  ② cookie每次隨HTTP事務一起發送,浪費頻寬

  我們是做行動專案的,所以這裡真實適合使用的技術是localstorage,localstorage可以說是對cookie的優化,使用它可以方便在客戶端儲存數據,並且不會隨著HTTP傳輸,但也不是沒有問題:

  ① localstorage大小限制在500萬字符左右,各個瀏覽器不一致
  ② localstorage在隱私模式下不可讀取
  ③ localstorage本質是在隱私模式下不可讀取
  ③ localstorage本質是在隱私模式下不可讀取

  ③ localstorage本質是在寫入檔案一次將資料導入內存,想想就覺得嚇人啊)

  ④ localstorage不能被爬蟲爬取,不要用它完全取代URL傳參

  瑕不掩瑜,以上問題皆可避免,所以我們的關注點應該放在如何使用localstorage上,並且是如何正確使用。 localstorage的使用

  基礎知識

  localstorage儲存物件分為兩種:

  ① sessionStrage: session即會話的意思,這裡的session是指用戶瀏覽某個網站時,從進入網站到關閉網站這個時間段,session對象的有效期就只有這麼長。

  ② localStorage: 將資料保存在客戶端硬體設備上,不管它是什麼,意思就是下次開啟電腦時候資料還在。

  兩者差異就是一個作為臨時保存,一個長期保存。   這裡來一段簡單的程式碼說明其基本使用:

XML/HTML Code
複製內容到剪貼簿
  1. div id=id=id=id 
  2. 樣式="邊距:10px 0;邊框:1px 實心黑色;內邊距:10px;寬度:300px;
  3.   高度:100px;"
  4. >  
  5. div
  6. >   輸入 類型="文本"  id="文字"
  7.  
  8. /> /> />/> 選擇
  9.  
  10. id=id=id 🎜>>     選項 
  11. ="會話" >sessionStorage選項>選項>   選項 
  12. ====
  13. 🎜>
  14. >本地儲存選項> > > 
  15. >  
  16. 按鈕 點擊="保存( ) ;">  
  17.   保存資料按鈕>  
  18. 按鈕 onclick=onclick=onclick=
  19. ;"
  20. >     讀取資料
  21. 按鈕
  22. >  
  23. 腳本
  24.  類型=類型 ">
  25.   
  26.   var 
  27. msg
  28.  = 
  29. 文件.getElementById('msg'),               文字 = 文件
  30.             類型 = 文件   
  31.   函數 save() {        var str = 文字.valueue;     var t = 型別.valueue;
  32.     if (t == '會話') {   
  33.       sessionStorage.setItem('msg', str);   
  34.     } 其他 {   
  35.       localStorage.setItem('msg', str);   
  36.     }   
  37.   }   
  38.   
  39.   函數 load() {   
  40.     var t = 型別.valueue;
  41.     if (
  42. t == '會話') {   
  43.       
  44. msg.innerHTML = sessionStorage

        } 其他 {   

  45.       
  46. msg.innerHTML
  47.  = 
  48. localStorage

        }      }   

  49. 腳本
  50. >
  51.   
  52. 真實場景 實際工作中對本地儲存的使用一般有以下需求: :① 儲存一般訊息,如搜尋頁的出發城市,到達城市,非即時定位資訊
  53. 【② 快取城市列表數據,這個數據往往比較大
【③每個伺服器資訊都需要可追踪,例如伺服器通知城市資料更新,這個時候在最近一次造訪的時候要自動設定過渡

四個資訊有過期日期,在過期時間需要由伺服器拉取資料

XML/HTML 程式碼

將內容複製到剪貼簿

  1. define([], function () {   
  2.   
  3.   var Storage = _.inherit({  >
  4.     //預設屬性   
  5.     propertys: function () {   
  6.   
  7.       //代理對象,預設為localstorage   
  8.       
  9. this.sProxy = window.   
  10.       //60 * 60 * 24 * 30 * 1000 
  11. ms
  12.       this.defaultLifeTime
  13.  = 
  14. 2592000000>🎜>          //本地快取使用以存放所有localstorage鍵值與過期日期的對應   
  15.       
  16. this.keyCache
  17.  = 
  18. 'SYSTEM”
  19.          //當快取容量已滿,每次刪除的快取數          
  20. this.removeNum
  21.  = 
  22. 5
  23. ;   
  24.     },           assert: function () {   
  25.       if (
  26. this.sProxy === null) {   
  27.         throw 'not override sProxy property';   
  28.       }   
  29.     },   
  30.   
  31.     initialize: function (opts) {   
  32.       this.propertys();   
  33.       this.assert();   
  34.     },   
  35.   
  36.     /*   
  37.     新增localstorage   
  38.     資料格式包含唯一鍵值,json字串,過期日期,存入日期   
  39.     sign 為格式化後的請求參數,用於同一請求不同參數時候返回新數據,例如列表為​​北京的城市,後切換為上海,會判斷tag不同而更新緩存數據,tag相當於簽名  
  40.     每一鍵值只會快取一個訊息   
  41.     */   
  42.     set: function (key, value, timeout, sign) {   
  43.       var _d = new      //存入日期   
  44.       var 
  45. indate = _d.get>;   
  46.       //最終儲存的資料   
  47.       var entity
  48.  = null;          if (!timeout) {   
  49.         _d.setTime(_d.getTime()   this.defaultLifeTime);   
  50.         
  51. timeout = 
  52. _d.       }      
  53.       //   
  54.       this.setKeyCache(key, timeout);   
  55.       entity
  56.  = this
  57.          try {            this.sProxy.setItem(key, JSON.stringify(entity));   
  58.         return true;   
  59.       } catch (e) {   
  60.         //localstorage寫滿時,全清除   
  61.         if (
  62. e.name == 'QuotaExceededError') {   
  63.           //            this.sProxy.clear();   
  64.           //localstorage寫滿時,選擇離過期時間最近的資料刪除,因此也會有些影響,但感覺比全清除好,如果快取過多,此過程比較耗時,100ms以內             if (!this.removeLastCache()) throw '這次資料儲存量過大';   
  65.           this.set(key, value, timeout, sign);   
  66.         }   
  67.         console && console.log(e);   
  68.       }  
  69.       return false;   
  70.     },   
  71.   
  72.     //刪除過期快取  ​​ 
  73.     removeOverdueCache: function () {   
  74.       var tmpObj = null = null
  75.  = 
  76. null
  77.          var now = new
  78.       //取出鍵值對   
  79.       var cacheStr = thisache.       var 
  80. cacheMap
  81.  = [];          var 
  82. newMap
  83.  = [];          if (!cacheStr) {   
  84.         return;   
  85.       }   
  86.   
  87.       
  88. cacheMap = JSON.   
  89.       for (
  90. i = 0cacheMap.length; i  len len         tmpObj
  91.  = 
  92.         if (tmpObj.timeout   
  93.           this.sProxy.removeItem(tmpObj.key);            } else {              newMap.push(tmpObj);   
  94.         }   
  95.       }   
  96.       this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));   
  97.   
  98.     },   
  99.   
  100.     removeLastCache: function () {   
  101.       var i, len;   
  102.       var num = this  
  103.       //取出鍵值對   
  104.       var 
  105. cacheStr = thisache.       var cacheMap
  106.  = [];   
  107.       var delMap
  108.  = [];   
  109.   
  110.       //說明本次儲存過大   
  111.       if (!cacheStr) return false;   
  112.   
  113.       cacheMap.sort(function (a, b) {   
  114.         return a.timeout - b.timeout;   
  115.       });   
  116.   
  117.       //刪除了哪些資料   
  118.       delMap
  119.  = cacheMap      for (i = 
  120. 0delMap.length; i  len len;         this.sProxy.removeItem(delMap[i].key);          }      
  121.       this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));   
  122.       return true;   
  123.     },   
  124.   
  125.     setKeyCache: function (key, timeout) {   
  126.       if (!key || !timeout || timeout 
  127.  new
  128.  Date().getTime() ) return;   
  129.       var i, len, tmpObj;             //取得目前已快取的鍵值字串   
  130.       var oldstr
  131.  = this
  132.       var oldMap
  133.  = [];          //目前key是否已存在          var 
  134. flag = false
  135.       var obj
  136.  = {};   
  137.       obj.key = 鍵;   
  138.       obj.timeout = 逾時;  
  139.   
  140.       if (oldstr) {   
  141.         oldMap = JSON.
  142.         if (!_.isArray(oldMap)) oldMap = [];    = [];   
  143.       }   
  144.   
  145.       為(i = 0 oldMap.length;  i  len len;         
  146. tmpObj = oldMap = oldMap        if (
  147. tmpObj.key == key) {   == key) {   == key) {  
  148.           oldMap[i] = obj;   
  149.           標誌 =           休息;  
  150.         }   
  151.       }   
  152.       if (!flag) oldMap.push(obj);   
  153.       //最後將新的倉庫放到快取中   
  154.       this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  155.   
  156.     },   
  157.   
  158.     buildStorageObj:函數(數值、日期、逾時、符號){   
  159.       var 
  160. obj
  161.  = {            值:數值,  
  162.         逾時:逾時,  
  163.         標誌: 標誌,  
  164.         indate: indate   
  165.       };  
  166.       回 obj;   
  167.     },   
  168.   
  169.     get: function (key, sign) {   
  170.       var result, now = new
  171.       try {   
  172.         
  173. result = this<. class="attribute-value">        if (!result) return null;   
  174.         result
  175.  = JSON.            //資料過期   
  176.         if (result.timeout 
  177.  
  178. now) return null;               //需驗證簽章   
  179.         if (sign) {   
  180.           if (
  181. sign === result.sign)   
  182.             return result.value;              return null;   
  183.         } else {   
  184.           return result.value;   
  185.         }   
  186.   
  187.       } catch (e) {   
  188.         console && console.log(e);   
  189.       }   
  190.       return null;   
  191.     },   
  192.   
  193.     //取得簽章   
  194.     getSign: function (key) {   
  195.       var result, 
  196. sign = 
  197.       try {            result = this
  198. <.>        if (result) {   
  199.           result = J.          
  200. sign
  201.  = 
  202.         }          } catch (e) {            console && console.log(e);   
  203.       }  
  204.       返回標誌;   
  205.     },   
  206.   
  207.     刪除:功能(鍵){   
  208.       返回 this.sProxy.removeItem(key);   
  209.     },   
  210.   
  211.     清除: 函數 () {   
  212.       this.sProxy.clear();   
  213.     }   
  214.   });   
  215.   
  216.   Storage.getInstance = 函數
  217.     if (this.instance) {   
  218.       返回 this.instance;   
  219.     } 其他 {   
  220.       return 
  221. this.instance = new 🎜>new 🎜
  222.     }   
  223.   };   
  224.   
  225.   回儲存;   
  226.   
  227. });  
潛在程式碼包含了本地儲存的基本操作,並且對以上問題進行了處理,而真實的使用還要再抽象化:


XML/HTML 程式碼將內容複製到剪貼簿
  1. define(['AbstractStorage'], function (AbstractStorage) {   
  2.   
  3.   var Store = _.inherit({  >
  4.     //預設屬性   
  5.     propertys: function () {   
  6.   
  7.       //每個物件一定要有儲存鍵,且無法重複   
  8.       
  9. this.key = null;   
  10.       //預設一條資料的生命週期,S為秒,M為分,D為天   
  11.       
  12. this.lifeTime
  13.  = '30M'   
  14.       //預設回傳資料   
  15.       //      this.defaultData
  16.  =           //代理對象,localstorage對象   
  17.       this.sProxy
  18.  = new
  19.        },      
  20.     setOption: function (options) {   
  21.       _.extend(this, options);   
  22.     },   
  23.   
  24.     assert: function () {   
  25.       if (
  26. this.key
  27.  === null) {   
  28.         throw 'not override key property';   
  29.       }          if (
  30. this.sProxy
  31.  === null) {   
  32.         throw 'not override sProxy property';   
  33.       }        },   
  34.   
  35.     initialize: function (opts) {   
  36.       this.propertys();   
  37.       this.setOption(opts);   
  38.       this.assert();   
  39.     },   
  40.   
  41.     _getLifeTime: 函數 () {   
  42.       var 逾時 = 0;
  43.       var 
  44. str = 這個

          var 單位

  45.  = str      var num = str
  46.       var 地圖 = {            D: 86400,   
  47.         小時:3600,           男:60,  
  48.         S:1   
  49.       };  
  50.       if (typeof 
  51. 單位
  52.  == '字串') {   
  53.         
  54. 單位單位 = unit.toUpperCase();  🎜> = unit.toUpperCase();  >       }   
  55.       逾時 = num
  56.  num
  57.         如果 (單位) 逾時 = 地圖
  58.   
  59.       //單位為毫秒          回傳 num * 逾時 * 1000 ;   
  60.     },   
  61.   
  62.     // 快取資料   
  63.     設定:函數(值,符號){   
  64.       //獲得過渡時間   
  65.       var 
  66. 逾時
  67.  = 
  68.       timeout.setTime(timeout.getTime()   this._getLifeTime());   
  69.       this.sProxy.set(this.key, value, timeout.getTime(), sign);   
  70.     },      
  71.     //設定單一屬性   
  72.     setAttr:函數(名稱、值、符號){   
  73.       var key, obj;   
  74.       if (_.isObject(name)) {   
  75.         用於(鍵入姓名){   
  76.           if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);   
  77.         }  
  78.         返回;   
  79.       }   
  80.   
  81.       if (!sign) sign = 這個
  82.   
  83.       //取得目前物件   
  84.       
  85. obj = 這個.這個..
  86.       if (!obj) 返回;   
  87.       obj[名稱] = 值;   
  88.       this.set(obj, sign);   
  89.   
  90.     },   
  91.   
  92.     getSign: 函數 () {   
  93.       返回 this.sProxy.getSign(this.key);   
  94.     },   
  95.   
  96.     刪除: 函數 () {   
  97.       this.sProxy.remove(this.key);   
  98.     },   
  99.   
  100.     removeAttr:函數(attrName){   
  101.       var 
  102. obj =       if (obj[attrName]) {   
  103.         刪除 obj[attrName];   
  104.       }   
  105.       this.set(obj);   
  106.     },   
  107.   
  108.     取得:函數(符號){   
  109.       var 
  110. 結果
  111.  = [], 
  112. ,一;          var obj = this.sProxy.(m); 🎜>       var 
  113. 類型 = typeof      var o
  114.  = { 'string': true, )
  115.       if (o[type]) return obj;             if (_.isArray(obj)) {   
  116.          for (var i = 
  117. 0obj.length;  i 
  118.  
  119. len
  120.  
  121. len len len  >           結果[i] = obj[i];            }  
  122.       } else if (_.isObject(obj)) {   
  123.         結果 = obj; >;
  124.       }   
  125.   
  126.       對於(結果){   
  127.         
  128.  = ;         休息;   
  129.       }   
  130.       返回! isEmpty? 結果:空;   
  131.     },   
  132.   
  133.     getAttr:函數(attrName,標籤){   
  134.       var 
  135. obj
  136.  = .get.       var attrVal = 
  137. null
  138.       if (obj) {            
  139. attrVal
  140.  = 
  141. obj
  142.  = obj = obj      }   
  143.       回 attrVal;   
  144.     }   
  145.   
  146.   });   
  147.   
  148.   
  149. Store.getInstance
  150.  = 函數     if (this.instance) {   
  151.       返回 this.instance;   
  152.     } 其他 {   
  153.       return 
  154. this.instance
  155.  = 
  156. new 🎜>new 🎜     }   
  157.   };   
  158.   
  159.   回店;   
  160. });  
  161. 【我們真正使用的時候是使用store這個類別操作localstorage,程式碼簡單結束測試:
儲存完成,以後都不會走請求了,所以今天的基本程式碼結束了,最後在android Hybrid中有個後退按鈕,這個按鈕一旦點擊就會回到上一個頁面,這個時候裡面的localstorage就可以讀取了一個簡單的不可靠的解決方案是在webapp中加入:


201579150514318.jpg (488×184)

XML/HTML 程式碼

將內容複製到剪貼簿
window.onunload
     = 
  1. function () { };//適合單頁應用,不要問我為什麼,我也不知道   結語
本地儲存是行動開發必要的技術點,需要深入了解,具體業務代碼後續會放到git上,有興趣的朋友可以去了解

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn