localStorage、sessionStorage詳解,以及storage事件使用


有關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、兼容性

localStorage兼容性說明

可以看到,除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); };

不難看出其中包含以下屬性:

  1. key 屬性表示存儲中的鍵名
  2. oldValue 屬性表示數據更新前的鍵值,newValue 屬性表示數據更新后的鍵值。如果數據為新添加的,則 oldValue 屬性值為 null。如果數據通過 removeItem 被刪除,則 newValue 屬性值為 null 。如果 Storage 調用的是 clear 方法,則事件中的 key 、oldValue 、newValue 都是為 null
  3. url 屬性記錄 Storage 時間發生時的源地址
  4. 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

 


免責聲明!

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



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