精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊常見的瀏覽器數據存儲方案

系統 瀏覽器
無論哪種方式,將這些信息保存在客戶端可以減少額外且不必要的服務器調用,并幫助提供離線支持。不過,需要注意,由于實現差異,瀏覽器存儲機制在不同瀏覽器中的行為可能會有所不同。除此之外,許多瀏覽器已刪除對 Web SQL 的支持,建議將現有用法遷移到 IndexedDB。

大家好,CUGGZ。

今天來分享常見的瀏覽器數據存儲方案:localStorage、sessionStorage、IndexedDB、Cookies。

1. 概述

現代瀏覽器中提供了多種存儲機制,打開瀏覽器的控制臺(Mac 可以使用 Command + Option + J 快捷鍵,Windows  可以使用 Control + Shift + J 快捷鍵)。選擇 Application 選項卡,可以在 Storage中 看到 Local Storage、Session Storage、IndexedDB、Web SQL、Cookies 等:

圖片

那數據存儲在瀏覽器中有什么使用場景呢?在以下情況下,將數據存儲在瀏覽器中成為更可行的選擇:

  • 在瀏覽器存儲中保存應用狀態,比如保持用戶偏好(用戶特定的設置,例如亮模式或暗模式、字體大小等);
  • 創建離線工作的漸進式 Web 應用,除了初始下載和更新之外沒有服務器端要求;
  • 緩存靜態應用資源,如 HTML、CSS、JS 和圖像等;
  • 保存上一個瀏覽會話中的數據,例如存儲上一個會話中的購物車內容,待辦事項列表中的項目,記住用戶是否以前登錄過等。

無論哪種方式,將這些信息保存在客戶端可以減少額外且不必要的服務器調用,并幫助提供離線支持。不過,需要注意,由于實現差異,瀏覽器存儲機制在不同瀏覽器中的行為可能會有所不同。除此之外,許多瀏覽器已刪除對 Web SQL 的支持,建議將現有用法遷移到 IndexedDB。

所以下面我們將介紹 Local Storage、Session Storage、IndexedDB、Cookies 的使用方式、使用場景以及它們之間的區別。

2. Web Storage

(1)概述

HTML5 引入了 Web Storage,這使得在瀏覽器中存儲和檢索數據變得更加容易。Web Storage API 為客戶端瀏覽器提供了安全存儲和輕松訪問鍵值對的機制。Web Storage 提供了兩個 API 來獲取和設置純字符串的鍵值對:

  • localStorage:用于存儲持久數據,除非用戶手動將其從瀏覽器中刪除,否則數據將終身存儲。即使用戶關閉窗口或選項卡,它也不會過期;
  • sessionStorage:用于存儲臨時會話數據,頁面重新加載后仍然存在,關閉瀏覽器選項卡時數據丟失。

(2)方法和屬性

Web Storage API 由 4 個方法 setItem()、getItem()、removeItem() 、clear()、key()和一個 length 屬性組成,以 localStorage 為例:

  • setItem()? :用于存儲數據,它有兩個參數,即key和value?。使用形式:localStorage.setItem(key, value);
  • getItem()?:用于檢索數據,它接受一個參數 key,即需要訪問其值的鍵。使用形式:localStorage.getItem(key);
  • removeItem()?:用于刪除數據,它接受一個參數 key,即需要刪除其值的鍵。使用形式:localStorage.removeItem(key);
  • clear()? :用于清除其中存儲的所有數據,使用形式:localStorage.clear();
  • key():該方法用于獲取 localStorage 中數據的所有key,它接受一個數字作為參數,該數字可以是 localStorage 項的索引位置。

console.log(typeof window.localStorage) // Object

// 存儲數據
localStorage.setItem("colorMode", "dark")
localStorage.setItem("username", "zhangsan")
localStorage.setItem("favColor", "green")

console.log(localStorage.length) // 3

// 檢索數據
console.log(localStorage.getItem("colorMode")) // dark

// 移除數據
localStorage.removeItem("colorMode")
console.log(localStorage.length) // 2
console.log(localStorage.getItem("colorMode")) // null

// 檢索鍵名
window.localStorage.key(0); // favColor

// 清空本地存儲
localStorage.clear()
console.log(localStorage.length) // 0

localStorage 和 sessionStorage 都非常適合緩存非敏感應用數據。可以在需要存儲少量簡單值并不經常訪問它們是使用它們。它們本質上都是同步的,并且會阻塞主 UI 線程,所以應該謹慎使用。

(3)存儲事件

我們可以在瀏覽器上監聽 localStorage 和 sessionStorage 的存儲變化。storage 事件在創建、刪除或更新項目時觸發。偵聽器函數在事件中傳遞,具有以下屬性:

  • newValue:當在存儲中創建或更新項目時傳遞給 setItem() 的值。當從存儲中刪除項目時,此值設置為 null。
  • oldValue:創建新項目時,如果該鍵存在于存儲中,則該項目的先前的值。
  • key:正在更改的項目的鍵,如果調用 .clear(),則值為 null。
  • url:執行存儲操作的 URL。
  • storageArea:執行操作的存儲對象(localStorage 或 sessionStorage)。

