_buttono" />

IndexedDB技术简介(三)

系统 1654 0

今天做一个IndexedDB(以下简称IDB)的demo,运行环境是Firefox 10。

DEMO演示链接  (firefox 10+ only)

我们做一个阅读列表的页面,可以让用户把任意网址存入这个阅读列表中,并为每一个网址起一个名字,也可以随时删除,且列表可以按网址自动去重。

正如上一篇文章介绍的步骤,我们先初始化数据库,然后建表,然后把添加/删除/读取网址的事件和数据库操作绑定在一起。

首先是html代码:

    _body onload="
    
      init()
    
    ">

    _button onclick="
    
      clickAddBtn()
    
    ">Add_/button>

    _ul 
    
      id="list"
    
    >_/ul>

_/body>
  

为了演示方便,我们引入jQuery作界面处理,再声明一个全局变量 db ,作为数据库连接的句柄;再声明一个全局变量 list ,作为网页中列表元素的jQuery句柄。

    var db;

var list = $('#list');
  

然后定义数据库初始化的行数 init

    function init() {

    var req = window.
    
      mozIndexedDB
    
    .open('readinglist', '1.0');

    req.onsuccess = function (e) {

        
    
      db = this.result;
    
    

        // TODO: 连接成功后展示列表

    };

    req.onupgradeneeded = function (e) {

        
    
      db = this.result;
    
    

        // TODO: 版本不同时创建一个新的object store

    };

}
  

这段代码的作用是初始化数据库( readinglist )连接,并在第一次连接数据库时创建表( links )。我们把展示列表的函数定义为 showList() ,把创建表的代码也补充完整,即:

    function init() {

    var req = window.mozIndexedDB.open('readinglist', '1.0');

    req.onsuccess = function (e) {

        db = this.result;

        
    
      showList();
    
    

    };

    req.onupgradeneeded = function (e) {

        db = this.result;

        
    
      db.createObjectStore('links', {keyPath: 'url'});
    
    

    };

}
  

然后我们定义添加/删除/展示链接的函数: add(title, url) / remove(url) / showList()

    function add(
    
      title, url
    
    ) {

    var 
    
      link
    
     = {

        title: title,

        url: url

    }; // 创建要存储的对象

    var transaction = db.transaction('links', IDBTransaction.READ_WRITE);

    var store = transaction.objectStore('links');

    
    
      var req = store.put(link);
    
     // put的作用是key存在时做更新处理,不存在是做添加处理

    
    
      req.onsuccess = showList;
    
     // 添加成功后重新展示列表

}



function remove(
    
      url
    
    ) {

    var transaction = db.transaction('links', IDBTransaction.READ_WRITE);

    var store = transaction.objectStore('links');

    
    
      var req = store.delete(url);
    
     // 删除此链接

    
    
      req.onsuccess = showList;
    
     // 删除成功后重新展示列表

}



function showList() {

    // TODO: clear element: #list



    var transaction = db.transaction('links');

    var store = transaction.objectStore('links');

    
    
      var range = IDBKeyRange.lowerBound(0);
    
     // 创建关键字范围描述

    
    
      var req = store.openCursor(range);
    
     // 创建在上述范围内遍历的游标

    req.onsuccess = function (e) {

        var result = this.result;

        if (result) {

            var link = result.value;

            // TODO: append this link to element: #list

            
    
      result.continue();
    
    

        }

    };

}
  

注意这里的 IDBKeyRange store.openCursor 是用来遍历列表的,前者确定遍历的范围,后者根据前者的范围逐条触发 onsuccess 事件,这里定义的遍历范围是大于0,即所有非空的url,其实所有js类型的值都是可以在一起比大小的,如果想测试 比较任意两个key的大小 ,可以运行函数 window.mozIndexedDB.cmp(any first, any second)

最后,我们把最后两个 TODO 的部分补充完整,再把界面上的事件绑定好。编码工作就完成了。

    function showList() {

    
    
      list.empty();
    
    



    var transaction = db.transaction('links');

    var store = transaction.objectStore('links');

    var range = IDBKeyRange.lowerBound(0); // 创建关键字范围描述

    var req = store.openCursor(range); // 创建在上述范围内遍历的游标

    req.onsuccess = function (e) {

        var result = this.result;

        if (result) {

            var link = result.value;

            
    
      appendLink(link);
    
    

            result.continue();

        }

    };

}



function appendLink(link) {

    var url = link.url;

    var title = link.title;

    var li = $('_li>_a href="#" target="_blank">_/a> _button>X_/button>_/li>');

    li.find('a').attr('title', title).attr('href', url).text(title);

    li.find('button').click(function (e) {

        
    
      remove(link.url);
    
    

    });

    list.append(li);

}



function clickAddBtn(e) {

    var title = prompt('please input the title') || '[No title]';

    var url = prompt('please input the url', 'http://');

    if (title && url) {

        
    
      add(title, url);
    
    

    }

}
  


DEMO演示链接  (firefox 10+ only)

下一篇讨论webkit下使用IDB的注意事项,并提供兼容问题的解决办法。

IndexedDB技术简介(三)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论