前面的話
Web存儲最初作為HTML5的一部分被定義成API形式,但是后來被剝離出來作為獨立的一份標(biāo)準(zhǔn)了。Web存儲標(biāo)準(zhǔn)所描述的API包含localStorage對象和sessionStorage對象,這兩個對象實際上是持久化關(guān)聯(lián)數(shù)組,是名值對的映射表,“名”和“值”都是字符串。Web存儲易于使用、支持大容量(但非無限量)數(shù)據(jù)存儲同時兼容當(dāng)前所有主流瀏覽器。本文將詳細(xì)介紹Web Storage
概述
Web Storage的目的是克服由cookie帶來的一些限制,當(dāng)數(shù)據(jù)需要被嚴(yán)格控制在客戶端上時,無須持續(xù)地將數(shù)據(jù)發(fā)回服務(wù)器。Web Storage的兩個主要目標(biāo)是:提供一種在cookie之外存儲會話數(shù)據(jù)的途徑以及提供一種存儲大量可以跨會話存在的數(shù)據(jù)的機制
Web Storage分成兩類:sessionStorage和localStorage。sessionStorage保存的數(shù)據(jù)用于瀏覽器的一次會話,當(dāng)會話結(jié)束(通常是該窗口關(guān)閉),數(shù)據(jù)被清空;localStorage保存的數(shù)據(jù)長期存在,下一次訪問該網(wǎng)站的時候,網(wǎng)頁可以直接讀取以前保存的數(shù)據(jù)。除了保存期限的長短不同,這兩個對象的屬性和方法完全一樣
它們很像cookie機制的強化版,能夠動用大得多的存儲空間。目前,每個域名的存儲上限視瀏覽器而定,Chrome是2.5MB,F(xiàn)irefox和Opera是5MB,IE是10MB。其中,F(xiàn)irefox的存儲空間由一級域名決定,而其他瀏覽器沒有這個限制。也就是說,在Firefox中,a.example.com和b.example.com共享5MB的存儲空間。另外,與Cookie一樣,它們也受同域限制。某個網(wǎng)頁存入的數(shù)據(jù),只有同域下的網(wǎng)頁才能讀取
通過檢查window對象是否包含sessionStorage和localStorage屬性,可以確定瀏覽器是否支持這兩個對象
[注意]IE瀏覽器不支持在本地使用storage
存取數(shù)據(jù)
sessionStorage和localStorage保存的數(shù)據(jù),都以“鍵對”的形式存在。也就是說,每一項數(shù)據(jù)都有一個鍵名和對應(yīng)的值。所有的數(shù)據(jù)都是以文本格式保存
[注意]Storage類型只能存儲字符串。非字符串的數(shù)據(jù)在存儲之前會被轉(zhuǎn)換成字符串
【setItem()】
存入數(shù)據(jù)使用setItem方法。它接受兩個參數(shù),第一個是鍵名,第二個是保存的數(shù)據(jù)
[注意]不同的瀏覽器存入的Storage位置不一樣,不能通用
sessionStorage.setItem("key","value"); localStorage.setItem("key","value");
【getItem()】
讀取數(shù)據(jù)使用getItem方法。它只有一個參數(shù),就是鍵名
var valueSession = sessionStorage.getItem("key"); var valueLocal = localStorage.getItem("key");
除了使用setItem()和getItem()方法之外,還可以使用屬性來存取數(shù)據(jù)
localStorage.setItem("key1","value1"); localStorage.testkey = 'testvalue'; console.log(localStorage.getItem('testkey'));//'testvalue'console.log(localStorage.key1);//'value1'
清除數(shù)據(jù)
【removeItem()】
removeItem()方法用于清除某個鍵名對應(yīng)的數(shù)據(jù)
[注意]清除不存在的鍵名不會報錯,只會靜默失敗
sessionStorage.removeItem('key'); localStorage.removeItem('key');
除了使用removeItem()方法,還可以使用delete操作來清除數(shù)據(jù)
[注意]IE7-瀏覽器不支持delete操作符來清除storage數(shù)據(jù)
localStorage.setItem("key1","value1");delete localStorage.key1; console.log(localStorage.key1);//undefinedconsole.log(localStorage.getItem('key1'));//null
【clear()】
clear方法用于清除所有保存的數(shù)據(jù)
sessionStorage.clear(); localStorage.clear();
遍歷操作
【key()】
key(index)方法返回index位置處的值的名字
sessionStorage.setItem("key1","value1"); sessionStorage.setItem("key2","value2"); console.log(sessionStorage.key(0));//'key1'console.log(sessionStorage.key(1));//'key2'console.log(sessionStorage.key(2));//null
【length】
length屬性返回名值對兒的個數(shù)
console.log(sessionStorage.length);//2
利用length屬性和key()方法,可以遍歷所有的鍵
for(var i = 0; i < localStorage.length; i++){ var key = localStorage.key(i); var value = localStorage.getItem(key); }
還可以使用for-in循環(huán)來迭代
for(var key in localStorage){ var value = localStorage.getItem(key); }
存儲事件
首先,要特別注意的是,該事件只發(fā)生在window對象上,在document對象上觸發(fā)無效,且使用DOM0級、DOM2級事件處理函數(shù)都可以
無論對sessionStorage還是localStorage進行操作,都會觸發(fā)storage事件。當(dāng)通過屬性或setItem()方法保存數(shù)據(jù),使用delete操作符或removeItem()刪除數(shù)據(jù),或者調(diào)用clear()方法時,都會發(fā)生該事件
[注意]只有當(dāng)存儲數(shù)據(jù)真正發(fā)生改變的時候才會觸發(fā)存儲事件。像給已經(jīng)存在的存儲項設(shè)置一個一模一樣的值,抑或是刪除一個本來就不存在的存儲項都是不會觸發(fā)存儲事件的。通過getItem()方法獲取數(shù)據(jù)也不會觸發(fā)該事件
一般地,storage事件不在導(dǎo)致數(shù)據(jù)變化的當(dāng)前頁面觸發(fā)。如果瀏覽器同時打開一個域名下面的多個頁面,當(dāng)其中的一個頁面改變sessionStorage或localStorage的數(shù)據(jù)時,其他所有頁面的storage事件會被觸發(fā),而原始頁面并不觸發(fā)storage事件??梢酝ㄟ^這種機制,實現(xiàn)多個窗口之間的通信
[注意]IE8-瀏覽器不支持storage事件,IE9+瀏覽器與其他標(biāo)準(zhǔn)瀏覽器有所不同,無論數(shù)據(jù)真實值是否變化,只要對數(shù)據(jù)進行設(shè)置或刪除,都會觸發(fā)觸發(fā)該事件,且原始頁面和同一域名下的其他頁面都會觸發(fā)
這個事件的event對象有以下屬性
url:觸發(fā)事件的鏈接地址 key:設(shè)置或者刪除的鍵名 newvalue:如果是設(shè)置值,則是新值;如果是刪除鍵,則是null oldValue:鍵被更改之前的值 storageArea:返回觸發(fā)事件的對象
改變輸入框中的值,再點擊按鈕,會觸發(fā)storage事件按鈕
<!-- 其他頁面 -->
<div id="result"></div><script>window.onstorage = function(e){ e = e || event; result.innerHTML = 'key: ' + e.key + '<br>oldValue: ' + e.oldValue + '<br>newValue: ' + e.newValue + '<br>url: ' + e.url + '<br>storageArea: ' + e.storageArea; }</script>
原始頁面:
其他頁面:
好的代碼像粥一樣,都是用時間熬出來的
標(biāo)簽: javascript總結(jié)