- 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>
嘗試執行上述程式。在輸出中,您將獲得一個建立、更新和刪除資料的介面。新建立或更新的資料將在操作完成後立即以表格形式出現。