通常,我們可以使用 window.addEventListener("storage", func) 或使用 onstorage 屬性(如 window.onstorage = func)來監聽 storage 事件:

window.addEventListener('storage', e => {
console.log(e.key);
console.log(e.oldValu);
console.log(e.newValue);
});

window.onstorage = e {
console.log(e.key);
console.log(e.oldValu);
console.log(e.newValue);
});

注意,該功能不會在發生更改的同一瀏覽器選項卡上觸發,而是由同一域的其他打開的選項卡或窗口觸發。此功能用于同步同一域的所有瀏覽器選項卡/窗口上的數據。因此,要對此進行測試,需要打開同一域的另一個選項卡。

(4)存儲限制

localStorage 和 sessionStorage 只能存儲 5 MB 的數據,因此需要確保存儲的數據不會超過此限制。

localStorage.setItem('a', Array(1024 * 1024 * 5).join('a'))
localStorage.setItem('b', 'a')

// Uncaught DOMException: Failed to execute 'setItem' on 'Storage':

在上面的例子中,收到了一個錯誤,首先創建了一個5MB的大字符串,當再添加其他數據時就報錯了。

另外,localStorage 和 sessionStorage 只接受字符串。可以通過 JSON.stringify 和 JSON.parse 來解決這個問題:

const user = {
name : "zhangsan",
age : 28,
gender : "male",
profession : "lawyer"
};

localStorage.setItem("user", JSON.stringify(user));
localStorage.getItem("user"); // '{"name":"zhangsan","age":28,"gender":"male","profession":"lawyer"}'
JSON.parse(localStorage.getItem("user")) // {name: 'zhangsan', age: 28, gender: 'male', profession: 'lawyer'}

如果我們直接將一個對象存儲在 localStorage 中,那將會在存儲之前進行隱式類型轉換,將對象轉換為字符串,再進行存儲:

const user = {
name : "zhangsan",
age : 28,
gender : "male",
profession : "lawyer"
};

localStorage.setItem("user", user);
localStorage.getItem("user"); // '[object Object]'

Web Storage 使用了同源策略,也就是說,存儲的數據只能在同一來源上可用。如果域和子域相同,則可以從不同的選項卡訪問 localStorage 數據,而無法訪問 sessionStorage 數據,即使它是完全相同的頁面。

另外:

  • 無法在 web worker 或 service worker 中訪問 Web Storage;
  • 如果瀏覽器設置為隱私模式,將無法讀取到 Web Storage;
  • Web Storage 很容易被 XSS 攻擊,敏感信息不應存儲在本地存儲中;
  • 它是同步的,這意味著所有操作都是一次一個。對于復雜應用,它會減慢應用的運行時間。

(5)示例

下面來看一個使用 localStorage 的簡單示例,使用 localStorage 來存儲用戶偏好:

<input type="checkbox" id="darkTheme" name="darkTheme" onclick='onChange(this);'>
<label for="darkTheme">黑暗模式</label><br>
html {
background: white;
}

.dark {
background: black;
color: white;
}
function toggle(on) {
if (on) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
}

function save(on) {
localStorage.setItem('darkTheme', on.toString());
}

function load() {
return localStorage.getItem('darkTheme') === 'true';
}

function onChange(checkbox) {
const value = checkbox.checked;
toggle(value);
save(value);
}

const initialValue = load();
toggle(initialValue);
document.querySelector('#darkTheme').checked = initialValue;

這里的代碼很簡單,頁面上有一個單選框,選中按鈕時將頁面切換為黑暗模式,并將這個配置存儲在 localStorage 中。當下一次再初始頁面時,獲取 localStorage 中的主題設置。

3. Cookie

(1)Cookie 概述

Cookie 主要用于身份驗證和用戶數據持久性。Cookie 與請求一起發送到服務器,并在響應時發送到客戶端;因此,cookies 數據在每次請求時都會與服務器交換。服務器可以使用 cookie 數據向用戶發送個性化內容。嚴格來說,cookie 并不是客戶端存儲方式,因為服務器和瀏覽器都可以修改數據。它是唯一可以在一段時間后自動使數據過期的方式。

每個 HTTP 請求和響應都會發送 cookie 數據。存儲過多的數據會使 HTTP 請求更加冗長,從而使應用比預期更慢:

瀏覽器限制 cookie 的大小最大為4kb,特定域允許的 cookie 數量為 20 個,并且只能包含字符串;

cookie 的操作是同步的;

不能通過 web workers 來訪問,但可以通過全局 window 對象訪問。

Cookie 通常用于會話管理、個性化以及跨網站跟蹤用戶行為。我們可以通過服務端和客戶端設置和訪問 cookie。Cookie 還具有各種屬性,這些屬性決定了在何處以及如何訪問和修改它們,

Cookie 分為兩種類型:

會話 Cookie:沒有指定 Expires 或 Max-Age 等屬性,因此在關閉瀏覽器時會被刪除;

持久性 Cookie:指定 Expires 或 Max-Age 屬性。這些 cookie 在關閉瀏覽器時不會過期,但會在特定日期 (Expires) 或時間長度 (Max-Age) 后過期。

