IndexedDB具有以下特点。

(1)键值对储存。 IndexedDB内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括JavaScript对象。在对象仓库中,数据以“键值对”的形式保存,每一个数据都有对应的键名,键名是独一无二的,不能有重复,否则会抛出一个错误。

(2)异步。 IndexedDB操作时不会锁死浏览器,用户依然可以进行其他操作,这与localStorage形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

(3)支持事务。 IndexedDB支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回到事务发生之前的状态,不存在只改写一部分数据的情况。

(4)同域限制 IndexedDB也受到同域限制,每一个数据库对应创建该数据库的域名。来自不同域名的网页,只能访问自身域名下的数据库,而不能访问其他域名下的数据库。

(5)储存空间大 IndexedDB的储存空间比localStorage大得多,一般来说不少于250MB。IE的储存上限是250MB,Chrome和Opera是剩余空间的某个百分比,Firefox则没有上限。

(6)支持二进制储存。 IndexedDB不仅可以储存字符串,还可以储存二进制数据。

目前,Chrome 27+、Firefox 21+、Opera 15+和IE 10+支持这个API,但是Safari完全不支持。

 

<!DOCTYPE html>
<html>

<head>
    <title>indexedDB:浏览器端数据库 </title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="description" content="">
    <meta name="keywords" content="">
    <script src="http://www.xueersi.com/lib/jQuery/1.11.1/jquery.min.js?1458897912"></script>
    <style type="text/css">
      ul,li{
          list-style: none;
          float: left;
          width: 100%;
      }

</style>
</head>
<body>
 <button id="add">添加数据</button>
 <button id="get">获取数据</button>
 <button id="delete">删除一条数据</button>
 <button id="updata">更新数据</button>
 <button id="clear">清空object store</button>
 <ul id="display"></ul>
 
</body>
</html>

