基于Firefox 10的IndexedDB实例演示

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

DEMO演示链接 (firefox 10+ only)

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

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

首先是html代码:

  1. _body onload="init()"> 
  2.     _button onclick="clickAddBtn()">Add_/button> 
  3.     _ul id="list">_/ul> 
  4. _/body> 

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

  1. var db;  
  2. var list = $('#list'); 

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

  1. function init() {  
  2.     var req = window.mozIndexedDB.open('readinglist', '1.0');  
  3.     req.onsuccess = function (e) {  
  4.         db = this.result;  
  5.         // TODO: 连接成功后展示列表  
  6.     };  
  7.     req.onupgradeneeded = function (e) {  
  8.         db = this.result;  
  9.         // TODO: 版本不同时创建一个新的object store  
  10.     };  

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

  1. function init() {  
  2.     var req = window.mozIndexedDB.open('readinglist', '1.0');  
  3.     req.onsuccess = function (e) {  
  4.         db = this.result;  
  5.         showList();  
  6.     };  
  7.     req.onupgradeneeded = function (e) {  
  8.         db = this.result;  
  9.         db.createObjectStore('links', {keyPath: 'url'});  
  10.     };  

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

  1. function add(title, url) {  
  2.     var link = {  
  3.         title: title,  
  4.         url: url  
  5.     }; // 创建要存储的对象  
  6.     var transaction = db.transaction('links', IDBTransaction.READ_WRITE);  
  7.     var store = transaction.objectStore('links');  
  8.     var req = store.put(link); // put的作用是key存在时做更新处理,不存在是做添加处理  
  9.     req.onsuccess = showList; // 添加成功后重新展示列表  
  10. }  
  11.  
  12. function remove(url) {  
  13.     var transaction = db.transaction('links', IDBTransaction.READ_WRITE);  
  14.     var store = transaction.objectStore('links');  
  15.     var req = store.delete(url); // 删除此链接  
  16.     req.onsuccess = showList; // 删除成功后重新展示列表  
  17. }  
  18.  
  19. function showList() {  
  20.     // TODO: clear element: #list  
  21.  
  22.     var transaction = db.transaction('links');  
  23.     var store = transaction.objectStore('links');  
  24.     var range = IDBKeyRange.lowerBound(0); // 创建关键字范围描述  
  25.     var req = store.openCursor(range); // 创建在上述范围内遍历的游标  
  26.     req.onsuccess = function (e) {  
  27.         var result = this.result;  
  28.         if (result) {  
  29.             var link = result.value;  
  30.             // TODO: append this link to element: #list  
  31.             result.continue();  
  32.         }  
  33.     };  

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

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

  1. function showList() {  
  2.     list.empty();  
  3.  
  4.     var transaction = db.transaction('links');  
  5.     var store = transaction.objectStore('links');  
  6.     var range = IDBKeyRange.lowerBound(0); // 创建关键字范围描述  
  7.     var req = store.openCursor(range); // 创建在上述范围内遍历的游标  
  8.     req.onsuccess = function (e) {  
  9.         var result = this.result;  
  10.         if (result) {  
  11.             var link = result.value;  
  12.             appendLink(link);  
  13.             result.continue();  
  14.         }  
  15.     };  
  16. }  
  17.  
  18. function appendLink(link) {  
  19.     var url = link.url;  
  20.     var title = link.title;  
  21.     var li = $('_li>_a href="#" target="_blank">_/a> _button>X_/button>_/li>');  
  22.     li.find('a').attr('title', title).attr('href', url).text(title);  
  23.     li.find('button').click(function (e) {  
  24.         remove(link.url);  
  25.     });  
  26.     list.append(li);  
  27. }  
  28.  
  29. function clickAddBtn(e) {  
  30.     var title = prompt('please input the title') || '[No title]';  
  31.     var url = prompt('please input the url', 'http://');  
  32.     if (title && url) {  
  33.         add(title, url);  
  34.     }  

DEMO演示链接 (firefox 10+ only)

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

【系列文章】

  1. IndexedDB的JS接口设计详解
  2. 浅析IndexedDB存数结构
  3. 调试IndexedDB应用程序

原文:http://bulaoge.net/topic.blg?dmn=g3g4&tid=2335030#Content

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/301943.html<

(0)
运维的头像运维
上一篇2025-05-24 13:53
下一篇 2025-05-24 13:54

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注