(2)Cookie 操作

下面先來看看如何訪問和操作客戶端和服務器上的 cookie。

① 客戶端(瀏覽器)

客戶端 JavaScript 可以通過 document.cookie 來讀取當前位置可訪問的所有 cookie。它提供了一個字符串,其中包含一個以分號分隔的 cookie 列表,使用 key=value 格式。

document.cookie;

圖片

可以看到,在語雀主頁中獲取 cookie,結果中包含了登錄的 cookie、語言、當前主題等。

同樣,可以使用 document.cookie 來設置 cookie 的值,設置cookie也是用key=value格式的字符串,屬性用分號隔開:

document.cookie = "hello=world; domain=example.com; Secure";

這里用到了兩個屬性 SameSite 和 Secure,下面會介紹。如果已經存在同名的 cookie 屬性,就會更新已有的屬性值,如果不存在,就會創建一個新的 key=value。

如果需要經常在客戶端處理 Cookie,建議使用像 js-cookie 這樣的庫來處理客戶端 cookie:

Cookies.set('hello', 'world', { domain: 'example.com', secure: true });
Cookies.get('hello'); // -> world

這樣不僅為 cookie 上的 CRUD 操作提供了一個干凈的 API,而且還支持 TypeScript,從而幫助避免屬性的拼寫錯誤。

② 服務端(Node.js)

服務端可以通過 HTTP 請求的請求頭和響應頭來訪問和修改 cookie。每當瀏覽器向服務端發送 HTTP 請求時,它都會使用 cookie 頭將所有相關 cookie 都附加到該站點。請求標頭是一個分號分隔的字符串。

圖片

這樣就可以從請求頭中讀取這些 cookie。如果在服務端使用 Node.js,可以像下面這樣從請求對象中讀取它們,將獲得以分號分隔的 key=value 對:

http.createServer(function (request, response) {
const cookies = request.headers.cookie;
// "cookie1=value1; cookie2=value2"
...
}).listen(8124);

如果想要設置 cookie,可以在響應頭中添加 Set-Cookie 頭,其中 cookie 采用 key=value 的格式,屬性用分號分隔:

response.writeHead(200, {
'Set-Cookie': 'mycookie=test; domain=example.com; Secure'
});

通常我們不會直接編寫 Node.js,而是與 ExpressJS 這樣的 Node.js 框架一起使用。使用 Express 可以更輕松地訪問和修改 cookie。只需添加一個像 cookie-parser 這樣的中間件,就可以通過 req.cookies 以 JavaScript 對象的形式獲得所有的 cookie。還可以使用 Express 內置的 res.cookie() 方法來設置 cookie:

const express = require('express')
const cookieParser = require('cookie-parser')

const app = express()
app.use(cookieParser())

app.get('/', function (req, res) {
console.log('Cookies: ', req.cookies)
// Cookies: { cookie1: 'value1', cookie2: 'value2' }

res.cookie('name', 'tobi', { domain: 'example.com', secure: true })
})

app.listen(8080)

(3)Cookie 屬性

下面來深入了解 cookie 的屬性。除了名稱和值之外,cookie 還具有控制很多方面的屬性,包括安全方面、生命周期以及它們在瀏覽器中的訪問位置和方式等。

① Domain

Domain 屬性告訴瀏覽器允許哪些主機訪問 cookie。如果未指定,則默認為設置 cookie 的同一主機。因此,當使用客戶端 JavaScript 訪問 cookie 時,只能訪問與 URL 域相同的 cookie。同樣,只有與 HTTP 請求的域共享相同域的 cookie 可以與請求頭一起發送到服務端。

注意,擁有此屬性并不意味著可以為任何域設置 cookie,因為這顯然會帶來巨大的安全風險。此屬性存在的唯一原因就是減少域的限制并使 cookie 在子域上可訪問。例如,如果當前的域是 abc.xyz.com,并且在設置 cookie 時如果不指定 Domain 屬性,則默認為 abc.xyz.com,并且 cookie 將僅限于該域。但是,可能希望相同的 cookie 也可用于其他子域,因此可以設置 Domain=xyz.com 以使其可用于其他子域,如 def.xyz.com 和主域 xyz.com。

圖片

② Path

此屬性指定訪問 cookie 必須存在的請求 URL 中的路徑。除了將 cookie 限制到域之外,還可以通過路徑來限制它。路徑屬性為 Path=/store 的 cookie 只能在路徑 /store 及其子路徑 /store/cart、/store/gadgets 等上訪問。

③ Expires/Max-size

該屬性用來設置 cookie 的過期時間。若設置其值為一個時間,那么當到達此時間后,cookie 就會失效。不設置的話默認值是 Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標簽頁) 后,cookie 就會失效。

除此之外,它還可以通過將過期日期設置為過去來刪除 cookie。

④ Secure

具有 Secure 屬性的 cookie 僅可以通過安全的 HTTPS 協議發送到服務器,而不會通過 HTTP 協議。這有助于通過使 cookie 無法通過不安全的連接訪問來防止中間人攻擊。除非網站實用不安全的 HTTP 連接,否則應該始終將此屬性與所有 cookie 一起使用。

