1. 程式人生 > >localStorage、sessionStorage詳解,以及storage事件使用

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相容性的解決方案。

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

相關推薦

localStoragesessionStorage以及storage事件使用

有關localStorage和sessionStorage的特性。 localStorage本身帶有方法有   新增鍵值對:localStorage.setItem(key,value),如果key存在時,更新value。   獲取鍵值:localStorage.getItem(key),如果key不存在返回

JVM效能調優監控工具jpsjstackjmapjhatjstathprof使用以及例子

現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ......     這

對稱加密以及JAVA簡單實現

turn bsp 十進制 stat mage 需要 對稱密鑰 else ges (原) 常用的加密有3種 1、正向加密,如MD5,加密後密文固定,目前還沒辦法破解,但是可以能過數據庫撞庫有一定概率找到,不過現在一般用這種方式加密都會加上鹽值。 2、對稱加密,通過一個固定

動態路由協議RIP,OSPF基礎知識以及配置實驗驗證

多個 shadow star 下一跳 tle water 外交 協議 使用 動態路由:不需要手工寫路由,將各自的直連網段宣告出去,路由器之間就可以相互學習,如果路由表有變化則及時更新宣告給相鄰的路由器靜態路由 優點:精確轉發,由管理員手動控制 缺點:靈活性差動態路由特點

MongoDB 數據庫以及 MongoDB4.0版本的安裝

primary 所在 高可用 使用 進行 remove 存儲空間 標記 詳解 MongoDB 簡介 MongDB 是一款跨平臺,面向文檔的數據庫,可以實現高性能,高可用性,並且能夠輕松擴展,是一個基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保

ASM原理以及使用附程式碼

一、什麼是ASM   ASM是一個java位元組碼操縱框架,它能被用來動態生成類或者增強既有類的功能。ASM 可以直接產生二進位制 class 檔案,也可以在類被載入入 Java 虛擬機器之前動態改變類行為。Java class 被儲存在嚴格格式定義的 .class檔案裡

int main(int argc,char* argv[])以及與int main()有什麼區別

K&R C 上5.10 命令列引數 中介紹的int main(int argc,char* argv[ ]) 在 d:\ 編寫 程式,並命名為 c.c #include int main(int argc, char ** argv) {     int i;

svn 配置以及各種可能遇到的問題

花了一天時間,走了不少彎路,解決N多錯誤,終於全部完成了,記下安裝過程中遇到的各種問題,希望對初步使用svn的TX們有所幫助。  關於svn的介紹此處略過,直接進入正題。  svn服務的開啟有兩種方式,  自帶的svnserve服務(訪問地址類似於svn://192.

Linux學習-linux系統下python升級到python3.6步驟以及遇到的問題解決

說明:一般linux會自帶pyhton2.7 1、首先下載源tar包 可利用linux自帶下載工具wget下載,如下所示: 或者直接在本機上下載以後,rx上傳。再或者下載一個WinSCP,可在介面上直接上傳檔案,比較方便 2、下載完成後到下載目錄下,解壓 tar -xzvf Python-3

Android 6.0 許可權申請以及許可權申請框架MPermissions的簡單使用

1.首先先來個框架地址:https://github.com/hongyangAndroid/MPermissions/2.真的很好用:1.in Activity:public class MainActivity extends AppCompatActivity {

jobservice與jobchedule以及如何應用

This will happen if the requirementsspecified at schedule time are no longer met. For example you may haverequested WiFi with setRequiredNetworkType(int),

Jenkins安裝配置專案釋出管理史上最清晰值得收藏!

2018年07月12日 14:29:36 目錄: 一、導語 二、Jenkins 介紹 三、基礎環境準備 四、Jenkins安裝 五、Jenkins配置 六、原始碼構建、打包、部署、執行 七、常見問題彙總 八、後記 九、黑色小幽默 一、導語 Jenk

sessionStoragelocalStorage與cookiesession

cookie和session的區別 由於HTTP是一種無狀態的協議,資料交換完畢後會關閉連線,為了分辨一個請求是誰發起的,以免在同一個網站每開啟一個頁面都需要重新登入,引入了Session和Cookie兩個機制。 Cookie和Session都是用來跟蹤瀏覽器使用者身份的方式。 1、

Java中的集合結合 ArrayListHashSet 的區別以及HashCode的作用。

Java中的集合:      (1)Collection                           List(有序,可重複)             ArrayList         

LocalStorageSessionStorage使用

一、什麼是localStorage、sessionStorage 在HTML5中,新加入了一個localStorage特性,這個特性主要是用來作為本地儲存來使用的,解決了cookie儲存空間不足的問題(cookie中每條cookie的儲存空間為4k),localStorage中一般瀏覽器支援的是5M大小,

#21 在Linux裏進程管理與pstreepspgreppkillpidoftop命令的應用

在linux裏進程管理詳解 與pstree、ps、pgrep、pkill、pidof、top命令的應用 進程管理: 所謂進程:process,一個活動的程序的實體的副本; 生命周期; 可能包含一個或多個執行流; 創建進程: 每個進程的組織結構是一致的: 內核在正常啟動並且全

【我的Linux我做主】Linux系統文件操作之cprmmv

Linux基礎知識 系統運維 對文本文件的操作非常基礎而且和重要,掌握它們後操作文本你會更加得心應手。要復制文件,請使用cp(copy)這個命令,cp這個命令的用途可多了,除了單純的復制之外,還可以建立建立快捷方式,對比兩個文件的新舊程度從而決定是否更新,以及復制整個目錄下的文件等功能。至於移動目錄和

學機器學習不會資料處理怎麼行?—— 二Pandas

在上篇文章學機器學習,不會資料處理怎麼行?—— 一、NumPy詳解中,介紹了NumPy的一些基本內容,以及使用方法,在這篇文章中,將接著介紹另一模組——Pandas。(本文所用程式碼在這裡) Pandas資料結構介紹 大家應該都聽過表結構,但是,如果讓你自己來實現這麼一個結構,並且能對其進行資料處理,能實

Js中localStoragesessionStorage以及Cookie介紹

---恢復內容開始---基本概念 Cookie Cookie 是小甜餅的意思。顧名思義,cookie 確實非常小,它的大小限制為4KB左右。它的主要用途有儲存登入資訊,比如你登入某個網站市場可以看到“記住密碼”,這通常就是通過在 Cookie 中存入一段辨別使用者身份的資料來實現的。 localStorage

Dubbo深度及結合ZookeeperSSM的RPC實戰

一、SOA 1.SOA概念 2.SOA定位 3.老的專案架構設計 3.1 企業專案不允許所有專案都訪問DB 3.2 開發時DB訪問層程式碼冗餘 4.使用SOA架構 4.1 專門訪問DB服務(專案) 4.2 開發時可以實現DB訪問層和程式碼複用 5.實現SOA的幾種