h5的本地存儲


什么是本地存儲

以下內容從網上抄來的

HTML5 storage提供了一種方式讓網站能夠把信息存儲到你本地的計算機上,並再以后需要的時候進行獲取。這個概念和cookie相似,區別是它是為了更大容量存儲設計的。Cookie的大小是受限的,並且每次你請求一個新的頁面的時候cookie都會被發送過去。HTML5的storage是存儲在你的計算機上,網站在頁面加載完畢后可以通過Javascript來獲取這些數據。
簡單的說本地存儲是HTML5的一部分。更為詳細准確的說是本地存儲過去是HTML5的標准中的一部分,而后來由於有些工作組的人表示HTML5太龐大了,於是就剝離出來作為一個單獨的標准。這聽起來好像是把一塊餡餅分成很多塊目的是為了減少總的卡路里……

為什么要用本地存儲

其實前面已經提到了,用本地存儲有這些好處

  • 本地存儲和cookie一樣提供了把數據保存到本地的能力,頁面刷新或者關掉瀏覽器后,數據依然存在
  • 大!雖然不同瀏覽器的標准可能不一樣,主流的一般都在5~10M,比cookie的4k強多了
  • 本地存儲的數據不會被發到服務器,與cookie相比,節省帶寬,加快響應速度

所以,如果需要保存一些數據到用戶的瀏覽器,而這些數據又不需要每個請求都提交給服務器,不妨考慮使用本地存儲。

如何使用

首先,得檢查瀏覽器是否支持本地存儲
可以通過檢測window下面是否有localStorage字段來判斷,但是在IE下,本地文件是不能訪問localStorage的,此時localStorage字段為空,所以還要加上判斷

'localStorage' in window && window['localStorage']!== null

還有一種情況,假如頁面里有id為localStorage的元素,某些瀏覽器可以通過window.localStorage索引到這個元素-___,-||
為了避免你的代碼在遇到如此蛋疼的DOM時跪掉,我建議是使用特征檢查

window.localStorage && window.localStorage.getItem

確定瀏覽器支持localStorage后,我們就可以使用它的接口了,localStorage的使用方法很簡單,在chrome的控制台里面打印一下localStorage,就能列出它的全部方法,我相信很多人一看就能明白了。

我們主要用到的

length:本地存儲數據的個數
setItem(key,value):向key字段寫入value數據
getItem(key):去key字段的數據
removeItem(key):移除key字段
clear():清空該域下的所有數據
key(i):獲取第i個數據的key

我們還可以像操作一個Object一樣操作localStorage

var ls=localStorage;
ls['user']='John';
ls.setItem('work','codding');
console.info(ls.length); //2
console.info(ls.user + ' is ' + ls.work); //John is codding
ls['work']='debugging';
console.info(ls.user + ' is ' + ls.work); //John is debugging
delete ls['work'];
for(var i in ls){
  console.info(i + ' : ' + ls.getItem(i)); //user : John
  ls.removeItem(i);
}

唯一不同的是,對於一個不存在的字段notExist,localStorage.getItem(‘notExist’)會返回null,而localStorage[‘notExist’]則返回undefined。

一些細節

看到這里,你已經掌握了使用本地存儲的方法了,下面的是我使用過程中的一些心得。
本地存儲只能存字符串數據,所有數據在寫入的時候會被隱式調用toString方法轉為字符串,即

var ls=localStorage;
var data={
  user:"John",
  sex:"female"
};
ls.setItem('data',data);
ls.setItem('realData',JSON.stringify(data));
console.info(ls.data); //[object Object]
console.info(ls.realData); //{"user":"John","sex":"female"}

因此,需要存儲json之類的數據時,需要自己做轉換。
不同瀏覽器,分配給本地存儲的空間是不一樣的,譬如chrome是5M。這5M是整個子域共享的,例如http://www.alloyteam.com/2012/04/codejam/和http://www.alloyteam.com/2012/03/css3-checkbox/兩個頁面同在www.alloyteam.com域下,它們共享同一個本地存儲空間,訪問到的數據也是同一份;而http://csslib.alloyteam.com/在csslib.alloyteam.com域下,訪問的是另一個存儲空間。
一個unicode字符占2個字節(英文和中文一樣),所以5M可以存儲1024*1024/2=524288個字符,包括key和value。也就是說,localStorage.setItem(‘user’,’John’)向本地存儲寫進了8個字符(16Byte)。這個網站有一份各種瀏覽器分配給localStorage存儲空間大小的表,你也可以在上面測試當前使用的瀏覽器支持多大的存儲空間,不過它的數據有個問題,它沒有考慮到一個unicode字符占2字節,因此它的數據應該全部乘2。
當本地存儲滿了,再往里面寫數據,將會觸發error(這點和cookie的表現不一樣),因此一個嚴謹的腳本應該捕捉寫localStorage的錯誤

var FIVE_MB=Array(5*1024*512).join('囧');
try{
  localStorage.setItem('x',FIVE_MB);
}catch(e){
  console.info('Oops');
}

當調用localStorage.clear()時,整個域的數據會被清空,包括和當前頁面共享一個存儲空間的其他頁面。

瀏覽器不支持本地存儲怎么辦

對於IE6和IE7,有userData,可以提供最多1024kb的空間,雖然userData可以設置有效期,但是仍然存在寫滿報錯的問題,並且userData創建的存儲文件不能被枚舉,因此需要人為地維護。
另外還可以使用內嵌flash控件,使用flash的本地存儲空間,flash默認提供100kb,使用更多需要用戶授權。
這兩種方法的使用成本較高,本文就不再展開討論了。

轉載自AlloyTeam:http://www.alloyteam.com/2012/04/sth-about-localstorage/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM