IndexedDB 的 open 方法本质是异步请求并触发版本控制,关键在 onupgradeneeded 事件中定义结构变更;它返回 IDBOpenDBRequest 对象,含 onsuccess、onerror 和 onupgradeneeded 三个回调,其中仅 onupgradeneeded 中可安全创建或删除 objectStore。

HTML5 的 IndexedDB 使用 open 方法打开数据库时,本质是发起一个异步请求,同时触发版本控制与升级流程。关键不在“打开”,而在于如何响应 onupgradeneeded 事件来定义结构变更。
open 方法的基本用法与返回值
调用 window.indexedDB.open(name, version) 会返回一个 IDBOpenDBRequest 对象。它有三个核心状态回调:
-
onsuccess:数据库已存在且版本匹配,或升级已完成,此时 request.result 即为 IDBDatabase 实例 -
onerror:权限被拒、磁盘满、路径非法等底层错误 -
onupgradeneeded:必须处理的事件——当数据库不存在,或传入 version 高于当前版本时触发
版本升级的核心逻辑在 onupgradeneeded 中
该事件处理器是唯一能安全创建/删除对象仓库(objectStore)、添加索引的地方。它自动提供一个具备版本变更权限的 IDBTransaction(mode = "versionchange"),其他事务在此期间会被挂起。
- 若未监听 onupgradeneeded,而 version 升高,open 将直接失败并触发 onerror
- event.oldVersion 为 0 表示数据库首次创建;否则是当前已存版本
- event.newVersion 是你调用 open 时传入的目标版本
- 通过 event.target.result 获取正在升级的 IDBDatabase,再调用 createObjectStore 或 deleteObjectStore
安全升级的常见模式(支持多版本迭代)
避免硬编码 if (oldVersion
- 检查 oldVersion
- 检查 oldVersion
- 检查 oldVersion
注意:所有结构变更必须在 onupgradeneeded 内完成,不可延后到 success 回调中执行。
关闭与重开场景下的版本处理
数据库打开后,若代码中调用 db.close(),再次 open 不会触发 onupgradeneeded,除非显式提高 version 参数。浏览器按 name + version 组合识别数据库实例。
- 同一页面中多次 open 相同 name/version:复用已有连接,不重复触发事件
- 不同标签页间:新版生效需等待所有旧连接 close 后,新 open 才能获得升级锁
- 降级不被允许:不能用更低 version 调用 open 来“回退”,只能手动清空并重建
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