⑤ HTTPOnly

此屬性使 cookie 只能通過服務端訪問。因此,只有服務斷可以通過響應頭設置它們,然后瀏覽器會將它們與每個后續請求的頭一起發送到服務器,并且它們將無法通過客戶端 JavaScript 訪問。

圖片

這可以在一定程度上幫助保護帶有敏感信息(如身份驗證 token)的 cookie 免受 XSS 攻擊,因為任何客戶端腳本都無法讀取 cookie。但這并不意味著可以完全免受 XSS 攻擊。因為,如果攻擊者可以在網站上執行第三方腳本,那可能無法訪問 cookie,相反,他們可以直接向服務端執行相關的 API 請求。因此,想象一下用戶訪問了一個頁面,黑客在網站上注入了惡意腳本。他們可以使用該腳本執行任何 API,并在他們不知道的情況下代表用戶執行操作。

(4)Cookie 工具庫

①  Js Cookie(JavaScript)

Js Cookie 是一個簡單、輕量級的 JavaScript API,用于處理瀏覽器 cookie。其支持 AMD、CommonJS 和 ES 模塊、沒有依賴關系、經過徹底測試、支持自定義編碼和解碼、通用瀏覽器支持。

安裝:

npm i js-cookie

使用:

// 設置 Cookie
Cookies.set('cookie-name', 'cookie-value', { expires: 14})

// 讀取 Cookie
Cookies.get('cookie-name')

// 刪除 Cookie
Cookies.remove('cookie-name')

② React Cookie(React)

React Cookie 是一個專門用于 React 的 cookie 庫,它繼承了 Universal Cookie 庫的功能。它提供了一組組件和 Hooks,使 React 中的 cookie 處理非常簡單。如果使用的是 React 16.8+ 版本,就可以使用 hooks 來處理 cookie。否則,必須使用其提供的組件。

安裝:

npm i react-cookie

React Cookie 提供了 3 個 Hook,分別是 cookie、setCookie 和 removeCookie??梢允褂眠@些 Hook 來處理 React 應用中的 cookie。

const [cookies, setCookie, removeCookie] = useCookies(['cookie-name']);
// 設置 Cookie
setCookie(name, value, [options]);
// 刪除 Cookie
removeCookie(name, [options])

③ Cookies(Node.js)

Cookies 是用于 HTTP cookie 配置的流行 NodeJS 模塊之一。可以輕松地將其與內置的 NodeJS HTTP 庫集成或將其用作 Express 中間件。它允許使用 Keygrip 對 cookie 進行簽名以防止篡改、支持延遲 cookie 驗證、不允許通過不安全的套接字發送安全 cookie、允許其他庫在不知道簽名機制的情況下訪問 cookie。

安裝:

npm install cookies

使用:

const cookie = require('cookie');
cookies = new Cookies( request, response, [ options ] )

// 讀取 cookies
cookies.get( name, [ options ] )

// 設置 cookies
cookies.set( name, [ value ], [ options ] )

4. IndexedDB

(1)概述

IndexedDB 提供了一個類似 NoSQL 的 key/value 數據庫,它可以存儲大量結構化數據,甚至是文件和 blob。每個域至少有 1GB 的可用空間,并且最多可以達到剩余磁盤空間的 60%。

IndexedDB 于 2011 年首次實現,并于 2015 年 1 月成為 W3C 標準,它具有良好的瀏覽器支持:

圖片

key/value 數據庫意味著存儲的所有數據都必須分配給一個 key。它將key 與 value 相關聯,key 用作該值的唯一標識符,這意味著可以使用該 key 跟蹤該值。如果應用需要不斷獲取數據,key/value 數據庫使用非常高效且緊湊的索引結構來快速可靠地通過 key 定位值。使用該 key,不僅可以檢索存儲的值,還可以刪除、更新和替換該值。

圖片

在說 IndexedDB 之前,先來看一些相關術語:

  • 數據庫: 一個域可以創建任意數量的 IndexedDB 數據庫,只有同一域內的頁面才能訪問數據庫。
  • object store:相關數據項的 key/value 存儲。它類似于 MongoDB 中的集合或關系數據庫中的表。
  • key:用于引用 object store 中每條記錄(值)的唯一名稱。它可以使用自動增量數字生成,也可以設置為記錄中的任何唯一值。
  • index:在 object store 中組織數據的另一種方式。搜索查詢只能檢查 key 或 index。
  • schema:object store、key 和 index 的定義。
  • version:分配給 schema 的版本號(整數)。IndexedDB 提供自動版本控制,因此可以將數據庫更新到最新 schema。
  • 操作:數據庫活動,例如創建、讀取、更新或刪除記錄。

圖片

(2)特點及使用場景

indexedDB 特點如下:

  • 可以將任何 JavaScript 類型的數據存儲為鍵值對,例如對象(blob、文件)或數組等。
  • IndexedDB API 是異步的,不會在數據加載時停止頁面的渲染。
  • 可以存儲結構化數據,例如 Date、視頻、圖像對象等。
  • 支持數據庫事務和版本控制。
  • 可以存儲大量數據。
  • 可以在大量數據中快速定位/搜索數據。
  • 數據庫是域專用的,因此任何其他站點都無法訪問其他網站的 IndexedDB 存儲,這也稱為同源策略。

