JavaScript使用localStorage存儲(chǔ)數(shù)據(jù)
背景
以前js都是 Session 和 Cookie 來存儲(chǔ)信息,仿佛我還停留在那個(gè)時(shí)候,一問同事有沒有新的solution,才知道現(xiàn)在已經(jīng)有 HTML5 localStorage 本地存儲(chǔ) 這個(gè)東西,可以在瀏覽器端儲(chǔ)存數(shù)據(jù)。
記得最早的Cookies只能存很小的東西,4KB的樣子,并且安全性很差,在IE6時(shí)代一個(gè)域名也只能二十個(gè)Cookies吧,限制挺大,當(dāng)然IE還有userData的東西,沒什么用。Flash也帶了一個(gè)Storage,相對(duì)比較大,空間是Cookie的25倍左右,當(dāng)時(shí)現(xiàn)在也廢棄Flash了。
到了H5時(shí)代,就統(tǒng)一了,LocalStorage一統(tǒng)天下。官方建議是每個(gè)網(wǎng)站 5MB ,非常大了,雖然瀏覽器設(shè)置會(huì)有差異,但是一般就存些JSON或者字符串或者緩存來說,足夠了。
HTML5 LocalStorage 本地存儲(chǔ)
- sessionStorage:保存的數(shù)據(jù)用于瀏覽器的一次會(huì)話,當(dāng)會(huì)話結(jié)束(通常是該窗口關(guān)閉),數(shù)據(jù)被清空;
- localStorage:保存的數(shù)據(jù)長(zhǎng)期存在,下一次訪問該網(wǎng)站的時(shí)候,網(wǎng)頁可以直接讀取以前保存的數(shù)據(jù)。除了保存期限的長(zhǎng)短不同,這兩個(gè)對(duì)象的屬性和方法完全一樣。
它們很像cookie機(jī)制的強(qiáng)化版,雖然能夠動(dòng)用大得多的存儲(chǔ)空間。但是,與cookie一樣,它們也受同域限制。某個(gè)網(wǎng)頁存入的數(shù)據(jù),只有同域下的網(wǎng)頁才能讀取。
通過檢查window對(duì)象是否包含 sessionStorage 和 localStorage 屬性,可以確定瀏覽器是否支持這兩個(gè)對(duì)象。
function checkStorageSupport() { // sessionStorage if (window.sessionStorage) { return true; } else { return false; } // localStorage if (window.localStorage) { return true; } else { return false; } }
Storage 操作
sessionStorage 和 localStorage 保存的數(shù)據(jù),都以 “Key-Value鍵值對(duì)” 的形式存在。也就是說,每一項(xiàng)數(shù)據(jù)都有一個(gè)鍵名和對(duì)應(yīng)的值。所有的數(shù)據(jù)都是以文本格式保存。
//sessionStorage 操作 sessionStorage.setItem("key","value"); // setItem方法,存儲(chǔ)變量名為key,值為value的變量 var valueSession = sessionStorage.getItem("key"); // getItem方法,讀取存儲(chǔ)變量名為key的值 sessionStorage.removeItem('key'); // removeItem方法,刪除變量名為key的存儲(chǔ)變量 sessionStorage.clear(); // clear方法,清除所有保存數(shù)據(jù) //localStorage 操作 localStorage.setItem("key","value"); // 存儲(chǔ)變量名為key,值為value的變量 localStorage.key = "value" // 同setItem方法,存儲(chǔ)數(shù)據(jù) var valueLocal = localStorage.getItem("key"); // 讀取存儲(chǔ)變量名為key的值 var valueLocal = localStorage.key; // 同getItem,讀取數(shù)據(jù) localStorage.removeItem('key'); // removeItem方法,刪除變量名為key的存儲(chǔ)變量 localStorage.clear(); // clear方法,清除所有保存的數(shù)據(jù) // 利用length屬性和key方法,遍歷所有的數(shù)據(jù) for(var i = 0; i < localStorage.length; i++) { console.log(localStorage.key(i)); } // 存儲(chǔ) localStorage 數(shù)據(jù)為 Json 格式 value = JSON.stringify(jsonValue); // 將 JSON 對(duì)象 jsonValue 轉(zhuǎn)化成字符串 localStorage.setItem("key", value); // 用 localStorage 保存轉(zhuǎn)化好的的字符串 // 讀取 localStorage 中 Json 格式數(shù)據(jù) var value = localStorage.getItem("key"); // 取回 value 變量 jsonValue = JSON.parse(value); // 把字符串轉(zhuǎn)換成 JSON 對(duì)象
Storage 事件
當(dāng)儲(chǔ)存的數(shù)據(jù)發(fā)生變化時(shí),會(huì)觸發(fā) storage 事件。我們可以指定這個(gè)事件的回調(diào)函數(shù)。
window.addEventListener("storage",onStorageChange);
回調(diào)函數(shù)接受一個(gè)event對(duì)象作為參數(shù)。這個(gè)event對(duì)象的key屬性,保存發(fā)生變化的鍵名。
function onStorageChange(e) { console.log(e.key); }
除了key屬性,event對(duì)象的屬性還有三個(gè):
- oldValue:更新前的值。如果該鍵為新增加,則這個(gè)屬性為null。
- newValue:更新后的值。如果該鍵被刪除,則這個(gè)屬性為null。
- url:原始觸發(fā)storage事件的那個(gè)網(wǎng)頁的網(wǎng)址。
!!! 特別注意的是,該事件不在導(dǎo)致數(shù)據(jù)變化的當(dāng)前頁面觸發(fā)。如果瀏覽器同時(shí)打開一個(gè)域名下面的多個(gè)頁面,當(dāng)其中的一個(gè)頁面改變sessionStorage或localStorage的數(shù)據(jù)時(shí),其他所有頁面的storage事件會(huì)被觸發(fā),而原始頁面并不觸發(fā)storage事件??梢酝ㄟ^這種機(jī)制,實(shí)現(xiàn)多個(gè)窗口之間的通信。所有瀏覽器之中,只有IE瀏覽器除外,它會(huì)在所有頁面觸發(fā)storage事件。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用JavaScrpt實(shí)現(xiàn)文件夾簡(jiǎn)單輕松加密的實(shí)現(xiàn)方法圖文
電腦里經(jīng)常會(huì)存儲(chǔ)著重要文件,這些文件需要進(jìn)行加密,有許多方法來實(shí)現(xiàn)。但如果想對(duì)一個(gè)文件夾里的所有文件都進(jìn)行加密,數(shù)量少還可以,要是數(shù)量多豈不是得把人累死?2008-09-09JS去除字符串的空格增強(qiáng)版(可以去除中間的空格)
之前發(fā)了不少了去除字符串空格的代碼,但都是去除開始與結(jié)尾的,下面的這段代碼可以去除中間的。2009-08-08JavaScript NaN和Infinity特殊值 [譯]
本文要講的是兩個(gè)特殊值,NaN和Infinity,返回這兩個(gè)值的操作通常都應(yīng)該返回正常的數(shù)字2012-09-09javascript基于定時(shí)器實(shí)現(xiàn)進(jìn)度條功能實(shí)例
這篇文章主要介紹了javascript基于定時(shí)器實(shí)現(xiàn)進(jìn)度條功能,簡(jiǎn)單分析了javascript定時(shí)器的功能、使用方法并給出了基于定時(shí)器實(shí)現(xiàn)的進(jìn)度條功能實(shí)例,需要的朋友可以參考下2017-10-10通過javascript實(shí)現(xiàn)段落的收縮與展開
這篇文章主要介紹了通過javascript實(shí)現(xiàn)段落的收縮與展開,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06