做项目时需要用H5本地存储,感觉还不错 下面是一些基础知识和一个完整的实例

  

HTML5 的一个重要特性是本地数据持久性,它使用户能够在线和离线访问 Web 应用程序。此外,本地数据持久性使移动应用程序更灵敏,使用的带宽更少,而且能够在低带宽场景中更高效地工作。HTML5 提供了一些本地数据持久性选项。第一个选项是 localstorage,它支持您使用一个简单的键值对来存储数据。IndexedDB(一个更加强大的选项)支持您本地存储大量对象,并使用健壮的数据访问机制检索数据。

IndexedDB API 取代了 Web Storage API,后者在 HTML5 规范中已不推荐使用。(但一些领先的浏览器仍然支持 Web Storage,其中包括苹果公司的 Safari 和 Opera Web 浏览器)与 Web Storage 相比,IndexedDB 具有多个优势,其中包括索引、事务处理和健壮的查询功能。本文将通过一系列的示例来展示如何管理 IndexedDB 数据库。

重要概念

一个网站可能有一个或多个 IndexedDB 数据库,每个数据库必须具有惟一的名称。

一个数据库可包含一个或多个对象存储。一个对象存储(由一个名称惟一标识)是一个记录集合。每个记录有一个 和一个。该值是一个对象,可拥有一个或多个属性。键可能基于某个键生成器,从一个键路径衍生出来,或者是显式设置。一个键生成器自动生成惟一的连续正整数。键路径定义了键值的路径。它可以是单个 JavaScript 标识符或多个由句点分隔的标识符。

规范中包含一个异步 API 和一个同步 API。同步 API 用于 Web 浏览器中。异步 API 使用请求和回调。

在以下示例中,输出附加到一个具有 ID result 的 div 标记上。要更新 result 元素,可在每个数据操作期间清除并设置 innerHTML 属性。每个示例 JavaScript 函数由 HTML 按钮的一个 onclick 事件调用。

object store

有了数据库后我们自然希望创建一个表用来存储数据,但indexedDB中没有表的概念,而是objectStore,一个数据库中可以包含多个objectStore,objectStore是一个灵活的数据结构,可以存放多种类型数据。也就是说一个objectStore相当于一张表,里面存储的每条数据和一个键相关联。

我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。选择键的类型不同,objectStore可以存储的数据结构也有差异

事务

在对新数据库做任何事情之前,需要开始一个事务。事务中需要指定该事务跨越哪些object store。

事务具有三种模式

  1. 只读:read,不能修改数据库数据,可以并发执行
  2. 读写:readwrite,可以进行读写操作
  3. 版本变更:verionchange
当用户访问你的网站时,如果用户的浏览器支持IndexedDB,则首先触发的是upgradeneeded事件

完整示例