IndexedDB 使用場景:

存儲用戶生成的內容: 例如表單,在填寫表單的過程中,用戶可以離開并稍后再回來完成表單,存儲之后就不會丟失初始輸入的數據。

存儲應用狀態: 當用戶首次加載網站或應用時,可以使用 IndexedDB 存儲這些初始狀態??梢允堑卿浬矸蒡炞C、API 請求或呈現 UI 之前所需的任何其他狀態。因此,當用戶下次訪問該站點時,加載速度會增加,因為應用已經存儲了狀態,這意味著它可以更快地呈現 UI。

對于離線工作的應用: 用戶可以在應用離線時編輯和添加數據。當應用程序來連接時,IndexedDB 將處理并清空同步隊列中的這些操作。

(3)IndexedDB 操作

不同瀏覽器的 IndexedDB 可能使用不同的名稱??梢允褂靡韵路椒z查 IndexedDB 支持:

const indexedDB =
window.indexedDB ||
window.mozIndexedDB ||
window.webkitIndexedDB ||
window.msIndexedDB ||
window.shimIndexedDB;

if (!indexedDB) {
console.log("不支持 IndexedDB");
}

可以使用 indexedDB.open() 來連接數據庫:

const dbOpen = indexedDB.open('performance', 1);

indexedDB.open 的第一個參數是數據庫名稱,第二個參數是可選的版本整數。

可以使用以下三個事件處理函數監聽 indexedDB 的連接狀態:

① onerror

在無法建立 IndexedDB 連接時,將觸發該事件:

// 連接失敗
dbOpen.onerror = e {
reject(`IndexedDB error: ${ e.target.errorCode }`);
};

如果在無痕模式、隱私模式下運行瀏覽器,可能不支持 IndexedDB,需要禁用這些模式。

② onupgradeneeded

一旦數據庫連接打開,就會觸發 onupgradeneeded 事件,該事件可用于創建 object store。

dbOpen.onupgradeneeded = e {
const db = dbOpen.result;

// 創建 object store
const store = db.createObjectStore("cars", { keyPath: "id" });
// 使用自動遞增的id
// const store = db.createObjectStore('cars', { autoIncrement: true });

// 創建索引

store.createIndex("cars_colour", ["colour"], {
unique: true
});

// 創建復合索引
store.createIndex("colour_and_make", ["colour", "make"], {
unique: false,
});
};

IndexedDB 使用了 object store 的概念,其本質上是數據集合的名稱??梢栽趩蝹€數據庫中創建任意數量的 object store。keyPath是 IndexedDB 將用來識別對象字段名稱,通常是一個唯一的編號,也可以通過 autoIncrement: true 來自動為 store 設置唯一遞增的 ID。除了普通的索引,還可以創建復合索引,使用多個關鍵詞的組合進行查詢。

③ onsuccess

在連接建立并且所有升級都完成時,將觸發該事件。上面我們已經新建了 schema,接下來就可以在onsuccess 中添加、查詢數據。

// 連接成功
dbOpen.onsuccess = () {
this.db = dbOpen.result;

//1
const transaction = db.transaction("cars", "readwrite");

//2
const store = transaction.objectStore("cars");
const colourIndex = store.index("cars_colour");
const makeModelIndex = store.index("colour_and_make");

//3
store.put({ id: 1, colour: "Red", make: "Toyota" });
store.put({ id: 2, colour: "Red", make: "Kia" });
store.put({ id: 3, colour: "Blue", make: "Honda" });
store.put({ id: 4, colour: "Silver", make: "Subaru" });

//4
const idQuery = store.get(4);
const colourQuery = colourIndex.getAll(["Red"]);
const colourMakeQuery = makeModelIndex.get(["Blue", "Honda"]);

// 5
idQuery.onsuccess = function () {
console.log('idQuery', idQuery.result);
};
colourQuery.onsuccess = function () {
console.log('colourQuery', colourQuery.result);
};
colourMakeQuery.onsuccess = function () {
console.log('colourMakeQuery', colourMakeQuery.result);
};

// 6
transaction.oncomplete = function () {
db.close();
};
};

這里總共有六部分:

為了對數據庫執行操作,我們必須創建一個 schema,一個 schema 可以是單個操作,也可以是多個必須全部成功的操作,否則都不會成功;

這里用來獲取 cars object store 的引用以及對應的索引;

object store 上的 put 方法用于將數據添加到數據庫中;

這里就是數據的查詢,可以使用 keyPath 的值直接查詢項目(第14行);第15行中的 getAll 方法將返回一個包含它找到的每個結果的數組,我們正在根據  cars_colour 索引來搜索 Red,應該會查找到兩個結果。第16行根據復合索引查找顏色為Blue,并且品牌為 Honda 的結果。

搜索成功的事件處理函數,它們將在查詢完成時觸發。

最后,在事務完成時關閉與數據庫連接。無需使用 IndexedDB 手動觸發事務,它會自行運行。

運行上面的代碼,就會得到以下結果:

圖片

