淺談Web Storage API的使用
一、瀏覽器的本地存儲(chǔ)技術(shù)
除了最早的使用cookie來進(jìn)行本地存儲(chǔ)之外,現(xiàn)代瀏覽器使用Web Storage API來方便的進(jìn)行key/value的存儲(chǔ)。
Web Storage有兩種存儲(chǔ)方式:
1.1、sessionStorage
對(duì)于每一個(gè)訪問源,都會(huì)維持一個(gè)獨(dú)立的存儲(chǔ)區(qū)域。只要瀏覽器不關(guān)閉,這些數(shù)據(jù)都不會(huì)消失。
所以這種存儲(chǔ)叫做session存儲(chǔ)。
注意,這里的session和服務(wù)器端的session的意思是不一樣的,這里的sessionStorage只是本地的存儲(chǔ),并不會(huì)將數(shù)據(jù)傳輸?shù)椒?wù)器端。
sessionStorage的存儲(chǔ)容量要比cookie大得多,可以達(dá)到5MB。
1.2、localStorage
和sessionStorage類似,也是用來做數(shù)據(jù)存儲(chǔ)的,不同的是localStorage存儲(chǔ)的數(shù)據(jù)不會(huì)隨著瀏覽器的關(guān)閉而消失。
我可以通過設(shè)置過期時(shí)間,使用javascript手動(dòng)刪除或者清楚瀏覽器緩存來清除localStorage。
這兩種存儲(chǔ)方式是通過Window.sessionStorage 和 Window.localStorage來使用的。事實(shí)上我們看下Window的定義:
interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandlers, WindowEventHandlers, WindowLocalStorage, WindowOrWorkerGlobalScope, WindowSessionStorage
Window繼承了WindowLocalStorage和WindowSessionStorage,所以我們可以直接從Window來獲取sessionStorage和localStorage。
對(duì)于每一個(gè)origin源來說,Window.sessionStorage 和 Window.localStorage 都會(huì)創(chuàng)建一個(gè)新的Storage對(duì)象,用來進(jìn)行數(shù)據(jù)的讀取。
二、Web Storage相關(guān)接口
和web storage相關(guān)的接口有三個(gè)。第一就是剛剛講到的window。我們可以通過window獲取sessionStorage和localStorage。
第二個(gè)就是Storage對(duì)象,獲取到的兩個(gè)Storage都是Storage對(duì)象。
interface Storage { readonly length: number; clear(): void; getItem(key: string): string | null; key(index: number): string | null; removeItem(key: string): void; setItem(key: string, value: string): void; [name: string]: any; }
我們可以看到Storage對(duì)象為我們提供了很多有用的方法,對(duì)數(shù)據(jù)進(jìn)行存取。
第三個(gè)就是StorageEvent,當(dāng)storage發(fā)現(xiàn)變化的時(shí)候就會(huì)觸發(fā)StorageEvent事件。
三、瀏覽器兼容性
我們用兩張圖來看一下這兩個(gè)storage在不同瀏覽器的兼容性:
Window.localStorage:
Window.sessionStorage:
可以看到,現(xiàn)代瀏覽器基本上都是支持這兩種storage特性的。
如果我們使用的是老式的瀏覽器,比如Internet Explorer 6 ,7 或者其他沒有列出的瀏覽器,我們就需要進(jìn)行檢測(cè),判斷Storage是否被瀏覽器有效的支持。
我們看下怎么做檢測(cè):
function storageAvailable(type) { var storage; try { storage = window[type]; var x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return e instanceof DOMException && ( // everything except Firefox e.code === 22 || // Firefox e.code === 1014 || // test name field too, because code might not be present // everything except Firefox e.name === 'QuotaExceededError' || // Firefox e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && // acknowledge QuotaExceededError only if there's something already stored (storage && storage.length !== 0); } }
其中的type就是localStorage或者sessionStorage,我們通過捕獲異常來判斷是否存在有效的Storge對(duì)象。
看下我們?cè)趺词褂茫?/p>
if (storageAvailable('localStorage')) { // Yippee! We can use localStorage awesomeness } else { // Too bad, no localStorage for us }
四、隱身模式
大多數(shù)現(xiàn)代瀏覽器都支持一種隱身模式,在這種模式下,將不會(huì)存儲(chǔ)瀏覽歷史記錄和Cookie等數(shù)據(jù)隱私選項(xiàng)。
所以這和Web Storage是不兼容的。那么怎么解決這個(gè)問題呢?
不同的瀏覽器可能采用不同的解決辦法。
比如Safari中,隱身模式下Web Storage雖然是可用的,但是不會(huì)存儲(chǔ)任何東西。
也有些瀏覽器會(huì)選擇在瀏覽器關(guān)閉的時(shí)候清空之前的所有存儲(chǔ)。
所以,我們?cè)陂_發(fā)的過程中,一定要注意不同瀏覽器的不同處理方式。
五、使用Web Storage API
對(duì)于Storage對(duì)象,我們可以像普通對(duì)象一樣直接訪問對(duì)象中的屬性,也可以使用Storage.getItem() 和 Storage.setItem() 來訪問和設(shè)置屬性。
注意Storage對(duì)象中的key value都是string類型的,即使你輸入的是integer,也會(huì)被轉(zhuǎn)換成為String。
下面的例子,都可以設(shè)置一個(gè)colorSetting屬性:
localStorage.colorSetting = '#a4509b'; localStorage['colorSetting'] = '#a4509b'; localStorage.setItem('colorSetting', '#a4509b');
雖然三種方式都可以實(shí)現(xiàn)存取的功能,但是我們推薦使用Web Storage API:setItem, getItem, removeItem, key, length等。
除了對(duì)Storage中的值進(jìn)行設(shè)置之外,我們還可以觸發(fā)和監(jiān)聽StorageEvent。
先看一下StorageEvent的定義:
interface StorageEvent extends Event { readonly key: string | null; readonly newValue: string | null; readonly oldValue: string | null; readonly storageArea: Storage | null; readonly url: string; }
每當(dāng)Storage對(duì)象發(fā)送變化的時(shí)候,就出觸發(fā)StorageEvent事件。
注意,如果是sessionStorage的變化,則不會(huì)被觸發(fā)。
如果一個(gè)domain中的某個(gè)頁(yè)面發(fā)生了Storage的變化,那么這個(gè)domain的其他頁(yè)面都會(huì)監(jiān)聽到這個(gè)變化。當(dāng)然,如果是其他domain的話,是監(jiān)聽不到這個(gè)StorageEvent的。
我們可以通過window的addEventListener方法,來添加storage事件,如下所示:
window.addEventListener('storage', function(e) { document.querySelector('.my-key').textContent = e.key; document.querySelector('.my-old').textContent = e.oldValue; document.querySelector('.my-new').textContent = e.newValue; document.querySelector('.my-url').textContent = e.url; document.querySelector('.my-storage').textContent = JSON.stringify(e.storageArea); });
上面的例子中,我們從StorageEvent中獲取了key,oldValue,newValue,url和Storage對(duì)象。
以上就是淺談Web Storage API的使用的詳細(xì)內(nèi)容,更多關(guān)于Web Storage API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Javascript怎樣使用SessionStorage和LocalStorage
- 如何在JavaScript中使用localStorage詳情
- Vue基于localStorage存儲(chǔ)信息代碼實(shí)例
- vue 使用localstorage實(shí)現(xiàn)面包屑的操作
- JS+HTML5本地存儲(chǔ)Localstorage實(shí)現(xiàn)注冊(cè)登錄及驗(yàn)證功能示例
- 使用vuex存儲(chǔ)用戶信息到localStorage的實(shí)例
- JavaScript學(xué)習(xí)教程之cookie與webstorage
- 詳解vue中l(wèi)ocalStorage的使用方法
- vue 界面刷新數(shù)據(jù)被清除 localStorage的使用詳解
- HTML5 WebStorage(HTML5本地存儲(chǔ)技術(shù))
相關(guān)文章
JavaScript實(shí)現(xiàn)頁(yè)面無操作倒計(jì)時(shí)退出
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)頁(yè)面無操作倒計(jì)時(shí)退出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10JS中的算法與數(shù)據(jù)結(jié)構(gòu)之字典(Dictionary)實(shí)例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之字典(Dictionary),結(jié)合實(shí)例形式詳細(xì)分析了javascript數(shù)據(jù)結(jié)構(gòu)中字典的概念、原理、定義與常見使用方法,需要的朋友可以參考下2019-08-08詳解Javascript動(dòng)態(tài)操作CSS
本文我們會(huì)討論如何通過 JavaScript 在運(yùn)行時(shí)操作 CSS,從而動(dòng)態(tài)地更新應(yīng)用到我們的元素上的式樣。本文所用的技術(shù)是我們已經(jīng)看到過的,但在利用 CSS DOM 來進(jìn)行操作的時(shí)候還需要注意幾個(gè)特殊點(diǎn)。2014-12-12使用Github?Actions發(fā)布npm包完整過程詳解
本文包含本地發(fā)布npm包發(fā)布流程,?和?github?action自動(dòng)發(fā)布npm包流程,幫助你更好的發(fā)布自己或公司的npm包,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09新人報(bào)道,發(fā)個(gè)小技巧(js數(shù)組重復(fù)判斷)
js數(shù)組重復(fù)判斷2008-10-10微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法
這篇文章主要為大家詳細(xì)介紹了微信小程序三級(jí)聯(lián)動(dòng)選擇器使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02利用uni-app和uView實(shí)現(xiàn)多圖上傳功能全過程
最近在使用uniapp開發(fā)的微信小程序中使用了圖片上傳功能,下面這篇文章主要給大家介紹了關(guān)于利用uni-app和uView實(shí)現(xiàn)多圖上傳功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03