博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript+IndexedDB实现留言板:客户端存储数据
阅读量:4287 次
发布时间:2019-05-27

本文共 8730 字,大约阅读时间需要 29 分钟。

之前看到贴友有问:用js怎么实现留言板效果。当时也写了一个,但是没有实现数据存储:

现在将之前的改写一下,原来的HTML布局不变,为了防止Google调整字体,在原来的css中加入一个样式

1: body{
2:     font-size: 20px;
3:     -webkit-text-size-adjust:none;
4: }

在google中调整字体,可以见此文:     有评论说不行,但是LZ在这个实例中测试了,是可以的

重点是js,完整的js代码修改如下:

1:
2:     var db;
3:     var arrayKey=[]
4:     var openRequest;
5:     var lastCursor;
6:
7:     var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
8:
9:     function init()
10:     {
11:         //打开数据库
12:         openRequest = indexedDB.open("messageIndexDB");
13:         //只能在onupgradeneeded创建对象存储空间
14:         openRequest.onupgradeneeded = function(e)
15:         {
16:             console.log("running onupgradeneeded");
17:             var thisDb = e.target.result;
18:             if(!thisDb.objectStoreNames.contains("messageIndexDB"))
19:             {
20:                 console.log("I need to create the objectstore");
21:                 /*
22:                  *创建对象存储空间,第一个参数必须和打开数据库的第一个参数一致
23:                  *设置键名是id,并且可以自增.
24:                  *autoIncrement默认是false,keyPath默认null
25:                  */
26:                 var objectStore = thisDb.createObjectStore("messageIndexDB", { keyPath: "id", autoIncrement:true });
27:                 /*
28:                  *创建索引
29:                  *第一个参数是索引名,第二个是属性名,第三个设置索引特性
30:                  */
31:                 objectStore.createIndex("name", "name", { unique: false });
32:             }
33:         }
34:
35:         openRequest.onsuccess = function(e)
36:         {
37:             //e.target.result返回一个数据库实例
38:             db = e.target.result;
39:             db.onerror = function(event)
40:             {
41:               alert("数据库错误: " + event.target.errorCode);
42:               console.dir(event.target);
43:             };
44:             if(db.objectStoreNames.contains("messageIndexDB"))
45:             {
46:                 console.log("contains messageIndexDB");
47:                 //读写方式开启事务
48:                 var transaction = db.transaction(["messageIndexDB"],"readwrite");
49:                 transaction.oncomplete = function(event)
50:                 {
51:                     //  console.log("All done!");
52:                 };
53:                 transaction.onerror = function(event)
54:                 {
55:                     // 错误处理
56:                     console.dir(event);
57:                 };
58:                 var content= document.querySelector("#content");
59:
60:                 //得到messageIndexDB的objectStore对象
61:                 var objectStore = transaction.objectStore("messageIndexDB");
62:
63:                 //游标查询
64:                 objectStore.openCursor().onsuccess = function(event)
65:                 {
66:                     //event.target.result获取存储空间的下一个对象
67:                     var cursor = event.target.result;
68:                     var flag=0;
69:
70:                     //判断是否存在下一个对象,不存在是curson为null
71:                     if (cursor)
72:                     {
73:                           console.log(cursor.key); //获取键
74:                           console.dir(cursor.value); //实际对象,一个Object实例
75:                         var msgList= document.querySelector("#messageList");
76:                         var msgDiv=document.createElement("div");
77:                         var msgTxt = document.createTextNode(cursor.value[flag]["name"]+"说:"+cursor.value[flag]["content"]);
78:                         msgDiv.id=cursor.key;
79:                         msgDiv.appendChild(msgTxt);
80:                         msgList.appendChild(msgDiv);
81:                         arrayKey.push(cursor.key);
82:                         flag++;
83:                         lastCursor=cursor.key;
84:                         cursor.continue();   //将游标下移一项
85:                     }
86:                     else
87:                     {
88:                           console.log("Done with cursor");
89:                     }
90:                 };
91:                 //错误处理
92:                  objectStore.openCursor().οnerrοr=function(event){
93:                     console.dir(event);
94:                 };
95:             }
96:         };
97:
98:         openRequest.onerror = function (event) {
99:             // 对request.error做一些需要的处理!
100:             console.log("your web may not support IndexedDB,please check.");
101:         };
102:
103:         //焦点处理
104:         document.querySelector("#message").addEventListener("focus",function()
105:             {
106:                 this.value = "";
107:             });
108:         document.querySelector("#name").addEventListener("focus",function()
109:             {
110:                 this.value = "";
111:             });
112:
113:         //添加数据
114:         document.querySelector("#btn1").addEventListener("click", function()
115:         {
116:             var content=document.querySelector("#message").value;
117:             var name=document.querySelector("#name").value;
118:             /*var address=document.querySelector("#address").value;*/
119:             var messageIndexDB=[{
"name":name,"content":content}];
120:
121:             var transaction = db.transaction(["messageIndexDB"], "readwrite");
122:             transaction.oncomplete = function(event)
123:             {
124:                // console.log("transaction complete");
125:             };
126:             transaction.onerror = function(event)
127:             {
128:                 console.dir(event);
129:             };
130:              //得到messageIndexDB的objectStore对象
131:             var objectStore = transaction.objectStore("messageIndexDB");
132:             objectStore.add(messageIndexDB);
133:             objectStore.openCursor().onsuccess = function(event)
134:             {
135:                 cursor = event.target.result;
136:                 var key;
137:                 if(lastCursor==null)
138:                 {
139:                     key=cursor.key;
140:                     lastCursor=key;
141:                 }
142:                 else
143:                 {
144:                     key=++lastCursor;
145:                 }
146:                 var msgList= document.querySelector("#messageList");
147:                 var msgDiv=document.createElement("div");
148:                 msgDiv.id=key;
149:                 var msgTxt = document.createTextNode(name+"说:"+content);
150:                 msgDiv.appendChild(msgTxt);
151:                 msgList.appendChild(msgDiv);
152:                 arrayKey.push(key);
153:                 console.log("success add new record!key:"+key);
154:                 console.dir(messageIndexDB);
155:             }
156:         });
157:         //删除
158:         document.querySelector("#delete").addEventListener("click", function()
159:         {
160:             if(arrayKey.length==0){
161:                 console.log("no data to delete!");
162:             }
163:             else
164:             {
165:                 var transaction = db.transaction(["messageIndexDB"], "readwrite");
166:                 transaction.oncomplete = function(event)
167:                 {
168:                        //    console.log("transaction complete!");
169:                 };
170:
171:                 transaction.onerror = function(event)
172:                 {
173:                   console.dir(event);
174:                 };
175:                  //得到messageIndexDB的objectStore对象
176:                 var objectStore = transaction.objectStore("messageIndexDB");
177:                 var removeKey=arrayKey.shift();
178:                 //获取key
179:                 var getRequest=objectStore.get(removeKey);
180:                 getRequest.onsuccess=function(e)
181:                 {
182:                     var result =getRequest.result;
183:                     console.dir(result);
184:                 }
185:                 //删除key
186:                 var request=objectStore.delete(removeKey);
187:                 request.onsuccess = function(e)
188:                 {
189:                   console.log("success delete record!");
190:                 };
191:                 request.onerror = function(e)
192:                 {
193:                   console.log("Error delete record:", e);
194:                 };
195:                 //隐藏要删除的元素
196:                 document.getElementById(removeKey).style.display="none";
197:             }
198:         });
199:     }
200:     window.addEventListener("DOMContentLoaded", init, false);