可以在 Chrome Devtools 中查看:

圖片

下面來看看如何更新和刪除數據。

更新: 首先使用個 get 來獲取需要更新的數據,然后使用 store 上的 put 方法更新現有數據。put 是一種“插入或更新”方法,它要么覆蓋現有數據,要么在新數據不存在時插入新數據。

const subaru = store.get(4);

subaru.notallow= function () {
subaru.result.colour = "Green";
store.put(subaru.result);
}

這會將數據庫中 Silver 色的 Subaru 的顏色更新為綠色。

刪除:可以使用 delete API 來刪除數據,最簡單的方法是通過其 key 來刪除:

const deleteCar = store.delete(1);

deleteCar.onsuccess = function () {
console.log("Removed");
};

如果不知道 key 并且希望根據值來刪除,可以這樣:

const redCarKey = colourIndex.getKey(["Red"]);

redCarKey.onsuccess = function () {
const deleteCar = store.delete(redCarKey.result);

deleteCar.onsuccess = function () {
console.log("Removed");
};
};

結果如下:

圖片

5. 存儲空間分析

可以使用基于 Promise 的 Storage API 檢查 Web Storage、IndexedDB 和 Cache API 的剩余空間。異步 .estimate() 方法返回:

  • quota 屬性:可用的空間;
  • usage 屬性:已用的空間。
(async () => {
if (!navigator.storage) return;

const storage = await navigator.storage.estimate();

console.log(`可用大小: ${ storage.quota / 1024 } Kb`);
console.log(`已用大小: ${ storage.usage / 1024 } Kb`);
console.log(`已用占比: ${ Math.round((storage.usage / storage.quota) * 100) }%`);
console.log(`剩余大小: ${ Math.floor((storage.quota - storage.usage) / 1024) } Kb`);
})();

Storage API 的瀏覽器兼容性如下:

圖片

責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2018-04-27 09:22:21

數據存儲技巧

2018-07-03 08:48:48

對象存儲塊存儲

2020-05-09 14:20:11

信息安全加密

2018-05-16 08:58:04

用戶畫像存儲

2018-06-25 09:32:44

2020-11-17 06:57:15

存儲互聯網用戶

2020-07-14 08:53:43

Redis數據存儲

2021-07-30 10:33:57

MySQL觸發器數據

2020-07-16 14:40:23

大數據計算框架

2020-09-08 06:54:29

Java Gradle語言

2023-07-06 13:56:14

微軟Skype

2017-12-27 08:34:36

軟件存儲SDS

2017-12-26 10:19:14

大數據問題缺陷

2019-12-12 14:52:10

數據庫腳本

2020-03-06 15:11:21

進程線程Web

2018-04-25 09:01:02

2018-06-07 13:17:12

契約測試單元測試API測試

2022-08-30 10:15:27

Kubernetes數據持久化管理

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON
點贊
收藏

51CTO技術棧公眾號

