0

0

HTML5怎样用IndexedDB存取值获取数据_HTML5IndexedDB用法【通识】

蓮花仙者

蓮花仙者

发布时间:2026-01-12 22:32:04

|

425人浏览过

|

来源于php中文网

原创

IndexedDB打开失败通常因未处理onupgradeneeded事件,它非错误而是必经阶段,须在此创建objectStore;onerror才表示真实异常,如权限拒绝或磁盘满;DataCloneError源于存入不可克隆数据;get()返回undefined可能因key类型不匹配或事务已关闭;批量写入应复用同一事务并用put()替代多次add()。

html5怎样用indexeddb存取值获取数据_html5indexeddb用法【通识】

IndexedDB 打开数据库失败:onerror 和 onupgradeneeded 怎么区分?

绝大多数初学者卡在第一步——indexedDB.open() 调用后既没进 onsuccess 也没报错,实际是触发了 onupgradeneeded。这个事件**不是错误**,而是数据库首次创建或版本升级的必经阶段,必须在此回调里定义 objectStore,否则后续所有读写都会失败(报 InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing 或类似错误)。

关键点:

  • onupgradeneeded 中必须调用 db.createObjectStore('storeName', { keyPath: 'id' }),否则后续事务会因 store 不存在而拒绝执行
  • 如果只是想读已有数据,但忘记处理 onupgradeneededdb 对象虽存在,却无法开启事务(db.transaction(...) 报错)
  • onerror 真正触发时,通常意味着权限被拒(如私密模式下 Safari 默认禁用 IndexedDB)、磁盘满、或数据库损坏,此时 event.target.error 会给出具体原因

存对象时提示 “DataCloneError:Failed to execute 'add' on 'IDBObjectStore'”

这是最常被忽略的兼容性陷阱:IndexedDB **只接受可结构化克隆(structured clone)的数据**,不支持函数、undefined、Symbol、DOM 节点、循环引用对象,甚至 Date 实例在部分旧版浏览器中也会失败。

安全写法:

立即学习前端免费学习笔记(深入)”;

  • 存前用 JSON.parse(JSON.stringify(obj)) 做浅净化(注意:会丢掉 Date、RegExp、undefined 等)
  • 更稳妥的做法是手动序列化:把 new Date() 转成 date.toISOString() 字符串,把 Map/Set 转为数组
  • 避免直接存 thiseventdocument.querySelector(...) 这类原生对象
const transaction = db.transaction(['users'], 'readwrite');
const store = transaction.objectStore('users');
// ✅ 安全
store.add({ id: 1, name: 'Alice', createdAt: new Date().toISOString() });

// ❌ 报 DataCloneError
store.add({ id: 1, name: 'Alice', now: new Date() }); // Date 对象在某些环境不被允许

get() 返回 undefined 却没报错:key 匹配逻辑和事务模式要注意什么?

IDBObjectStore.get(key) 查不到时**静默返回 undefined**,不会抛异常,容易误判为“成功但值为空”。根本原因常出在两个地方:key 类型不一致、或事务已关闭。

晓象AI资讯阅读神器
晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

下载

典型坑:

  • 存的时候用字符串 '123' 作 key,查时传数字 123 —— IndexedDB 的 key 比较严格,'123' !== 123
  • 异步操作中,transaction.oncomplete 触发后,事务自动关闭,此时再调用 get() 会立即失败(但不报错,返回 undefined)
  • 没指定 keyPath 且没传 autoIncrement: true,又没手动传 key,add() 会失败,导致后续 get() 查不到
// ✅ 正确:确保 key 类型一致,且在事务活跃期内调用
const transaction = db.transaction(['logs'], 'readonly');
const store = transaction.objectStore('logs');
const request = store.get('log_20240520'); // 字符串 key

request.onsuccess = () => {
  if (request.result === undefined) {
    console.log('没找到该 log');
  } else {
    console.log('查到:', request.result);
  }
};

批量写入慢、频繁阻塞 UI?用 add() 还是 put()?要不要用游标?

单条 add() / put() 没问题,但循环 1000 次逐个写,性能极差。根本原因是每次请求都新建一个事务,触发多次磁盘 I/O 和事件调度。

提速关键:

  • **所有写操作必须塞进同一个 readwrite 事务**,哪怕跨多个 objectStore
  • put()add() 更通用:它会覆盖同 key 记录,而 add() 遇到重复 key 直接报 ConstraintError
  • 批量导入场景,优先用 store.put(item, key),配合 transaction.oncomplete 统一收尾,别等每个 request.success
  • 遍历大量数据用 openCursor(),不用反复 get() —— 游标一次打开,顺序读取,内存占用

复杂点在于:事务生命周期必须手动管理,不能依赖闭包或异步等待。一旦离开当前函数作用域,又没显式 hold 住 transaction,它就可能提前关闭。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

410

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

504

2023.10.23

HTML与HTML5的区别
HTML与HTML5的区别

HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

426

2024.03.06

html5从入门到精通汇总
html5从入门到精通汇总

想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

14

2025.12.30

html5新老标签汇总
html5新老标签汇总

HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

14

2025.12.30

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

AngularJS教程
AngularJS教程

共24课时 | 2.5万人学习

CSS教程
CSS教程

共754课时 | 18.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号