最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Web Storage API的使用

 更新時(shí)間:2021年06月23日 11:00:49   作者:flydean  
Web Storage為瀏覽器提供了方便的key value存儲,是一種比cookie更加方便簡潔的存儲方式。也是諸多客戶端存儲方式中非常常見的一種

一、瀏覽器的本地存儲技術(shù)

除了最早的使用cookie來進(jìn)行本地存儲之外,現(xiàn)代瀏覽器使用Web Storage API來方便的進(jìn)行key/value的存儲。

Web Storage有兩種存儲方式:

1.1、sessionStorage

對于每一個(gè)訪問源,都會(huì)維持一個(gè)獨(dú)立的存儲區(qū)域。只要瀏覽器不關(guān)閉,這些數(shù)據(jù)都不會(huì)消失。

所以這種存儲叫做session存儲。

注意,這里的session和服務(wù)器端的session的意思是不一樣的,這里的sessionStorage只是本地的存儲,并不會(huì)將數(shù)據(jù)傳輸?shù)椒?wù)器端。

sessionStorage的存儲容量要比cookie大得多,可以達(dá)到5MB。

1.2、localStorage

和sessionStorage類似,也是用來做數(shù)據(jù)存儲的,不同的是localStorage存儲的數(shù)據(jù)不會(huì)隨著瀏覽器的關(guān)閉而消失。

我可以通過設(shè)置過期時(shí)間,使用javascript手動(dòng)刪除或者清楚瀏覽器緩存來清除localStorage。

這兩種存儲方式是通過Window.sessionStorage 和 Window.localStorage來使用的。事實(shí)上我們看下Window的定義:

interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandlers, WindowEventHandlers, WindowLocalStorage, WindowOrWorkerGlobalScope, WindowSessionStorage 

Window繼承了WindowLocalStorage和WindowSessionStorage,所以我們可以直接從Window來獲取sessionStorage和localStorage。

對于每一個(gè)origin源來說,Window.sessionStorage 和 Window.localStorage 都會(huì)創(chuàng)建一個(gè)新的Storage對象,用來進(jìn)行數(shù)據(jù)的讀取。

二、Web Storage相關(guān)接口

和web storage相關(guān)的接口有三個(gè)。第一就是剛剛講到的window。我們可以通過window獲取sessionStorage和localStorage。

第二個(gè)就是Storage對象,獲取到的兩個(gè)Storage都是Storage對象。

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對象為我們提供了很多有用的方法,對數(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)行檢測,判斷Storage是否被瀏覽器有效的支持。

我們看下怎么做檢測:

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對象。

看下我們怎么使用:

if (storageAvailable('localStorage')) {
  // Yippee! We can use localStorage awesomeness
}
else {
  // Too bad, no localStorage for us
}

四、隱身模式

大多數(shù)現(xiàn)代瀏覽器都支持一種隱身模式,在這種模式下,將不會(huì)存儲瀏覽歷史記錄和Cookie等數(shù)據(jù)隱私選項(xiàng)。

所以這和Web Storage是不兼容的。那么怎么解決這個(gè)問題呢?

不同的瀏覽器可能采用不同的解決辦法。

比如Safari中,隱身模式下Web Storage雖然是可用的,但是不會(huì)存儲任何東西。

也有些瀏覽器會(huì)選擇在瀏覽器關(guān)閉的時(shí)候清空之前的所有存儲。

所以,我們在開發(fā)的過程中,一定要注意不同瀏覽器的不同處理方式。

五、使用Web Storage API

對于Storage對象,我們可以像普通對象一樣直接訪問對象中的屬性,也可以使用Storage.getItem() 和 Storage.setItem() 來訪問和設(shè)置屬性。

注意Storage對象中的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等。

除了對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對象發(fā)送變化的時(shí)候,就出觸發(fā)StorageEvent事件。

注意,如果是sessionStorage的變化,則不會(huì)被觸發(fā)。