要注意一点的是,在创建对象存储空间的时候,必须在openRequest.onupgradeneeded 中创建,否则出错

FF4+,和google支持IndexedDB,IE10+据说支持,但LZ测试了,不支持,有错误还请指正。
由于IndexedDB不能实现共享,所以每个客户端打开时IndexedDB保存的数据不一致,LZ是在Google中测试的,打开控制台,查看数据如下

添加留言:

删除留言:

来源:

你可能感兴趣的文章
C语言char *p 和 cha'r p[10]的区别/sizeof和strlen的区别
查看>>
iOS发布新应用/更新新版本的流程
查看>>
java的API/Object
查看>>
java基础/Scanner类/String类
查看>>
java基础/StringbBuffer/StringBuilder
查看>>
iOS 公钥/私钥/不对称加密
查看>>
java/数组排序/冒泡排序/选择排序/二分查找/Arrays/进制转换/装箱/拆箱/
查看>>
java/Character类/正则表达式/Pattern/Matcher/Math/Random类
查看>>
java/System/BigInteger/BigDecimal/Date/Calender
查看>>
java/对象数组/集合
查看>>
java/数据结构/栈/队列/数组/链表/ArrayList/泛型/增强for/静态导入/可变参数
查看>>
java基础/集合框架/set/hasset/linkHasset/TreeSet/
查看>>
java基础/map/hasmap/linkedhasmap/treemap/collections工具类
查看>>
java集合的总结
查看>>
java. tr'y--catch/IO流/file/
查看>>
C语言socket编程总结(一)getaddrinfo()函数详解
查看>>
C语言socket编程总结(二) inet_pton,/inet_ntop
查看>>
C语言socket编程总结(三) struct sockaddr_in /struct sockaddr_in6/struct addrinfo 结构体
查看>>
C语言socket总结(四)htonl/ntohl/ntohs/ntohs/
查看>>
C 语言socket编程基础/memset()
查看>>