HTML API
localstorage 在瀏覽器的 API 有兩個(gè):localStorage 和sessionStorage,存在于 window 對(duì)象中:localStorage 對(duì)應(yīng) window.localStorage,sessionStorage 對(duì)應(yīng) window.sessionStorage。
localStorage 和 sessionStorage 的區(qū)別主要是在于其生存期。
基本使用方法
-
這里的
作用域
指的是:如何隔離開不同頁面之間的localStorage(總不能在百度的頁面上能讀到騰訊的localStorage吧,哈哈哈)。 -
localStorage
只要在相同的協(xié)議、相同的主機(jī)名、相同的端口下,就能讀取/修改到同一份localStorage數(shù)據(jù)。 -
sessionStorage
比localStorage
更嚴(yán)苛一點(diǎn),除了協(xié)議、主機(jī)名、端口外,還要求在同一窗口(也就是瀏覽器的標(biāo)簽頁)下。
生存期
localStorage
理論上來說是永久有效的,即不主動(dòng)清空的話就不會(huì)消失,即使保存的數(shù)據(jù)超出了瀏覽器所規(guī)定的大小,也不會(huì)把舊數(shù)據(jù)清空而只會(huì)報(bào)錯(cuò)。但需要注意的是,在移動(dòng)設(shè)備上的瀏覽器或各Native App
用到的WebView
里,localStorage
都是不可靠的,可能會(huì)因?yàn)楦鞣N原因(比如說退出App、網(wǎng)絡(luò)切換、內(nèi)存不足等原因)被清空。sessionStorage
的生存期顧名思義,類似于session
,只要關(guān)閉瀏覽器(也包括瀏覽器的標(biāo)簽頁),就會(huì)被清空。由于sessionStorage
的生存期太短,因此應(yīng)用場(chǎng)景很有限,但從另一方面來看,不容易出現(xiàn)異常情況,比較可靠。
數(shù)據(jù)結(jié)構(gòu)
localstorage為標(biāo)準(zhǔn)的鍵值對(duì)(Key-Value,簡稱KV)數(shù)據(jù)類型,簡單但也易擴(kuò)展,只要以某種編碼方式把想要存儲(chǔ)進(jìn)localstorage的對(duì)象給轉(zhuǎn)化成字符串,就能輕松支持。舉點(diǎn)例子:把對(duì)象轉(zhuǎn)換成json字符串,就能讓存儲(chǔ)對(duì)象了;把圖片轉(zhuǎn)換成DataUrl(base64),就可以存儲(chǔ)圖片了。另外對(duì)于鍵值對(duì)數(shù)據(jù)類型來說,”鍵是唯一的”這個(gè)特性也是相當(dāng)重要的,重復(fù)以同一個(gè)鍵來賦值的話,會(huì)覆蓋上次的值。
過期時(shí)間
很遺憾,localstorage原生是不支持設(shè)置過期時(shí)間的,想要設(shè)置的話,就只能自己來封裝一層邏輯來實(shí)現(xiàn):
容量限制
目前業(yè)界基本上統(tǒng)一為5M,已經(jīng)比cookies的4K要大很多了,省著點(diǎn)用吧騷年。
域名限制
由于瀏覽器的安全策略,localstorage是無法跨域的,也無法讓子域名繼承父域名的localstorage數(shù)據(jù),這點(diǎn)跟cookies的差別還是蠻大的。
異常處理
localstorage在目前的瀏覽器環(huán)境來說,還不是完全穩(wěn)定的,可能會(huì)出現(xiàn)各種各樣的bug,一定要考慮好異常處理。我個(gè)人認(rèn)為localstorage只是資源本地化的一種優(yōu)化手段,不能因?yàn)槭褂胠ocalstorage就降低了程序的可用性,那種只是在console里輸出點(diǎn)錯(cuò)誤信息的異常處理我是絕對(duì)反對(duì)的。localstorage的異常處理一般用try/catch
來捕獲/處理異常。
如何測(cè)試用戶當(dāng)前瀏覽器是否支持localstorage
目前普遍的做法是檢測(cè)window.localStorage
是否存在,但某些瀏覽器存在bug,雖然”支持”localstorage,但在實(shí)際過程中甚至可能出現(xiàn)無法setItem()這樣的低級(jí)bug。因此我建議,可以通過在try/catch
結(jié)構(gòu)里set/get
一個(gè)測(cè)試數(shù)據(jù)有無出現(xiàn)異常來判斷該瀏覽器是否支持localstorage,當(dāng)然測(cè)試完后記得刪掉測(cè)試數(shù)據(jù)哦。
瀏覽器兼容性
Feature | Chrome | Firefox | Internet Explorer | Opera | Safari | Android | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|---|
localStorage | 4 | 3.5 | 8 | 10.50 | 4 | 2.1 | 11 | iOS 3.2 |
sessionStorage | 5 | 2 | 8 | 10.50 | 4 | 2.1 | 11 | iOS 3.2 |
如何調(diào)試
在chrome開發(fā)者工具里的Resources - Local Storage
面板以及Resources - Session Storage
面板里,可以看到當(dāng)前域名下的localstorage數(shù)據(jù)。
在ios設(shè)備上無法重復(fù)setItem()
另外,在iPhone/iPad上有時(shí)設(shè)置setItem()時(shí)會(huì)出現(xiàn)詭異的QUOTA_EXCEEDED_ERR錯(cuò)誤,這時(shí)一般在setItem之前,先removeItem()就ok了。
相關(guān)插件推薦
-
store.js
-
mozilla/localForage
-
localFont
參考文章
-
W3C – Web Storage
-
HTML5 LocalStorage 本地存儲(chǔ)
-
MDN – Window.localStorage
原文鏈接:https://segmentfault.com/a/1190000004121465