如果一個(gè)domain中的某個(gè)頁面發(fā)生了Storage的變化,那么這個(gè)domain的其他頁面都會(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對象。

以上就是淺談Web Storage API的使用的詳細(xì)內(nèi)容,更多關(guān)于Web Storage API的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 編寫高性能Javascript代碼的N條建議

    編寫高性能Javascript代碼的N條建議

    JavaScript代碼在web應(yīng)用程序中經(jīng)常用到,但是很多開發(fā)者忽視了一些性能方面的知識,如何編寫高性能javascript代碼呢?接下來,小編跟大家一起學(xué)習(xí)
    2015-10-10
  • 微信小程序基礎(chǔ)教程之echart的使用

    微信小程序基礎(chǔ)教程之echart的使用

    簡單的使用echarts不難,但是在小程序里用echarts可能有些理不清。所以這篇文章主要給大家介紹了關(guān)于微信小程序基礎(chǔ)教程之echart使用的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 理解JavaScript變量作用域更輕松

    理解JavaScript變量作用域更輕松

    變量作用域是每門編程語言都會(huì)涉及的話題,也是作為一名程序員必需掌握的知識點(diǎn),能深入掌握變量作用域更有助于你編寫穩(wěn)定的程序。
    2009-10-10
  • javascript 方法一些使用方法

    javascript 方法一些使用方法

    javascript 方法一些使用方法,注意看下他的函數(shù)。
    2009-05-05
  • JS解決iframe之間通信和自適應(yīng)高度的問題

    JS解決iframe之間通信和自適應(yīng)高度的問題

    關(guān)于iframe之間的通信問題與自適應(yīng)高度問題網(wǎng)上有很多,那么這篇文章小編也和大家一起來談?wù)刬frame之間通信問題及iframe自適應(yīng)高度問題,有需要的可以參考借鑒。
    2016-08-08
  • JavaScript實(shí)現(xiàn)消息框示例

    JavaScript實(shí)現(xiàn)消息框示例

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)消息框示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 微信小程序如何保證每個(gè)頁面都已經(jīng)登陸詳解

    微信小程序如何保證每個(gè)頁面都已經(jīng)登陸詳解

    前段時(shí)間發(fā)布了一個(gè)微信小程序的簡單登錄,但遇到一個(gè)問題,怎么確保用戶每個(gè)頁面都已經(jīng)登陸了呢,這篇文章主要給大家介紹了關(guān)于微信小程序如何保證每個(gè)頁面都已經(jīng)登陸的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】

    這篇文章主要介紹了JavaScript 正則應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript 正則表達(dá)式模式、欲查、反向引用等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • Swiper.js實(shí)現(xiàn)移動(dòng)端元素左右滑動(dòng)

    Swiper.js實(shí)現(xiàn)移動(dòng)端元素左右滑動(dòng)

    這篇文章主要為大家詳細(xì)介紹了Swiper.js實(shí)現(xiàn)移動(dòng)端元素左右滑動(dòng) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 談?wù)凧avaScript中瀏覽器兼容問題的寫法小議

    談?wù)凧avaScript中瀏覽器兼容問題的寫法小議

    本篇文章主要介紹了JavaScript中瀏覽器兼容問題的寫法小議,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12

最新評論

光泽县| 江口县| 左云县| 丽水市| 嘉峪关市| 合水县| 遵义市| 府谷县| 怀集县| 海淀区| 鄂托克旗| 庆元县| 苏尼特右旗| 小金县| 安宁市| 宜丰县| 霍林郭勒市| 武宁县| 上高县| 清河县| 元谋县| 永城市| 德庆县| 南宁市| 茌平县| 南城县| 稻城县| 金寨县| 沙田区| 延寿县| 荆州市| 河曲县| 环江| 凯里市| 曲沃县| 电白县| 剑川县| 华坪县| 朝阳县| 蒙阴县| 新宁县|