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

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

May 16, 2016 pm 03:46 PM
html5 localstorage

什麼是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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1242
24
HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles