在chrome(版本 70.0.3538.110)测试正常

编写涉及:css, html, js

在线演示codepen

html代码

<h1>indexedDB</h1>
<h2>在 DevTools 的 Application 中查看数据库信息</h2> <button onclick="addDBData()">添加数据</button>
<div>
<button onclick="getDBData()">获取数据</button>
<input type="text" id="getID" placeholder="请输入ID">
</div>
<div>
<button onclick="delDBData()">删除数据</button>
<input type="text" id="delID" placeholder="请输入ID">
</div>
<div>
<button onclick="updateDBData()">更新数据</button>
<input type="text" id="updateID" placeholder="请输入ID">
</div>
<div id="display"></div>

css代码

button {
margin: 10px 0;
padding: 8px 10px;
border: 0;
color: #fff;
background-color: rgb(7, 196, 230);
}
input{
padding: 8px 5px;
border: rgb(7, 196, 230) solid 1px
}

JavaScript代码

window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if (!window.indexedDB) {
alert('不支持indexDB')
} const DATA_BASE = 'TEST_DB'
let db = {} /**
1. 不存在当前数据库时,即为创建
2. open参数:数据库名称,版本号(整数)
*/
const request = window.indexedDB.open(DATA_BASE, 1) request.onerror = function (e) {
console.error('error', e)
} /**
1. 数据库已存在,打开成功
*/
request.onsuccess = function (event) {
db = event.target.result
console.log('execute onsuccess');
}; /**
1. 当数据库不存在时,创建数据库会触发 onupgradeneeded 事件
2. 当指定的版本号高于当前时会直接触发 onupgradeneeded 事件
3. 唯一可以修改数据库结构的事件
*/
request.onupgradeneeded = function (event) {
/**
1. 保存 IDBDataBase 接口(数据库)
*/
db = event.target.result
console.log('execute onupgradeneeded'); /**
1.使用键生成器,测试时,去除注释即可
*/
// const objectStore = db.createObjectStore('users', { autoIncrement : true })
// objectStore.add({name: '123'});
// objectStore.add('123'); /**
1. 为当前数据库创建对象仓库(表)
2. 这里的keyPath 相当于主键
3. createIndex(indexName, keyPath, {unique | multiEntry | locale})
*/
const objectStore = db.createObjectStore('users', { keyPath: 'id' })
objectStore.createIndex('name', 'name', { unique: false })
objectStore.createIndex('age', 'age', { unique: false }) /**
1. 确保初始化数据的时候,对象仓库已经创建完毕
*/
objectStore.transaction.oncomplete = function(event) {
const transaction = db.transaction(['users'], 'readwrite')
const objStore = transaction.objectStore('users')
objStore.add({
id: 12,
name: `hew-${Math.random()}` ,
age: parseInt( Math.random() * 100, 10)
})
}
} /**
1. 所有数据库操作都基于事务
2. 事务三种模式:readonly,readwrite,versionchange
3. 修改数据库模式或结构——包括新建或删除对象仓库或索引,只能用 versionchange 模式
*/
function addDBData() {
const transaction = db.transaction(['users'], 'readwrite')
const objectStore = transaction.objectStore('users')
const request = objectStore.add({
id: Math.random() * 10,
name: `hew-${Math.random()}` ,
age: parseInt( Math.random() * 100, 10)
}) transaction.oncomplete = function (event) {
console.log('transaction add complete')
} transaction.onerror = function (error) {
console.error('add error', error)
} request.onsuccess = function (event) {
console.log('add complete')
}
} function getDBData() {
const id = parseFloat(document.getElementById('getID').value)
const transaction = db.transaction(['users'], 'readwrite')
const objectStore = transaction.objectStore('users') /**
1. 注意数据类型
*/
const request = objectStore.get(id) request.onsuccess = function (event) {
console.log('get complete', event.target.result)
document.getElementById('display').innerHTML = JSON.stringify(request.result)
} request.onerror = function (err) {
console.error('get error', err)
}
} function updateDBData() {
const id = parseFloat(document.getElementById('updateID').value)
const transaction = db.transaction(['users'], 'readwrite')
const objectStore = transaction.objectStore('users')
const request = objectStore.get(id) request.onsuccess = function (event) {
const d = event.target.result
d.name = 'name name'
const objectStoreUpdate = objectStore.put(d)
objectStoreUpdate.onsuccess = function (e) {
console.log('update success')
} document.getElementById('display').innerHTML = 'update success'
} request.onerror = function (err) {
console.error('get error', err)
} } function delDBData() {
const id = parseFloat(document.getElementById('delID').value)
const request = db.transaction(['users'], 'readwrite').objectStore('users').delete(id) request.onsuccess = function() {
console.log('delete complete', id);
}
}