大片在线观看网站免费收看| 国产精品色午夜在线观看| 亚洲色图欧美另类| 中文字幕高清在线播放| 欧美高清在线一区| 亚洲最大av网站| 日韩成人免费观看| 成人午夜国产| 亚洲成人激情在线观看| 少妇性l交大片| 日韩影视在线| 国产午夜精品美女毛片视频| 97久久夜色精品国产九色 | 成人福利免费在线观看| 色综合久久综合| 国产又粗又大又爽的视频| 天天躁日日躁狠狠躁伊人| 麻豆精品久久精品色综合| 欧美精品福利视频| 五月天免费网站| 香蕉一区二区| 欧美变态口味重另类| 亚洲黄色a v| 国产资源在线观看入口av| 中文字幕日韩一区二区| 欧美日韩在线观看一区二区三区| 超碰在线观看99| 久久国产尿小便嘘嘘| 26uuu久久噜噜噜噜| 午夜69成人做爰视频| 久久国产精品亚洲人一区二区三区 | 成人免费观看视频| 国产精品一区=区| 在线精品免费视| 一区免费在线| 欧美精品在线播放| 日韩三级久久久| 欧美日韩国产免费观看视频| 精品香蕉在线观看视频一| 最新国产精品自拍| 人人爱人人干婷婷丁香亚洲| 欧美色成人综合| wwwxxx黄色片| 玛雅亚洲电影| 日韩欧美视频一区二区三区| 波多野结衣综合网| 日本高清在线观看| 亚洲欧美日韩综合aⅴ视频| 亚洲精品一区二区三区樱花| 国产小视频免费在线网址| 久久品道一品道久久精品| 久久99国产精品99久久| 少妇又色又爽又黄的视频| 懂色一区二区三区免费观看| 成人av播放| 精品人妻少妇AV无码专区| 国产精品系列在线播放| 亚洲精品免费网站| 亚洲AV无码乱码国产精品牛牛| 国产精品自拍av| 99r国产精品视频| а√中文在线资源库| 高清在线成人网| 成人国产一区二区| 人人妻人人澡人人爽久久av | 亚洲乱码久久| 91精品国产高清久久久久久91| 日韩 欧美 亚洲| 免费日韩av| 国产精品国产亚洲伊人久久 | 精品久久久久av影院| 污污免费在线观看| 亚洲素人在线| 尤物yw午夜国产精品视频| 欧日韩不卡视频| 91精品一区二区三区综合在线爱| 日韩一中文字幕| 日韩成人毛片视频| 最新国产乱人伦偷精品免费网站| 欧美一级电影在线| 精品国产乱子伦| 国内精品自线一区二区三区视频| 99视频免费观看| 天天操天天射天天舔| 国产日韩欧美精品电影三级在线| 一区二区三区久久网| 黄页网站在线| 欧美午夜精品久久久| 亚洲天堂一区二区在线观看| 欧美电影在线观看免费| 国产一区二区三区视频在线观看| 国产美女久久久久久| 亚洲精选久久| 国产欧美一区二区| 色婷婷视频在线| 国产精品看片你懂得| 久草视频这里只有精品| 欧洲av一区二区| 欧美mv和日韩mv国产网站| japanese中文字幕| 欧美私人啪啪vps| 国产成人a亚洲精品| 精品人妻午夜一区二区三区四区| 99久久99久久精品免费看蜜桃| 色一情一乱一伦一区二区三区 | 生活片a∨在线观看| 亚洲小说欧美激情另类| 激情综合网俺也去| 成人性生交大片免费看96| 正在播放欧美视频| 日韩精品久久久久久久| 国产在线播精品第三| 欧美日韩在线一二三| 女同一区二区免费aⅴ| 欧美伊人久久久久久久久影院| 亚洲少妇一区二区| 久久高清精品| 国产精品第10页| 日本高清视频在线| 一区二区三区四区乱视频| 日本xxxx黄色| 视频一区中文| 2019中文在线观看| 欧美 日韩 人妻 高清 中文| 综合久久久久综合| 国产精品拍拍拍| 亚洲另类av| 国产综合在线视频| 亚洲精品福利网站| 亚洲女同一区二区| 亚洲人成网站在线| 欧美性受xxxx黑人猛交88| 日本欧美一区| 亚洲欧美日韩综合| 在线观看国产亚洲| av成人动漫在线观看| 久久亚洲国产成人精品无码区| 色狠狠一区二区三区| 在线观看日韩欧美| 无码人妻熟妇av又粗又大| 99久久国产综合精品色伊| 国内精品国产三级国产99| 婷婷激情成人| 最近2019中文字幕在线高清| 中文字幕日韩国产| 亚洲国产精品传媒在线观看| 北条麻妃视频在线| 国产亚洲欧美日韩在线观看一区二区| 欧洲精品久久久| 蜜桃视频在线观看视频| 日韩欧美在线视频日韩欧美在线视频| 亚洲综合自拍网| 新狼窝色av性久久久久久| 精品一区二区三区自拍图片区| 国产丝袜精品丝袜| 亚洲国产精品成人va在线观看| 精品无码久久久久| 成人免费视频网站在线观看| 免费一级特黄毛片| 日韩高清影视在线观看| 日本高清久久天堂| 国产对白叫床清晰在线播放| 欧美日韩精品欧美日韩精品一| 欧美xxxooo| 国产福利精品导航| 欧美啪啪免费视频| 国产一区二区电影在线观看| 国产精品久久久久久av| 免费网站看v片在线a| 日韩欧美国产一区二区三区| 国产特黄大片aaaa毛片| 久久影院电视剧免费观看| 一级特黄性色生活片| 四季av一区二区三区免费观看| 91美女片黄在线观| 男女在线视频| 亚洲精品中文字| 91国内精品视频| 亚洲一区二区三区四区中文字幕| 水蜜桃av无码| 久久电影网电视剧免费观看| 成人手机在线播放| 性人久久久久| 成人欧美一区二区三区在线湿哒哒| 欧美黑人猛交的在线视频| 日韩精品在线免费观看| 一区二区日韩视频| 亚洲成在线观看| 91视频免费在观看| 成人动漫一区二区在线| 亚洲性生活网站| 女人香蕉久久**毛片精品| 免费一区二区三区| 婷婷综合国产| 国产精品日韩欧美大师| segui88久久综合| 综合av色偷偷网| 黄色av免费观看| 欧美精品视频www在线观看 | 波多野结衣先锋影音| 日本在线观看不卡视频| 成年人网站国产| 久久伦理在线| 欧美精品一区二区三区在线看午夜| 日韩三区四区| 国产精品高清网站| 婷婷电影在线观看| 色综合久久精品亚洲国产| 国产高清视频在线观看| 亚洲国产高潮在线观看| 91资源在线视频| 青青操国产视频| 国产精品黄色在线观看| 欧美狂猛xxxxx乱大交3| 粉嫩av一区二区三区| 亚洲高清在线不卡| 欧美aa在线视频| 99精品免费在线观看| 亚洲视频碰碰| 伊人网在线免费| 婷婷色综合网| 亚洲最新在线| re久久精品视频| 欧美日韩电影一区二区三区| 成人看片黄a免费看视频| 91嫩草在线视频| 美女久久久久久| 国产精品久久久久秋霞鲁丝| 久久男人av资源站| 久久久久国色av免费观看性色 | 久久久久久久久久毛片| 美腿丝袜亚洲一区| 我看黄色一级片| 视频一区国产视频| 丁香婷婷激情网| 欧美一级视频| 黄色片一级视频| 久久精品123| 国产免费观看高清视频| 99国产精品99久久久久久粉嫩| 青青在线视频免费观看| 欧美日韩蜜桃| 999一区二区三区| 一区二区三区导航| 奇米精品一区二区三区| 国产欧美大片| 日韩久久一级片| 日韩电影在线免费| 99sesese| 国产在线精品不卡| 99精品视频免费版的特色功能| 国产精品伊人色| 亚洲成人福利视频| 99久久国产综合精品麻豆| 永久免费看mv网站入口78| 国产视频在线观看一区二区三区 | 日韩在线观看| 在线观看成人一级片| 午夜精品视频一区二区三区在线看| 亚洲天堂av免费在线观看| 正在播放日韩欧美一页| 女人被男人躁得好爽免费视频 | 神马久久精品| 亚洲视频一区二区三区| 无遮挡动作视频在线观看免费入口| 日韩中文字幕免费视频| www久久日com| 性欧美在线看片a免费观看 | 波多野结衣久草一区| 国产精品国产| 日本一区二区精品| 国产精品videosex性欧美| 老司机激情视频| 玖玖视频精品| 国产九九九视频| 99久久精品免费看| 丁香六月激情综合| 亚洲高清在线精品| 欧美一区免费看| 制服视频三区第一页精品| 丰满人妻熟女aⅴ一区| 亚洲免费视频在线观看| 黄色网址视频在线观看| 8090成年在线看片午夜| 四虎影视国产精品| 国产日本一区二区三区| 北条麻妃国产九九九精品小说| 国产激情片在线观看| 久久综合九色| 一区二区三区人妻| 国产色产综合产在线视频 | 欧美在线视频全部完| 亚洲国产999| 一道本无吗dⅴd在线播放一区| huan性巨大欧美| 国产成人精品亚洲精品| 精品一区二区三区中文字幕在线 | 国产 xxxx| 国产精品电影一区二区| 天天操夜夜操视频| 欧美一级爆毛片| 久草视频在线看| 久久全球大尺度高清视频| 日韩久久一区| 日本一区视频在线观看| 亚洲毛片视频| 善良的小姨在线| 国产欧美日韩久久| 欧美一二三区视频| 日韩久久免费av| 视频一区二区三区不卡| 国产精欧美一区二区三区| 爱高潮www亚洲精品| 永久久久久久| 天堂久久一区二区三区| 亚洲精品在线视频免费观看| 夜夜嗨av一区二区三区四季av| 特级西西444www高清大视频| 日韩精品在线看| sm捆绑调教国产免费网站在线观看 | 免费视频爱爱太爽了| 久久99精品久久久久久国产越南| 日韩在线免费观看av| 同产精品九九九| 亚洲第一页综合| 欧美成人一二三| 96sao精品免费视频观看| 午夜欧美性电影| 日韩成人免费电影| 久久午夜福利电影| 色综合久久久久综合| 无码国产色欲xxxx视频| 久久久久久亚洲| 超碰97久久| 国产精品久久久久9999爆乳| 国产成人av网站| 欧美黄色一级网站| 欧美成人艳星乳罩| 污视频在线免费观看网站| 999精品在线观看| 欧美日韩网站| 国产情侣久久久久aⅴ免费| 亚洲一线二线三线视频| 成人乱码一区二区三区| 久久久久久久爱| 另类春色校园亚洲| 日韩avxxx| 国产日韩精品一区| 99re热视频| 日韩一二三在线视频播| 国产精品色婷婷在线观看| www.国产亚洲| 成人综合激情网| 欧美三级午夜理伦| 亚洲性无码av在线| 韩国理伦片久久电影网| 乱子伦一区二区| 成人黄色在线看| 日韩毛片一区二区三区| 亚洲视频在线免费看| 成人自拍视频网| 男人的天堂成人| 粉嫩av一区二区三区粉嫩| 草久久免费视频| 一本一本久久a久久精品牛牛影视| 亚洲成人a级片| 日韩欧美猛交xxxxx无码| 91免费国产在线| 中文字幕在线一| 欧美大片免费观看| 欧美自拍一区| 日韩精品你懂的| 一区二区欧美视频| 三级黄视频在线观看| 国产噜噜噜噜噜久久久久久久久 | 曰本一区二区三区视频| 污视频网站观看| 亚洲mv在线观看| 91露出在线| 成人激情直播| 日韩经典中文字幕一区| 国产黄在线免费观看| 亚洲第一视频网| 日日夜夜一区| 欧美三级一级片| 亚洲日穴在线视频| 日韩av成人| 亚洲一区久久久| 日韩制服丝袜先锋影音| 久久久久黄色片| 一个色综合导航| 给我免费播放日韩视频| 天堂在线资源视频| 婷婷成人激情在线网| 91caoporm在线视频| 精品无人区一区二区三区竹菊 | 91在线无精精品一区二区| 亚洲一区欧美二区| 毛片aaaaa| 色偷偷888欧美精品久久久|