有關localStorage和sessionStorage的特性。 localStorage本身帶有方法有 添加鍵值對:localStorage.setItem(key,value),如果key存在時,更新value。 獲取鍵值:localStorage.getItem(key),如果key不存在返 ...
有關localStorage和sessionStorage的特性。
localStorage本身帶有方法有
添加鍵值對:localStorage.setItem(key,value),如果key存在時,更新value。
獲取鍵值:localStorage.getItem(key),如果key不存在返回null。
刪除鍵值對:localStorage.removeItem(key)。key對應的數據將會全部刪除。
清除所有鍵值對:localStorage.clear()。如果調用clear()方法,清空localStorage中所有信息,那麼key、oldValue和newValue都會被設置為null。
獲取localStorage的屬性名稱(鍵名稱):localStorage.key(index)。
還有一個和普通對象不一樣的屬性length:
獲取localStorage中保存的鍵值對的數量:localStorage.length。
下麵這個例子用來獲取localStorage的鍵值對
for(var i=0;i<localStorage.length;i++){ console.log(localStorage.key(i)+ " : " + localStorage.getItem(localStorage.key(i))); }
1、存儲格式
localStorage對象的鍵和值只能是字元串,假設我們要保存一個對象到localStorage中,可以使用拼接的方式。當然也可以藉助JSON類,將對象轉換成字元串保存,然後在取出來的時候將json字元串轉換成真正可用的json對象格式
存儲JSON格式數據
JSON.stringify(data) 將一個對象轉換成JSON格式的數據串,返迴轉換後的串
JSON.parse(data) 將數據解析成對象,返回解析後的對象
(雖然規範中可以存儲其他原生類型的對象,但是目前為止沒有瀏覽器對其進行實現)。
2、生命周期
在數據存儲的時效性上,localStorage並不會像cookie那樣可以設置數據存活的時限。也就是說,只要用戶不主動刪除,localStorage存儲的數據將會永久存在。
sessionStorage生命周期為當前視窗或標簽頁,一旦視窗或標簽頁被永久關閉了,那麼所有通過sessionStorage存儲的數據也就被清空了。
3、存儲位置
當然,對於localStorage數據的存儲,是存在於本地的文件系統中的,例如,對於chrome來說,localStorage數據的存儲位置是在:C:\Users\{userName}\AppData\Local\Google\Chrome\User Data\Default\Local Storage中。對於其他4大瀏覽器,大家可以自行查找進行查看。
4、數據共用
不同瀏覽器無法共用localStorage或sessionStorage中的信息。相同瀏覽器的不同頁面間可以共用相同的localStorage(頁面屬於相同功能變數名稱和埠),但是不同頁面或標簽頁間無法共用sessionStorage的信息。這裡需要註意的是,頁面及標簽頁僅指頂級視窗,如果一個標簽頁包含多個iframe標簽且他們屬於同源頁面,那麼他們之間是可以共用sessionStorage的。
5、相容性
可以看到,除IE外的其他瀏覽器很早的版本都支持了,對於IE低版本系列的瀏覽器,我們需要一個相容方案來處理。
微軟在IE5.0以後,自定義了一種持久化用戶數據的概念userData,這種存儲方式只有IE瀏覽器自己支持。來看看其如何操作——
(function(win) { // 對於IE,且不支持localStorage的瀏覽器 // 即針對IE6/7 if ( typeof win.attachEvent != "undefined" && typeof win.localStorage == "undefined") { var localFileName = "_simulateLocalStorage", expires = 365, formField = null; // 設置有效期為365天 var expire = new Date(); expire.setDate(expires + expire.getDate()); formField = document.createElement("input"); formField.type = "hidden"; formField.addBehavior('#default#userData'); document.body.appendChild(formField); var storage = { setItem : function(key, value) { formField.load(localFileName); formField.setAttribute(key, value); formField.save(localFileName); }, getItem : function(key) { formField.load(localFileName); return formField.getAttribute(key); }, removeItem : function(key) { formField.load(localFileName); formField.removeAttribute(key); formField.save(localFileName); }, clear : function() { formField.load(localFileName); var d = new Date(); d.setDate(d.getDate() - 1); formField.expires = d.toUTCString(); formField.save(localFileName); } }; win["localStorage"] = storage; } })(window);
這裡僅僅是對IE相容性的簡單包裝,下麵的鏈接給出非常完善的針對localStorage相容性的解決方案。
https://github.com/machao/localStorage
6、存儲大小
對於HTML5的localStorage而言,其大小支持為5M(當然,各瀏覽器的大小差異還是有的)。對於IE的userData,用戶數據的每個域最大為64KB。
7、應用場景
建議不要使用localStorage方式存儲敏感信息,哪怕這些信息進行過加密。另外,對身份驗證數據使用localStorage進行存儲還不太成熟。我們知道,通常可以通過xss漏洞來獲取到Cookie,然後用這個Cookie進行身份驗證登錄,但是瀏覽器可以通過HttpOnly來保護Cookie不被XSS攻擊獲取到。而localStorage存儲沒有對XSS攻擊有任何防禦機制,一旦出現XSS漏洞,那麼存儲在localStorage里的數據就極易被獲取到。
storage事件:當存儲的storage數據發生變化時都會觸發它,但是它不同於click類的事件會冒泡和能取消,storage改變的時候,觸發這個事件會調用所有同域下其他視窗的storage事件,不過它本身觸發storage即當前視窗是不會觸發這個事件的(當然ie這個特例除外,它包含自己本事也會觸發storage事件)。
在使用 Storage 進行存取操作的同時,如果需要對存取操作進行監聽,可以使用 HTML5 Web Storage api 內置的事件監聽器對數據進行監控。只要 Storage 存儲的數據有任何變動,Storage 監聽器都能捕獲。
interface Storage : Event{
readonly attribute DOMString key;
readonly attribute DOMString? oldValue;
readonly attribute DOMString? newValue;
readonly attribute DOMString url;
readonly attribute Storage? storageArea;
void initStorageEvent(in DOMString typeArg,
in boolean canBubbleArg,
in boolean cancelableArg,
in DOMString keyArg,
in DOMString oldValueArg,
in DOMString newValueArg,
in DOMString urlArg,
in Storage storageAreaArg);
};
不難看出其中包含以下屬性:
- key 屬性表示存儲中的鍵名
- oldValue 屬性表示數據更新前的鍵值,newValue 屬性表示數據更新後的鍵值。如果數據為新添加的,則 oldValue 屬性值為 null。如果數據通過 removeItem 被刪除,則 newValue 屬性值為 null 。如果 Storage 調用的是 clear 方法,則事件中的 key 、oldValue 、newValue 都是為 null
- url 屬性記錄 Storage 時間發生時的源地址
- StorageArea 屬性指向事件監聽對應的 Storage 對象
Storage 事件可以使用 W3C 標準的註冊事件方法 addEventListenter 進行註冊監聽。例如:
window.addEventlistener("storage",showStorageEvent,false);
function showStorageEvent(e){
console.log(e)
}
舉例:
頁面a下,有個input框用來存儲store,它自身綁定了storage事件,這個時候寫入新的數據點擊保存,這時新的sotre數據保存了,但是頁面a的storage事件沒觸發,
而頁面b下,綁定的storage事件則觸發了。(ps:前提頁面a和b在同域下,並都是打開狀態不同視窗);
頁面a代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <input type="text" placeholder="input date to save"> <button>save</button> <script> (function(D){ var val = D.getElementsByTagName("input")[0], btn = D.getElementsByTagName("button")[0]; btn.onclick = function(){ var value = val.value; if(!value) return; localStorage.setItem("key", val.value); }; window.addEventListener("storage", function(e){ console.log(e); }); })(document); </script> </body> </html>
頁面b代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <script> window.addEventListener("storage", function(e){ console.log(e); document.write("oldValue: "+ e.oldValue + " newValue:" + e.newValue) }); </script> </body> </html>
看到這裡是不是很疑惑那storage事件到底有什麼用,多視窗間多通信用到它就是最好選擇了,比如某塊公用內容區域基礎數據部分都是從store中提取的,這個區域中大多數頁面中都有,當用戶打開多個頁面時,在其中一個頁面做了數據修改,那其他頁面同步更新是不是很方便(當前頁面就要用其他方式處理了),當然用於視窗間通信它作用不僅僅如此,更多的大家可以利用它特性去發揮。
在上面的demo頁面b中storage的events對象的屬性常用的如下:
oldValue:更新前的值。如果該鍵為新增加,則這個屬性為null。
newValue:更新後的值。如果該鍵被刪除,則這個屬性為null。
url:原始觸發storage事件的那個網頁的網址。
key:存儲store的key名;
參考:
1>http://www.cnblogs.com/jinguangguo/p/4083919.html
2> http://blog.csdn.net/nx8823520/article/details/30478859