<!doctype html>
<html>
<head>
</head><body><script>
var db;
//检测浏览器是否支持 indexedDBOk
function indexedDBOk() {return "indexedDB" in window;
}document.addEventListener("DOMContentLoaded", function() {//判断 indexedDBOk 支持 是/否?if(!indexedDBOk) return;//打开数据库  这个变量其中一个属性是一个已存在的对象存储list,名为objectStoreNamesvar openRequest = indexedDB.open("idarticle_people6",1);openRequest.onupgradeneeded = function(e) {var thisDB = e.target.result;//通过contains方法检车某个对象是否已经存在了,如果不存在则可进行创建if(!thisDB.objectStoreNames.contains("people")) {//使用key生成器var os = thisDB.createObjectStore("people", {autoIncrement:true});//索引//os.createIndex(索引名称,列,指定某个列是否是唯一)
            os.createIndex("name", "name", {unique:false});//I want email to be unique
            os.createIndex("email", "email", {unique:true});}}openRequest.onsuccess = function(e) {db = e.target.result;//监听添加事件
        document.querySelector("#addButton").addEventListener("click", addPerson, false);document.querySelector("#getButton").addEventListener("click", getPeople, false);document.querySelector("#delete").addEventListener("click", deleteData, false);document.querySelector("#getStore").addEventListener("click", getDataByKey, false);document.querySelector("#getButton1").addEventListener("click", getDataByKey1, false);document.querySelector("#getButton2").addEventListener("click", getDataByKey2, false);}    openRequest.onerror = function(e) {//Do something for the error
    }},false);function addPerson(e) {var name = document.querySelector("#name").value;var email = document.querySelector("#email").value;console.log("About to add "+name+"/"+email);// 对象 = db.事物(将要处理的数组,事物类型)var transaction = db.transaction(["people"],"readwrite");//设置存储对象people为为读写操作,然后使用objectStore指定要操作的存储对象,存在变量storevar store = transaction.objectStore("people");//设置添加数据var person = {name:name,email:email,created:new Date()}//声明一个普通的javascript对象,使用store的add方法 增加这个对象到对象存储中var request = store.add(person);//增加数据是异步操作,增加两个事件监听
    request.onerror = function(e) {alert("Sorry, that email address already exists.");console.log("Error",e.target.error.name);console.dir(e.target);//some type of error handler
    }request.onsuccess = function(e) {console.log("Woot! Did it");}
}function getPeople(e) {var name = document.querySelector("#nameSearch").value;var endname = document.querySelector("#nameSearchEnd").value;if(name == "" && endname == "") return;// 对象 = db.事物(将要处理的数组,事物类型)var transaction = db.transaction(["people"],"readonly");//设置存储对象people为为读写操作,然后使用objectStore指定要操作的存储对象,存在变量storevar store = transaction.objectStore("people");var index = store.index("name");//Make the range depending on what type we are doingvar range;if(name != "" && endname != "") {range = IDBKeyRange.bound(name, endname);} else if(name == "") {range = IDBKeyRange.upperBound(endname);} else {range = IDBKeyRange.lowerBound(name);}var s = "";index.openCursor(range).onsuccess = function(e) {var cursor = e.target.result;if(cursor) {s += "<h2>Key "+cursor.key+"</h2><p>";for(var field in cursor.value) {s+= field+"="+cursor.value[field]+"<br/>";}s+="</p>";cursor.continue();}document.querySelector("#status").innerHTML = s;}}//清空store
function deleteData(e) {
var transaction = db.transaction(["people"],"readwrite");var store=transaction.objectStore("people");     store.clear();
}//列表查询function getDataByKey(e) { var s = ""; db.transaction(["people"], "readonly").objectStore("people").openCursor().onsuccess = function(e) { var cursor = e.target.result; if(cursor) { s += "<h2>Key "+cursor.key+"</h2><p>"; for(var field in cursor.value) { s+= field+"="+cursor.value[field]+"<br/>"; } s+="</p>"; cursor.continue(); } document.querySelector("#status2").innerHTML = s; } } //查询
function getDataByKey1(){var name = document.querySelector("#nameSearch1").value;if(name === "" ) return;var transaction = db.transaction(["people"],"readonly");var store = transaction.objectStore("people");var index = store.index("name");var request = index.get(name);request.onsuccess=function(e){ var result = e.target.result;console.log(result.email); };
}//更新
function getDataByKey2(e){var name = document.querySelector("#nameSearch2").value;if(name === "" ) return;var transaction = db.transaction(["people"],"readwrite");var store=transaction.objectStore("people"); var index = store.index("name");var request=index.get(name); request.onsuccess=function(e){ var result = e.target.result;result.email=909;store.put(result); };
}
</script><input type="text" id="name" placeholder="Name"><br/>
<input type="email" id="email" placeholder="Email"><br/>
<button id="addButton">Add Data</button><p/>Starting with: <input type="text" id="nameSearch" placeholder="Name"><br/>
Ending with: <input type="text" id="nameSearchEnd" placeholder="Name"><br/>
<button id="getButton">Get By Name Range</button><p/><p><button id="delete">delete clear</button>
</p><p><button id="getStore">查找数据(列)</button>
</p>
<p id="status2"></p>
<p/><input type="text" id="nameSearch1" placeholder="Name"><br/>
<button id="getButton1">查找数据</button><p/><p/><input type="text" id="nameSearch2" placeholder="Name"><br/>
<button id="getButton2">更新数据</button><p/>
<div id="status"></div></body>
</html>

转载于:https://www.cnblogs.com/zry2510/p/6297000.html

HTML5本地存储IndexedDB基础使用相关推荐

  1. HTML5本地存储——IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  2. HTML5本地存储——IndexedDB

    在HTML5本地存储--Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  3. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  4. HTML5本地存储不完全指南

    历史 在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择: HTTP cookie.HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服 ...

  5. HTML5 本地存储

    HTML5 本地存储 1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本 ...

  6. HTML5本地存储之Web Storage篇

    2019独角兽企业重金招聘Python工程师标准>>> Web Storage是HTML5引入的一个非常重要的功能,在前端开发中经常用到,可以在客户端本地存储数据,类似HTML4的c ...

  7. html5储存类型,html5本地存储-留言板

    HTML5每日一练之JS API-本地存储LocalStorage 留言板 | 前端开发网(W3Cfuns.com)! var Storage = { saveData:function()//保存数 ...

  8. HTML5 本地存储和内容按需加载的思路和方法

    HTML5 本地存储和内容按需加载的思路和方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:04-07 16:05:09 我要评论 本文将着重介绍HTML5本地存储和内容按需加载的思路和方法 ...

  9. HTML5本地存储使用详解

    HTML5本地存储使用详解 前言 随着Web应用的发展,需要在用户本地浏览器上存储更多的应用数据,传统的cookie存储的方案已经不能满足发展的需求,而使用服务器端存储的方案则是一种无奈的选择.HTM ...

最新文章

  1. H1标签对网站优化有什么作用?
  2. 细说plsql中的空值表达式
  3. Matlab常用的11个快捷键【注释、自动对齐、跳转指定行、设置标签and断点、自动补全、历史命令、强制中断运行、退出、单行注释转多行】
  4. MySQL授权命令grant的使用方法
  5. 无法停止‘通用卷’设备的解决方法
  6. android如何引用布局,android 动态布局与引用第三方layout中的布局
  7. 直播报名 | 从业务场景入手,吃透音视频技术
  8. ubuntu 下eclipse 启动时出现An error has occurred. See the log file的问题
  9. 在Blazor中构建数据库应用程序——第4部分——UI控件
  10. linux安装oracle tar,在linux as4上用tar方式安装oracle 10g步骤教程-Oracle
  11. 基础一:JS数据类型
  12. PwnLnX:针对Linux系统的渗透测试工具
  13. ASP字符查找替换器
  14. 学术答辩PPT模板推荐
  15. 中心极限与大数定理律的关系_21厦大数学考研 | 数列与函数极限复习建议!
  16. keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析
  17. 基于 Netty 重构 RPC 框架
  18. 字节内推 面试进度可查询 拒绝石沉大海 !!!
  19. 用Python获取照片GPS信息
  20. Jetson Nano开发套件安装

热门文章

  1. 设计模式第七讲-责任链模式
  2. Service Worker 图片加载失败处理
  3. iOS开发UI篇—核心动画简介
  4. git生成public key
  5. mongodb yum 安装
  6. 进程管理supervisor的简单说明
  7. linux mysql忘记root密码
  8. Go笔记-错误处理和defer
  9. 小程序十一:网络请求
  10. find命令详解(原创)