
- Javascript 基礎教程
- Javascript - 首頁
- JavaScript - 路線圖
- JavaScript - 概述
- JavaScript - 特性
- JavaScript - 啟用
- JavaScript - 位置
- JavaScript - 語法
- JavaScript - Hello World
- JavaScript - Console.log()
- JavaScript - 註釋
- JavaScript - 變數
- JavaScript - let 語句
- JavaScript - 常量
- JavaScript - 資料型別
- JavaScript - 型別轉換
- JavaScript - 嚴格模式
- JavaScript - 保留關鍵字
- JavaScript 運算子
- JavaScript - 運算子
- JavaScript - 算術運算子
- JavaScript - 比較運算子
- JavaScript - 邏輯運算子
- JavaScript - 位運算子
- JavaScript - 賦值運算子
- JavaScript - 條件運算子
- JavaScript - typeof 運算子
- JavaScript - 空值合併運算子
- JavaScript - delete 運算子
- JavaScript - 逗號運算子
- JavaScript - 分組運算子
- JavaScript - yield 運算子
- JavaScript - 展開運算子
- JavaScript - 指數運算子
- JavaScript - 運算子優先順序
- JavaScript 控制流
- JavaScript - if...else
- JavaScript - while 迴圈
- JavaScript - for 迴圈
- JavaScript - for...in
- Javascript - for...of
- JavaScript - 迴圈控制
- JavaScript - break 語句
- JavaScript - continue 語句
- JavaScript - switch case
- JavaScript - 使用者自定義迭代器
- JavaScript 函式
- JavaScript - 函式
- JavaScript - 函式表示式
- JavaScript - 函式引數
- JavaScript - 預設引數
- JavaScript - Function() 建構函式
- JavaScript - 函式提升
- JavaScript - 自執行函式
- JavaScript - 箭頭函式
- JavaScript - 函式呼叫
- JavaScript - Function call()
- JavaScript - Function apply()
- JavaScript - Function bind()
- JavaScript - 閉包
- JavaScript - 變數作用域
- JavaScript - 全域性變數
- JavaScript - 智慧函式引數
- JavaScript 物件
- JavaScript - Number
- JavaScript - Boolean
- JavaScript - String
- JavaScript - Array
- JavaScript - Date
- JavaScript - DataView
- JavaScript - Handler
- JavaScript - Math
- JavaScript - RegExp
- JavaScript - Symbol
- JavaScript - Set
- JavaScript - WeakSet
- JavaScript - Map
- JavaScript - WeakMap
- JavaScript - 可迭代物件
- JavaScript - Reflect
- JavaScript - TypedArray
- JavaScript - 模板字面量
- JavaScript - 標籤模板
- 面向物件 JavaScript
- JavaScript - 物件
- JavaScript - 類
- JavaScript - 物件屬性
- JavaScript - 物件方法
- JavaScript - 靜態方法
- JavaScript - 顯示物件
- JavaScript - 物件訪問器
- JavaScript - 物件建構函式
- JavaScript - 原生原型
- JavaScript - ES5 物件方法
- JavaScript - 封裝
- JavaScript - 繼承
- JavaScript - 抽象
- JavaScript - 多型
- JavaScript - 解構賦值
- JavaScript - 物件解構
- JavaScript - 陣列解構
- JavaScript - 巢狀解構
- JavaScript - 可選鏈
- JavaScript - 全域性物件
- JavaScript - Mixins
- JavaScript - 代理 (Proxies)
- JavaScript 版本
- JavaScript - 歷史
- JavaScript - 版本
- JavaScript - ES5
- JavaScript - ES6
- ECMAScript 2016
- ECMAScript 2017
- ECMAScript 2018
- ECMAScript 2019
- ECMAScript 2020
- ECMAScript 2021
- ECMAScript 2022
- JavaScript 非同步程式設計
- JavaScript - 非同步程式設計
- JavaScript - 回撥函式
- JavaScript - Promise
- JavaScript - Async/Await
- JavaScript - 微任務
- JavaScript - Promise 化
- JavaScript - Promise 鏈式呼叫
- JavaScript - 定時事件
- JavaScript - setTimeout()
- JavaScript - setInterval()
- JavaScript Cookie
- JavaScript - Cookie
- JavaScript - Cookie 屬性
- JavaScript - 刪除 Cookie
- JavaScript 瀏覽器 BOM
- JavaScript - 瀏覽器物件模型
- JavaScript - Window 物件
- JavaScript - Document 物件
- JavaScript - Screen 物件
- JavaScript - History 物件
- JavaScript - Navigator 物件
- JavaScript - Location 物件
- JavaScript - Console 物件
- JavaScript Web APIs
- JavaScript - Web API
- JavaScript - History API
- JavaScript - Storage API
- JavaScript - Forms API
- JavaScript - Worker API
- JavaScript - Fetch API
- JavaScript - Geolocation API
- JavaScript 事件
- JavaScript - 事件
- JavaScript - DOM 事件
- JavaScript - addEventListener()
- JavaScript - 滑鼠事件
- JavaScript - 鍵盤事件
- JavaScript - 表單事件
- JavaScript - Window/Document 事件
- JavaScript - 事件委託
- JavaScript - 事件冒泡
- JavaScript - 事件捕獲
- JavaScript - 自定義事件
- JavaScript 錯誤處理
- JavaScript - 錯誤處理
- JavaScript - try...catch
- JavaScript - 除錯
- JavaScript - 自定義錯誤
- JavaScript - 擴充套件錯誤
- JavaScript 重要關鍵字
- JavaScript - this 關鍵字
- JavaScript - void 關鍵字
- JavaScript - new 關鍵字
- JavaScript - var 關鍵字
- JavaScript HTML DOM
- JavaScript - HTML DOM
- JavaScript - DOM 方法和屬性
- JavaScript - DOM Document
- JavaScript - DOM 元素
- JavaScript - DOM 屬性 (Attr)
- JavaScript - DOM 表單
- JavaScript - 修改 HTML
- JavaScript - 修改 CSS
- JavaScript - DOM 動畫
- JavaScript - DOM 導航
- JavaScript - DOM 集合
- JavaScript - DOM NodeList
- JavaScript - DOM DOMTokenList
- JavaScript 其他
- JavaScript - Ajax
- JavaScript - 非同步迭代
- JavaScript - Atomics 物件
- JavaScript - rest 引數
- JavaScript - 頁面跳轉
- JavaScript - 對話方塊
- JavaScript - 頁面列印
- JavaScript - 驗證
- JavaScript - 動畫
- JavaScript - 多媒體
- JavaScript - 圖片地圖
- JavaScript - 瀏覽器
- JavaScript - JSON
- JavaScript - 多行字串
- JavaScript - 日期格式
- JavaScript - 獲取日期的方法
- JavaScript - 設定日期的方法
- JavaScript - 模組
- JavaScript - 動態匯入
- JavaScript - BigInt
- JavaScript - Blob
- JavaScript - Unicode
- JavaScript - 淺複製
- JavaScript - 呼叫棧
- JavaScript - 引用型別
- JavaScript - IndexedDB
- JavaScript - 點選劫持攻擊
- JavaScript - 柯里化
- JavaScript - 圖形
- JavaScript - Canvas
- JavaScript - 防抖
- JavaScript - 效能
- JavaScript - 風格指南
JavaScript - IndexedDB
什麼是 IndexedDB?
IndexedDB,或索引資料庫,是一個低階的 JavaScript API。其功能包括儲存和檢索大量結構化資料,包括檔案和 Blob。它能夠與客戶端資料庫互動,使 Web 應用程式能夠在使用者的裝置上本地儲存、查詢和修改資料。此功能在構建處理大量資料、離線工作以及透過本地資料快取提供響應式使用者體驗的 Web 應用程式時尤其有用。
IndexedDB 的關鍵概念和特性
非同步 API − IndexedDB 使用非同步 API,依賴於事件驅動的程式設計,以防止主執行緒阻塞並增強使用者體驗。
資料庫 − IndexedDB 資料庫充當物件儲存的容器,便於資料的組織、檢索和刪除。
物件儲存 − 物件儲存類似於關係資料庫中的表,封裝 JavaScript 物件的集合;它支援 CRUD 操作。
索引 − 物件儲存中的索引可以提高資料查詢效率,因為它們能夠根據特定欄位提高搜尋和排序效能。
事務 − IndexedDB 中的事務執行所有操作,透過使多個操作作為一個單元成功或失敗來保證一致性和完整性。
為什麼要使用 IndexedDB?
Web 開發人員在尋找高效的客戶端儲存解決方案時,發現 IndexedDB 不可或缺。它的非同步特性保證了響應式的使用者體驗:它避免了主執行緒阻塞;此外,它對事務的支援透過維護資料完整性值得稱讚。IndexedDB 能夠本地管理大量結構化資料;此功能大大增強了離線功能,減少了對持續伺服器通訊的需求。憑藉其靈活的鍵結構、對最佳化查詢的索引支援以及升級模式的能力,它是構建需要本地儲存、離線支援和高效資料管理的 Web 應用程式的強大選擇。
CRUD 操作
現在讓我們看看 IndexedDB 的 CRUD 操作程式碼。
建立/插入操作
要在物件儲存中插入新記錄,可以使用 IndexedDB 中的 add() 方法。此方法接受 JavaScript 物件或值作為引數,然後將其新增到指定的物件儲存中。但是,如果已經存在具有相同鍵引數的條目,則此操作將失敗,因此它非常適合保證唯一性。
const request = objectStore.add(data); request.onsuccess = () => { // Handle success event }; request.onerror = () => { // Handle error };
讀取 (檢索) 操作
get() 方法
使用 get() 方法:它從物件儲存中檢索單個記錄,此操作取決於您是否知道目標條目的特定鍵。
openCursor() 方法
啟動一個主動遊標來迭代物件儲存中的記錄,openCursor() 方法透過允許處理每個單獨的條目來提高效率和控制;這在遍歷物件儲存中存在的全部條目時非常有用。
const request = objectStore.openCursor(); request.onsuccess = (event) => { const cursor = event.target.result; if (cursor) { const data = cursor.value; // Process data cursor.continue(); } }; request.onerror = () => { // Handle error };
更新操作
put() 方法更新現有記錄,或者在鍵不存在時新增新記錄。它的多功能性使其適合於資料操作,特別是更新和插入。
const request = objectStore.put(data);
刪除操作
要根據其鍵從物件儲存中刪除特定記錄,必須使用 delete() 方法;此方法提供了一種直接刪除條目的方法。
const request = objectStore.delete(key);
實現示例
上述所有重要的 CRUD 操作方法都在此程式碼中實現。它將資料庫資料顯示為表格,每條記錄都帶有刪除和更新按鈕。單擊建立按鈕時,它會在螢幕上顯示一個用於表單建立的元素;從而允許輸入姓名和電子郵件以插入到資料庫中。預設情況下,此表單隱藏;它只在單擊按鈕後出現,並在其任務完成後消失。'prompt()' 方法填充了詳細資訊更新表單,此功能為使用者提供了便利,因為警報也出現在同一位置。此外:相關的警報用於向用戶發出成功事件或錯誤的訊號。
<!DOCTYPE html> <html> <head> <style> body { font-family: Arial, sans-serif; margin: 20px; } h2 { color: #333; } button { padding: 8px; margin: 5px; } #createForm, #updateForm { display: none; border: 1px solid #ddd; padding: 10px; margin-bottom: 10px; } table { border-collapse: collapse; width: 100%; margin-top: 20px; width: auto; } th, td { border: 1px solid #dddddd; text-align: left; padding: 8px; } th { background-color: #f2f2f2; } </style> </head> <body> <h2>IndexedDB CRUD Operations</h2> <button onclick="showCreateForm()">Create Data</button> <div id="createForm" style="display: none;"> // hidden by default, displayed on create button click <h3>Create Data</h3> <label for="name">Name:</label> <input type="text" id="name" required><br><br> <label for="email">Email:</label> <input type="email" id="email" required><br> <button onclick="createData()">Save</button> <button onclick="cancelCreate()">Cancel</button> </div> <table id="data-table"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Email</th> <th>Actions</th> </tr> </thead> <tbody></tbody> </table> <script> const dbName = "myDatabase"; let db; // Open/create indexedDB named myDatabase with version 11 const request = window.indexedDB.open(dbName, 11); request.onerror = (event) => { alert("Database error: " + event.target.errorCode); }; request.onsuccess = (event) => { db = event.target.result; showData(); }; request.onupgradeneeded = (event) => { db = event.target.result; const objectStore = db.createObjectStore("myObjectStore", { keyPath: "id", autoIncrement: true }); objectStore.createIndex("name", "name", { unique: false }); objectStore.createIndex("email", "email", { unique: true }); }; function showData() { //populates the table from the db const transaction = db.transaction(["myObjectStore"], "readonly"); const objectStore = transaction.objectStore("myObjectStore"); const tableBody = document.querySelector("#data-table tbody"); tableBody.innerHTML = ""; const request = objectStore.openCursor(); request.onsuccess = (event) => { const cursor = event.target.result; if (cursor) { const row = tableBody.insertRow(); row.insertCell(0).textContent = cursor.value.id; row.insertCell(1).textContent = cursor.value.name; row.insertCell(2).textContent = cursor.value.email; const actionsCell = row.insertCell(3); //update & delete is performed on the basis of id, hence id is passed as parameter to functions when corresponding button is clicked actionsCell.innerHTML = ` <button onclick="showUpdateForm(${cursor.value.id})">Update</button> <button onclick="deleteData(${cursor.value.id})">Delete</button> `; cursor.continue(); } }; } function createData() { const transaction = db.transaction(["myObjectStore"], "readwrite"); const objectStore = transaction.objectStore("myObjectStore"); const name = document.getElementById("name").value; const email = document.getElementById("email").value; const newData = { name: name, email: email }; const request = objectStore.add(newData); request.onsuccess = () => { showData(); cancelCreate(); alert("Data added successfully") }; request.onerror = () => { alert("Error creating data."); }; } function showCreateForm() { document.getElementById("createForm").style.display = "block"; } function cancelCreate() { //if the user decides to not insert the record. document.getElementById("createForm").style.display = "none"; document.getElementById("name").value = ""; document.getElementById("email").value = ""; } function showUpdateForm(id) { const transaction = db.transaction(["myObjectStore"], "readwrite"); const objectStore = transaction.objectStore("myObjectStore"); const request = objectStore.get(id); request.onsuccess = (event) => { const data = event.target.result; if (data) { const name = prompt("Update Name:", data.name); const email = prompt("Update Email:", data.email); if (name !== null && email !== null) { data.name = name; data.email = email; const updateRequest = objectStore.put(data); updateRequest.onsuccess = () => { showData(); alert("Updated data for "+data.name) }; updateRequest.onerror = () => { alert("Error updating data."); }; } } }; } function deleteData(id) { const transaction = db.transaction(["myObjectStore"], "readwrite"); const objectStore = transaction.objectStore("myObjectStore"); const request = objectStore.delete(id); request.onsuccess = () => { showData(); alert("Deleted data for id "+id) }; request.onerror = () => { alert("Error deleting data."); }; } </script> </body> </html>
嘗試執行上述程式。在輸出中,您將獲得一個建立、更新和刪除資料的介面。新建立或更新的資料將在操作完成後立即以表格形式出現。