成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML5 Indexed DB入門導學2

譯文
開發 前端
在本篇教程中,將繼續向大家介紹如何使用IndexedDB進行CRUD(增刪改查)的功能,其中將特別將講解IndexedDB的更新和刪除功能,并且將會演示一個實際的例子,這個例子在第三篇教程中將會用到。

在本系列教程的第一篇http://developer.51cto.com/art/201310/412224.htm   中,我們向大家介紹了IndexedDB的基本知識,在本篇教程中,將繼續向大家介紹如何使用IndexedDB進行CRUD(增刪改查)的功能,其中將特別將講解IndexedDB的更新和刪除功能,并且將會演示一個實際的例子,這個例子在第三篇教程中將會用到。

更新記錄

首先看下如何在IndexedDB中更新記錄。如果記得上一篇教程的話,增加數據是很簡單的,如下:

  1.  //定義person 
  2. var person = { 
  3.     name:name, 
  4.     email:email, 
  5.     created:new Date() 
  6.   
  7. // 定義增加操作 
  8. var request = store.add(person); 

對于更新操作,如果已經在對象中已經定義了id作為key,則只需要使用put方法代替add方法即可,代碼如下:

  1. var person = { 
  2.     name:name, 
  3.     email:email, 
  4.     created:new Date(), 
  5.     id:someId 
  6.   
  7. var request = store.put(person); 

和增加的方法一樣,可以指定各類回調方法對結果進行異步處理。

刪除記錄

刪除記錄的方法是通過delete這個API去實現,下面是例子:

  1. var t = db.transaction(["people"], "readwrite"); 
  2. var request = t.objectStore("people").delete(thisId); 

同樣,可以指定各類回調方法對結果進行異步處理。

在學會了如何使用IndexedDB進行CRUD后,下面我們以一個實際的例子來設計一個簡單的記事本應用。 

記事本應用

下面我們來學習如何使用學到的IndexedDB知識,設計一個簡單的記事本應用。在應用啟動的時候,先初始化IndexedDB數據庫,并且展示一個空的表格,能讓用戶增加空的記錄。界面如下圖:

 

當先“Add Note”按鈕后,出現的界面如下圖:

可以在這里輸入要記錄的事情,然后點Save鍵保存。保存后的列表界面如下圖:

#p#

同時用戶可以再次編輯或刪除記事的內容。下面我們首先開始設計第一個頁面,注意我們使用的是bootstrap框架。

  1. <!DOCTYPE html> 
  2. <html lang="en"> 
  3.   <head> 
  4.     <meta charset="utf-8"> 
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
  6.   
  7.     <title>Note Database</title> 
  8.   
  9.     <link href="bootstrap/css/bootstrap.css" rel="stylesheet"> 
  10.     <link href="css/app.css" rel="stylesheet"> 
  11.   
  12.   </head> 
  13.   
  14.   <body> 
  15.   
  16.     <div class="navbar navbar-inverse navbar-fixed-top"> 
  17.       <div class="container"> 
  18.         <div class="navbar-header"> 
  19.           <a class="navbar-brand" href="#">Note Database</a> 
  20.         </div> 
  21.       </div> 
  22.     </div> 
  23.   
  24.     <div class="container"> 
  25.   
  26.         <div id="noteList"></div> 
  27.         <div class="pull-right"><button id="addNoteButton" class="btn btn-success">Add Note</button></div> 
  28.         <div id="noteDetail"></div> 
  29.   
  30.         <div id="noteForm"> 
  31.             <h2>Edit Note</h2> 
  32.             <form role="form" class="form-horizontal"> 
  33.             <input type="hidden" id="key"> 
  34.             <div class="form-group"> 
  35.                 <label for="title" class="col-lg-2 control-label">Title</label> 
  36.                 <div class="col-lg-10"> 
  37.                 <input type="text" id="title" required class="form-control"> 
  38.                 </div> 
  39.             </div> 
  40.             <div class="form-group"> 
  41.                 <label for="body" class="col-lg-2 control-label">Body</label>    
  42.                 <div class="col-lg-10"> 
  43.                 <textarea id="body" required class="form-control"></textarea> 
  44.                 </div> 
  45.             </div> 
  46.             <div class="form-group"> 
  47.                 <div class="col-lg-offset-2 col-lg-10"> 
  48.                     <button id="saveNoteButton" class="btn btn-default">Save Note</button> 
  49.                 </div> 
  50.             </div> 
  51.             </form> 
  52.         </div> 
  53.   
  54.     </div> 
  55.   
  56.     <script src="js/jquery-2.0.0.min.js"></script> 
  57.     <script src="bootstrap/js/bootstrap.min.js"></script> 
  58.     <script src="js/app.js"></script> 
  59.   </body> 
  60. </html> 

接下來是編寫核心的js文件,首先是一個處理日期的工具類,比較簡單:

  1. /* global console,$,document,window,alert */ 
  2. var db; 
  3.   
  4. function dtFormat(input) { 
  5.     if(!input) return ""; 
  6.     var res = (input.getMonth()+1) + "/" + input.getDate() + "/" + input.getFullYear() + " "; 
  7.     var hour = input.getHours(); 
  8.     var ampm = "AM"
  9.     if(hour === 12) ampm = "PM"
  10.     if(hour > 12){ 
  11.         hour-=12
  12.         ampm = "PM"
  13.     } 
  14.     var minute = input.getMinutes()+1; 
  15.     if(minute < 10minute = "0" + minute; 
  16.     res += hour + ":" + minute + " " + ampm; 
  17.     return res; 

接下來的代碼中,要首先檢查瀏覽器是否支持IndexedDB,如果支持IndexedDB,則打開數據庫,代碼如下:

  1. $(document).ready(function() { 
  2.   
  3.     if(!("indexedDB" in window)) { 
  4.         alert("IndexedDB support required for this demo!"); 
  5.         return; 
  6.     } 
  7.   
  8.     var $noteDetail = $("#noteDetail"); 
  9.     var $noteForm = $("#noteForm"); 
  10.   
  11.     var openRequest = window.indexedDB.open("nettuts_notes_1",1); 
  12.   
  13.     openRequest.onerror = function(e) { 
  14.         console.log("Error opening db"); 
  15.         console.dir(e); 
  16.     }; 
  17.   
  18.     openRequest.onupgradeneeded = function(e) { 
  19.   
  20.         var thisDb = e.target.result; 
  21.         var objectStore; 
  22.   
  23.         //創建記錄 
  24.         if(!thisDb.objectStoreNames.contains("note")) { 
  25.             console.log("I need to make the note objectstore"); 
  26.             objectStore = thisDb.createObjectStore("note", { keyPath: "id", autoIncrement:true });   
  27.         } 
  28.   
  29.     }; 
  30.   
  31.     openRequest.onsuccess = function(e) { 
  32.         db = e.target.result; 
  33.   
  34.         db.onerror = function(event) { 
  35.          //處理所有的數據異常 
  36.           alert("Database error: " + event.target.errorCode); 
  37.           console.dir(event.target); 
  38.         }; 
  39.   
  40.         displayNotes(); 
  41.   
  42.     }; 

#p#

在上面的代碼中,首先判斷用戶的瀏覽器是否支持IndexedDB,如果支持的話,則打開數據庫,在其中的onupgradeneeded事件中建立名為note的objectstore,并且注意這里要編寫對應的操作成功和失敗的回調處理事件。一切準備就緒后,則可以調用displayNotes()方法顯示所有的記事列表,其代碼如下:

  1. function displayNotes() { 
  2.   
  3.     var transaction = db.transaction(["note"], "readonly");   
  4.     var content="<table class='table table-bordered table-striped'><thead><tr><th>Title</th><th>Updated</th><th>&amp;nbsp;</td></thead><tbody>"
  5.   
  6.     transaction.oncomplete = function(event) { 
  7.         $("#noteList").html(content); 
  8.     }; 
  9.   
  10.     var handleResult = function(event) {   
  11.       var cursor = event.target.result;   
  12.       if (cursor) {   
  13.         content += "<tr data-key=\""+cursor.key+"\"><td class=\"notetitle\">"+cursor.value.title+"</td>"; 
  14.         content += "<td>"+dtFormat(cursor.value.updated)+"</td>"; 
  15.   
  16.         content += "<td><a class=\"btn btn-primary edit\">Edit</a> <a class=\"btn btn-danger delete\">Delete</a></td>"; 
  17.         content +="</tr>"; 
  18.         cursor.continue();   
  19.       }   
  20.       else {   
  21.         content += "</tbody></table>"; 
  22.       }   
  23.     }; 
  24.   
  25.     var objectStore = transaction.objectStore("note"); 
  26.   
  27.     objectStore.openCursor().onsuccess = handleResult
  28.   

在本系列教程的第一篇中,已經討論過如何循環讀取IndexedDB中的數據(使用的是游標 cursor,還記得么?),但在上面的這段代碼中,我們在objectStore.openCursor()事件的onsuccess方法中,指定了其回調處理代碼為handleResult,而在handleResult方法中,完成了對數據庫中數據的循環讀取列表。而在IndexedDB中允許直接在最頂層的事務中綁定onComplete事件,這就給我們帶來了方便,比如例子中可以將比如大量的文本輸出(這里的content)交給前端jQuery進行顯示處理。

接下來看刪除,編輯和增加記事的功能代碼:

  1. $("#noteList").on("click", "a.delete", function(e) { 
  2.     var thisId = $(this).parent().parent().data("key"); 
  3.   
  4.     var t = db.transaction(["note"], "readwrite"); 
  5.     var request = t.objectStore("note").delete(thisId); 
  6.     t.oncomplete = function(event) { 
  7.         displayNotes(); 
  8.         $noteDetail.hide(); 
  9.         $noteForm.hide(); 
  10.     }; 
  11.     return false; 
  12. }); 
  13.   
  14. $("#noteList").on("click", "a.edit", function(e) { 
  15.     var thisId = $(this).parent().parent().data("key"); 
  16.   
  17.     var request = db.transaction(["note"], "readwrite")   
  18.                     .objectStore("note")   
  19.                     .get(thisId);   
  20.     request.onsuccess = function(event) {   
  21.         var note = request.result; 
  22.         $("#key").val(note.id); 
  23.         $("#title").val(note.title); 
  24.         $("#body").val(note.body); 
  25.         $noteDetail.hide(); 
  26.         $noteForm.show(); 
  27.     }; 
  28.   
  29.     return false; 
  30. }); 
  31.   
  32. $("#noteList").on("click", "td", function() { 
  33.     var thisId = $(this).parent().data("key"); 
  34.     var transaction = db.transaction(["note"]);   
  35.     var objectStore = transaction.objectStore("note");   
  36.     var request = objectStore.get(thisId); 
  37.   
  38.     request.onsuccess = function(event) {   
  39.         var note = request.result; 
  40.         $noteDetail.html("<h2>"+note.title+"</h2><p>"+note.body+"</p>").show(); 
  41.         $noteForm.hide(); 
  42.     };   
  43. }); 
  44.   
  45. $("#addNoteButton").on("click", function(e) { 
  46.     $("#title").val(""); 
  47.     $("#body").val(""); 
  48.     $("#key").val(""); 
  49.     $noteDetail.hide(); 
  50.     $noteForm.show();        
  51. }); 

只要用戶讀過本系列教程的第一篇,就應該知道上面的代碼并不復雜,關鍵點是無論是編輯還是刪除記事,都是必須先找出其id,這其實通過普通的DOM操作就可以實現了。接下來看保存記事的代碼:

  1. $("#saveNoteButton").on("click",function() { 
  2.   
  3.         var title = $("#title").val(); 
  4.         var body = $("#body").val(); 
  5.         var key = $("#key").val(); 
  6.   
  7.         var t = db.transaction(["note"], "readwrite"); 
  8.   
  9.         if(key === "") { 
  10.             t.objectStore("note") 
  11.                             .add({title:title,body:body,updated:new Date()}); 
  12.         } else { 
  13.             t.objectStore("note") 
  14.                             .put({title:title,body:body,updated:new Date(),id:Number(key)}); 
  15.         } 
  16.   
  17.         t.oncomplete = function(event) { 
  18.             $("#key").val(""); 
  19.             $("#title").val(""); 
  20.             $("#body").val(""); 
  21.             displayNotes(); 
  22.             $noteForm.hide();            
  23.         }; 
  24.   
  25.         return false; 
  26.     }); 
  27.   
  28. }); 

在上面的代碼中,通過IF語句去判斷KEY是否為空,如果是空的話則表示是新增加記錄,否則就是在更新記錄。

在本系列教程的下一講,將重點介紹IndexedDB 的檢索功能和數組方面的功能。本講的代碼可以在如下連接下載:https://github.com/tutsplus/working-with-indexeddb-part-two
 

原文鏈接:http://net.tutsplus.com/tutorials/javascript-ajax/working-with-indexeddb-part-2/

責任編輯:陳四芳 來源: 51CTO
相關推薦

2013-10-08 09:54:43

Indexed

2012-10-24 14:47:50

IBMdw

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2013-01-08 11:00:20

IBMdW

2013-10-21 15:24:49

html5游戲

2011-05-13 17:36:05

HTML

2010-03-15 10:09:24

Indexed DBWeb

2017-01-03 18:09:33

HTML5本地存儲Web

2011-05-12 15:42:16

HTML5

2012-05-07 14:13:59

HTML5

2011-05-13 17:41:40

2023-03-16 09:00:00

HTML5HTML語言

2011-01-14 17:53:33

HTML5cssweb

2009-07-30 17:59:43

標記語言XHTML2HTML5

2013-03-22 08:59:57

HTML5移動應用Web App

2014-03-20 10:50:44

HTML5 定位技術

2014-12-30 17:13:51

HTML5

2015-10-23 13:44:14

巴巴獵

2012-11-07 09:43:58

IBMdw

2014-10-21 17:34:11

HTML5移動設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费婷婷 | www.国产精 | 亚洲午夜久久久 | 久久亚洲精品国产精品紫薇 | 欧美视频区 | 国产精品久久久久久婷婷天堂 | 欧美成人免费在线视频 | 亚洲成人久久久 | h片在线观看免费 | 亚洲日韩中文字幕一区 | 日本在线视频中文字幕 | www.久久久久久久久久久 | 91精品久久久久 | 亚洲欧美综合精品另类天天更新 | 欧美黄色精品 | 成人小视频在线观看 | 九九99精品 | 亚洲视频区 | 一级黄a视频 | 性高湖久久久久久久久3小时 | 99精品视频在线 | 日本激情视频中文字幕 | 91在线网站 | 国产精品成人免费 | 成人久久 | 成人欧美一区二区三区1314 | 国产精品观看 | 美国a级毛片免费视频 | 亚洲高清av在线 | 一级做a爰片性色毛片视频停止 | 一区二区三区免费 | 欧美精品一二三 | 综合久久色| 成人在线 | 蜜月va乱码一区二区三区 | 国产精品高潮呻吟久久 | 国产69久久精品成人看动漫 | 久久精品国产一区二区电影 | 中文字幕一区二区三区乱码在线 | 欧美jizzhd精品欧美巨大免费 | 精品真实国产乱文在线 |