参考

若有疑问或错误,请留言,谢谢!Github blog issues

indexedDB添加,删除,获取,修改的更多相关文章

  1. JavaScript Dom基础-9-Dom查找方法; 设置DOM元素的样式; innerHTML属性的应用; className属性的应用; DOM元素上添加删除获取属性;

    JavaScript Dom基础 学习目标 1.掌握基本的Dom查找方法 domcument.getElementById() Domcument.getElementBy TagName() 2.掌 ...

  2. linux下添加删除,修改,查看用户和用户组

    一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...

  3. mongodb查看操作记录方法以及用户添加删除权限修改密码

    前一阵跑程序时发现一个问题,同事导出了部分数据,但是在merge回原库时竟然和原库的数据对不上,后来找了半天发现是原库数据少了. 找了很多资料发现很多人认为的操作日志和我想的不太一样...找了半条才发 ...

  4. jQuery08源码 (5140 , 6057) DOM操作 : 添加 删除 获取 包装 DOM筛选

    jQuery.fn.extend({ //$('ul').find('li').css('background','red'); //$('ul').find( $('li') ).css('back ...

  5. js+jquery动态设置/添加/删除/获取元素属性的两种方法集锦对照(动态onclick属性设置+动态title设置)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140 ...

  6. jquery17 DOM操作 : 添加 删除 获取 包装 DOM筛选

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. jquery16 DOM操作 : 添加 删除 获取 包装 DOM筛选

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 如何管理和记录 SSIS 各个 Task 的开始执行时间和结束时间以及 Task 中添加|删除|修改的记录数

    开篇语 在这篇日志中 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架 我介绍到了包级别的日志管理框架,那么这个主要是针对包这一个层级的 Log 信息,包括包开始执行和结束时间,以 ...

  9. SQL语句的添加、删除、修改多种方法

    SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔------- ...

  10. C# 添加、获取及删除PDF附件

    C# 添加.获取及删除PDF附件 前言 附件在PDF文档中很常见,这些附件可以是PDF或其他类型的文件.在PDF中,附件有两种存在方式,一种是普通的文件附件(document-level file a ...

随机推荐

  1. java基础第十八篇之单元测试、注解和动态代理

    1:单元测试 1)JUnit是一个Java语言的单元测试框架,这里的单元指的就是方法 2)单元测试用来替换以前的main方法 1.1 Junit测试的步骤 1:在方法的上面加上 @Test 2:将ju ...

  2. SpringBoot 2.0.3 源码解析

    前言 用SpringBoot也有很长一段时间了,一直是底层使用者,没有研究过其到底是怎么运行的,借此机会今天试着将源码读一下,在此记录...我这里使用的SpringBoot 版本是  2.0.3.RE ...

  3. DAX 第二篇:计算上下文

    计算上下文是计算公式的环境,任何DAX表达式都是在上下文中求值的.行上下文和筛选上下文是DAX中仅有的上下文类型,把这两种上下文称为计算上下文.计算上下文用于限定公式计算的环境,当上下文变化时,相同的 ...

  4. python爬虫笔记之re.IGNORECASE

    re.IGNORECASE有什么用?re.IGNORECASE是什么意思?(原谅我抓下seo..) 这里自己总结下: re.IGNORECASE是compile函数中的一个匹配模式. re.IGNOR ...

  5. MediatR-进程内的消息通信框架

    MediatR是一款进程内的消息订阅.发布框架,提供了Send方法用于发布到单个处理程序.Publish方法发布到多个处理程序,使用起来非常方便.目前支持 .NET Framework4.5..NET ...

  6. 解决springmvc返回中文乱码问题

  7. [小米OJ] 7. 第一个缺失正数

    思路: 参考这个思路 即:将每个数字放在对应的第几个位置上,比如1放在第1个位置上,2放在第2个位置上. 注意几个点:将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且交换的两个数 ...

  8. 支持微信页面右侧悬浮QQ在线客服

    使用方法: 1.将style里的css样式复制到你的样式表中 2.将body中的代码部分拷贝到你需要的地方即可 (js.图片采用绝对路径,不建议修改) <!DOCTYPE html PUBLIC ...

  9. 开源分布式事务中间件Seata使用指南

    介绍 Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构. 初衷 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能 ...

  10. Tips 14:思维导图读书笔记法

    Tips 14:思维导图读书笔记法作读书笔记不仅能提高阅读书.文的效率,而且能提高科学研究和写作能力.读书笔记一般分为摘录.提纲.批注.心得几种,这里特别推荐思维导图式的读书笔记. 通过思维导图先大概 ...