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、相容性
可以看到,除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);
};
不難看出其中包含以下屬性:
- 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
相關推薦
localStorage、sessionStorage詳解,以及storage事件使用
有關localStorage和sessionStorage的特性。 localStorage本身帶有方法有 新增鍵值對:localStorage.setItem(key,value),如果key存在時,更新value。 獲取鍵值:localStorage.getItem(key),如果key不存在返回
JVM效能調優監控工具jps、jstack、jmap、jhat、jstat、hprof使用詳解,以及例子
現實企業級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
sessionStorage、localStorage與cookie、session詳解
cookie和session的區別 由於HTTP是一種無狀態的協議,資料交換完畢後會關閉連線,為了分辨一個請求是誰發起的,以免在同一個網站每開啟一個頁面都需要重新登入,引入了Session和Cookie兩個機制。 Cookie和Session都是用來跟蹤瀏覽器使用者身份的方式。 1、
Java中的集合詳解,結合 ArrayList、HashSet 的區別以及HashCode的作用。
Java中的集合: (1)Collection List(有序,可重複) ArrayList
LocalStorage、SessionStorage使用詳解
一、什麼是localStorage、sessionStorage 在HTML5中,新加入了一個localStorage特性,這個特性主要是用來作為本地儲存來使用的,解決了cookie儲存空間不足的問題(cookie中每條cookie的儲存空間為4k),localStorage中一般瀏覽器支援的是5M大小,
#21 在Linux裏進程管理詳解,與pstree、ps、pgrep、pkill、pidof、top命令的應用
在linux裏進程管理詳解 與pstree、ps、pgrep、pkill、pidof、top命令的應用 進程管理: 所謂進程:process,一個活動的程序的實體的副本; 生命周期; 可能包含一個或多個執行流; 創建進程: 每個進程的組織結構是一致的: 內核在正常啟動並且全
【我的Linux,我做主】Linux系統文件操作之cp、rm、mv詳解
Linux基礎知識 系統運維 對文本文件的操作非常基礎而且和重要,掌握它們後操作文本你會更加得心應手。要復制文件,請使用cp(copy)這個命令,cp這個命令的用途可多了,除了單純的復制之外,還可以建立建立快捷方式,對比兩個文件的新舊程度從而決定是否更新,以及復制整個目錄下的文件等功能。至於移動目錄和
學機器學習,不會資料處理怎麼行?—— 二、Pandas詳解
在上篇文章學機器學習,不會資料處理怎麼行?—— 一、NumPy詳解中,介紹了NumPy的一些基本內容,以及使用方法,在這篇文章中,將接著介紹另一模組——Pandas。(本文所用程式碼在這裡) Pandas資料結構介紹 大家應該都聽過表結構,但是,如果讓你自己來實現這麼一個結構,並且能對其進行資料處理,能實
Js中localStorage、sessionStorage以及Cookie介紹
---恢復內容開始---基本概念 Cookie Cookie 是小甜餅的意思。顧名思義,cookie 確實非常小,它的大小限制為4KB左右。它的主要用途有儲存登入資訊,比如你登入某個網站市場可以看到“記住密碼”,這通常就是通過在 Cookie 中存入一段辨別使用者身份的資料來實現的。 localStorage
Dubbo深度詳解,及結合Zookeeper、SSM的RPC實戰
一、SOA 1.SOA概念 2.SOA定位 3.老的專案架構設計 3.1 企業專案不允許所有專案都訪問DB 3.2 開發時DB訪問層程式碼冗餘 4.使用SOA架構 4.1 專門訪問DB服務(專案) 4.2 開發時可以實現DB訪問層和程式碼複用 5.實現SOA的幾種