<script type="text/javascript">
 //ie浏览器需要在测试环境中才能运动
  const customerData = [
      { ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" },
      { ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" },
      { ssn: "6-66-66", name: "duxinli", age: 38, email: "duxinli@home.org" }
    ];
    const dbName = "test_duxinli_DB";

var request = indexedDB.open(dbName, 2);

request.onerror = function(event) {
      // 错误处理程序在这里。
    };
    var db;
    request.onupgradeneeded = function(event) {
      db = event.target.result;

// 创建一个对象存储空间来持有有关我们客户的信息。
      // 我们将使用 "ssn" 作为我们的 key path 因为它保证是唯一的。
      var objectStore = db.createObjectStore("customers", { keyPath: 'ssn', autoIncrement: true });

// 创建一个索引来通过 name 搜索客户。
      // 可能会有重复的,因此我们不能使用 unique 索引。
      objectStore.createIndex("name", "name", { unique: false });

// 创建一个索引来通过 email 搜索客户。
      // 我们希望确保不会有两个客户使用相同的 email 地址,因此我们使用一个 unique 索引。
      objectStore.createIndex("email", "email", { unique: false });

// 在新创建的对象存储空间中保存值
      for (var i in customerData) {
         objectStore.add(customerData[i]);
      }
    };
    request.onsuccess = function(e) {
        console.log("Success!");
        db = e.target.result;
    }
    
    request.onerror = function(e) {
        console.log("Error");
        console.dir(e);
    }
     
     //获取数据
    function displayPubList() {

$('#display').empty();
            var tx = db.transaction('customers', 'readonly');
            var store = tx.objectStore('customers');
            var req;

req = store.count();
            console.log(req)
            req.onsuccess = function(evt) {
              console.log(evt.target.result)
            };
            req.onerror = function(evt) {
              console.error("add error", this.error);
            };
            req.onerror = function(evt) {
              console.error("add error", this.error);
              displayActionFailure(this.error);
            };

req = store.openCursor();
            req.onsuccess = function(evt) {
              var cursor = evt.target.result;
              if(cursor){
                   var result = evt.target.result.value;

var val = result.ssn + "~~~~~~~~"+ result.name + "~~~~~~~~"+ result.age + "~~~~~~~~"+ result.email;

$('#display').append('<li>'+ val+'</li>')
                           
                  cursor.continue();
              }

}

}
    
    function addPublication() {
        if (!db) {
          return;
        }
        //点击快了i相同就会报错,ssn键值不能相同
        var i = Date.parse(new Date()).toString().substr(0,10);
        var tx = db.transaction('customers', 'readwrite');
        var store = tx.objectStore('customers');
        var req = store.add({ ssn: "8-88-88-"+i, name: "xiaohong"+i, age: 40, email: "xiaohong-"+i+"-@home.org" });
        req.onsuccess = function (evt) {
          displayPubList();
        };
        req.onerror = function() {
          console.error("add error", this.error);
        };
    }

$(function(){
       $('#get').click(function(){
        displayPubList();
    })
    $('#add').click(function(){
        addPublication();
    })

$('#delete').click(function(evt) {
          var k = '444-44-4444';
          var tx = db.transaction('customers', 'readwrite');
          var store = tx.objectStore('customers');

var req = store.get(k);
          req.onsuccess = function(evt) {
            var record = evt.target.result;

if (typeof record != 'undefined') {
               req = store.delete(k);
            }
            displayPubList();
          };
          req.onerror = function (evt) {
            console.error("delete:", evt.target.errorCode);
          };

});
    //更新数据
    $('#updata').click(function(){
        var tx = db.transaction('customers', 'readwrite');
        var store = tx.objectStore('customers');
        var req = store.get('555-55-5555');
        req.onsuccess=function(e){
            var student=e.target.result;
            if(typeof record != 'undefined'){
                student.age=26;
                student.name="hanjinshan";
                student.email="hanjinshan@home.org";
                store.put(student);
            }
           
            displayPubList();
        };
    });

//删除数据仓库
    $('#clear').click(function(){
        var tx = db.transaction('customers', 'readwrite');
        var store = tx.objectStore('customers');
        store.clear();
        displayPubList();
    })
    
    /*调用数据库实例的deleteObjectStore方法可以删除一个object store,这个就得在onupgradeneeded里面调用了
    if(db.objectStoreNames.contains('students')){
        db.deleteObjectStore('customers');
    }*/

})
</script>

js IndexedDB:浏览器端数据库的demo实例的更多相关文章

  1. html5 浏览器端数据库

    为什么使用浏览器端数据库:随着浏览器的处理能力不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少用户等待从服务器获取数据的时间. 一.localStorage  — 本地存储  可 ...

  2. HTML 5浏览器端数据库

    HTML 5浏览器端数据库为什么要使用浏览器端数据库:随着浏览器处理能力的增强,越来越多的双喜鸟网站开始考虑在客户端存储大量的数据,这可以减少用户从服务器获取数据的等待时间. 1.本地存储-本地存储可 ...

  3. [转] js在浏览器端对二进制流进行AES加密和解密

    开始解密 简单了解一下所用的的AES加密算法,我们用的是AES的CFB加密方式,服务端会提供给我一个key和iv的二进制字节串.密文也是二进制字节串. 我用的加密/解密插件: crypto-js 一般 ...

  4. 遵循amd规范的require.js(适合浏览器端)

    1. 下载require.js 2. 引用 html <!DOCTYPE html> <html lang="en"> <head> <m ...

  5. 浏览器端JS导出EXCEL

    浏览器端JS导出EXCEL FileSaver.js 实现了在本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器支持文件保存.FileSaver.js 在客户端保存文件 ...

  6. 实例PK(Vue服务端渲染 VS Vue浏览器端渲染)

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  7. Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例

    Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和WeUI的组件库 ...

  8. JS神经网络deeplearn.js:浏览器端机器智能框架

    JS神经网络deeplearn.js:浏览器端机器智能框架 通过 deeplearn.js,可以实现在浏览器中训练神经网络模型,也可在推理阶段运行预训练模型. deeplearn.js 以 TypeS ...

  9. 如何让Node.js运行在浏览器端

    Node.js又称服务端JavaScript.今天我为了解决一个问题,通过搜索引擎找到了如何将Node.js转成浏览器端可以运行的javascript.尽管这种方式有其局限性,但是还是可以用的. 1. ...

随机推荐

  1. 搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例

    http://blog.csdn.net/e421083458/article/details/21529969 常用的命令 ps -ef|grep searchd 如果你开了search服务后,你命 ...

  2. .NET Core也可以使用MongoDB了

    可能是由于.NET Core还不是正式版的缘故吧,MongoDB的官方Driver(http://mongodb.github.io/mongo-csharp-driver/)一直不支持.NET Co ...

  3. phoenix 开发API系列 目录

    phoenix 开发API系列(一)创建简单的http api phoenix 开发API系列(二)phoenix 各类 api 实现方式 phoenix 开发API系列(三)phoenix api ...

  4. React Native移动框架功能研究

    React Native移动框架功能研究 此篇只研究React Native框架的功能. 一.React Natvie是什么 React Native是使用React(或者说JS)来开发原生APP的框 ...

  5. Github教程(0)

    Git下载:https://git-for-windows.github.io/ 我下载的版本是:Git-2.6.3-64-bit.exe 安装:略 默认选项点击"下一步"即可 安 ...

  6. 作业二:Github注册账户过程

    Github注册账户过程如下: Github的注册及使用说明: [1]http://www.aehyok.com/Blog/Detail/73.html [2] http://www.cnblogs. ...

  7. 源代码版本管理与项目管理软件的认识与github的注册

    源代码版本管理软件: 主要有:svn,cvs,hg,git,VSS 这些工具主要是一种记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.Perforce,StarTeam)- ...

  8. 深入理解MVVM模式中Silverlight的Trigger、Action和Behavior及Silverlight的继承机制

    接触Silverlight已经有两三个月了,开始一直感觉他和Winform很相似,拖拖控件就行了,所以一直把经历放在了研究后台和服务器交互和性能优化上面,很少去仔细研究Silverlight的页面.前 ...

  9. IOS UIView 03- 自定义 Collection View 布局

    注:本人是翻译过来,并且加上本人的一点见解. 前言 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一颗新星.它和 UITableView 共享一套 API ...

  10. nginx1

    简介: Nginx全程是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 安装 配 ...