必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

禁止转载,WEB应用在用户浏览器端存储数据

2019-09-19 08:47 来源:未知

总结

  1. 使用indexedDB.open(dbName, version)张开贰个数据库连接
  2. 使用indexedDB.deleteDatabase(dbName)除去贰个数据库
  3. 在数据库对象db上使用createObjectStore(storeName, config)创立对象存储空间
  4. 在对象存款和储蓄空间objectStore上使用createIndex(indexName, keyName, config)制造索引
  5. 对数据库的操作都急需通过事务完成: var transction = db.transaction([storeName], mode)
  6. 数据库的增加和删除改查均通过objectStore对象完毕,var objectStore = transaction.objectStore(storeName)
  7. 对数据库数据操作有: add()get()delete()put等方法
  8. 寻找数据能够动用索引: objectStore.index(indexName)
  9. 遍历和过滤数据能够应用游标: openCursor(keyRange, direction)

连天数据库

要使用它必需先开采,通过 indexDB.open(name, version)主意展开一个数据库

  • name : 表示数据要张开的数据库的称谓
  • version:为开荒数据库的版本号

长远深入分析HTML5中的IndexedDB索引数据库,html5indexeddb

那篇小说主要介绍了深切分析HTML5中的IndexedDB索引数据库,富含事务锁等基本成效的相关应用示例,须要的爱人可以参见下

介绍 IndexedDB是HTML5 WEB数据库,允许HTML5 WEB应用在客户浏览器端存款和储蓄数据。对于利用来讲IndexedDB特别强劲、有用,能够在顾客端的chrome,IE,Firefox等WEB浏览器中蕴藏大量数据,上面简介一下IndexedDB的基本概念。
 
什么是IndexedDB IndexedDB,HTML5新的数额存款和储蓄,能够在客商端存款和储蓄、操作数据,能够使应用加载地更加快,更加好地响应。它差异于关系型数据库,具有数据表、记录。它影响着我们统一筹划和创设应用程序的措施。IndexedDB 创设有数据类型和简易的JavaScript长久对象的object,每一种object能够有目录,使其卓有成效地询问和遍历整个会集。本文为你提供了什么在Web应用程序中接纳IndexedDB的真实事例。
 
开始 咱俩需求在奉行前满含下前边置代码

JavaScript Code复制内容到剪贴板

  1. var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;   
  2.     
  3. //prefixes of window.IDB objects   
  4. var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;   
  5. var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange   
  6.     
  7. if (!indexedDB) {   
  8. alert("Your browser doesn't support a stable version of IndexedDB.")   
  9. }  

 
打开IndexedDB 在开立数据库从前,大家率先须要为数据库创立数量,要是我们有如下的客户消息:

JavaScript Code复制内容到剪贴板

  1. var userData = [   
  2. { id: "1", name: "Tapas", age: 33, email: "[email protected]" },   
  3. { id: "2", name: "Bidulata", age: 55, email: "[email protected]" }   
  4. ];  

前几天大家必要用open()方法张开大家的数据库:

JavaScript Code复制内容到剪贴板

  1. var db;   
  2. var request = indexedDB.open("databaseName", 1);   
  3.     
  4. request.onerror = function(e) {   
  5. console.log("error: ", e);   
  6. };   
  7.     
  8. request.onsuccess = function(e) {   
  9. db = request.result;   
  10. console.log("success: "+ db);   
  11. };   
  12. request.onupgradeneeded = function(e) {   
  13.     
  14. }  

如上所示,大家曾经展开了名称叫"databaseName",内定版本号的数据库,open()方法有七个参数:
1.第一个参数是数据库名称,它会检查评定名字为"databaseName"的数据库是或不是早就存在,要是存在则打开它,不然成立新的数据库。
2.次之个参数是数据库的版本,用于客商更新数据库结构。
 
onSuccess处理 发生成功事件时“onSuccess”被触发,假使全部成功的呼吁都在此处理,我们能够透过赋值给db变量保存伏乞的结果供之后选择。
 
onerror的管理程序 发出错误事件时“onerror”被触发,假使打开数据库的进度中倒闭。
 
Onupgradeneeded管理程序 若果你想翻新数据库(成立,删除或改动数据库),那么你必需贯彻onupgradeneeded管理程序,使您能够在数据库中做其他更动。 在“onupgradeneeded”管理程序中是能够改换数据库的布局的举世无双地点。
 
始建和增添数据到表:
IndexedDB使用对象存款和储蓄来累积数据,并非因而表。 每当二个值存款和储蓄在对象存储中,它与多个键相关联。 它同意大家创设的别样对象存款和储蓄索引。 索引允许大家访谈存款和储蓄在目的存款和储蓄中的值。 上面包车型客车代码展现了什么创造对象存款和储蓄并插入预先筹划好的多少:

JavaScript Code复制内容到剪贴板

  1. request.onupgradeneeded = function(event) {   
  2. var objectStore = event.target.result.createObjectStore("users", {keyPath: "id"});   
  3. for (var i in userData) {   
  4. objectStore.add(userData[i]);    
  5. }   
  6. }  

作者们使用createObjectStore()方法成立四个指标存储。 此方法接受五个参数:

  • 储存的名目和参数对象。 在此间,我们有二个名字为"users"的对象存款和储蓄,并定义了key帕特h,那是目的独一性的性质。 在这里,我们选用“id”作为keyPath,那么些值在指标存款和储蓄中是唯一的,大家无法不确定保证该“ID”的属性在指标存款和储蓄中的每一个对象中设有。 一旦创设了指标存储,大家得以开端接纳for循环加多数据进去。
     
    手动将数据增加到表:
    咱俩能够手动增多额外的数额到数据库中。

JavaScript Code复制内容到剪贴板

  1. function Add() {   
  2. var request = db.transaction(["users"], "readwrite").objectStore("users")   
  3. .add({ id: "3", name: "Gautam", age: 30, email: "[email protected]" });   
  4.     
  5. request.onsuccess = function(e) {   
  6. alert("Gautam has been added to the database.");   
  7. };   
  8.     
  9. request.onerror = function(e) {   
  10. alert("Unable to add the information.");    
  11. }   
  12.     
  13. }  

前面大家在数据库中做其余的CRUD操作(读,写,修改),必得利用工作。 该transaction()方法是用来钦定大家想要进行事务管理的对象存款和储蓄。 transaction()方法接受3个参数(第三个和第七个是可选的)。 第二个是大家要管理的靶子存款和储蓄的列表,第三个钦定大家是还是不是要只读/读写,第3个是本子变化。
 
从表中读取数据 get()方法用于从指标存款和储蓄中寻找数据。 大家前边已经设置对象的id作为的keyPath,所以get()方法将追寻具备同等id值的靶子。 下边包车型大巴代码将赶回大家命名叫“Bidulata”的对象:

JavaScript Code复制内容到剪贴板

  1. function Read() {   
  2. var objectStore = db.transaction(["users"]).objectStore("users");   
  3. var request = objectStore.get("2");   
  4. request.onerror = function(event) {   
  5. alert("Unable to retrieve data from database!");   
  6. };   
  7. request.onsuccess = function(event) {    
  8. if(request.result) {   
  9. alert("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email);   
  10. } else {   
  11. alert("Bidulata couldn't be found in your database!");    
  12. }   
  13. };   
  14. }  

 
从表中读取全体数据
上边包车型地铁格局搜索表中的全数数据。 这里我们采纳游标来搜寻对象存款和储蓄中的全体数据:

JavaScript Code复制内容到剪贴板

  1. function ReadAll() {   
  2. var objectStore = db.transaction("users").objectStore("users");    
  3. var req = objectStore.openCursor();   
  4. req.onsuccess = function(event) {   
  5. db.close();   
  6. var res = event.target.result;   
  7. if (res) {   
  8. alert("Key " + res.key + " is " + res.value.name + ", Age: " + res.value.age + ", Email: " + res.value.email);   
  9. res.continue();   
  10. }   
  11. };   
  12. req.onerror = function (e) {   
  13. console.log("Error Getting: ", e);   
  14. };    
  15. }  

该openCursor()用于遍历数据库中的多少个记录。 在continue()函数中持续读取下一条记下。
去除表中的笔录 上边包车型客车法子从目的中删除记录。

JavaScript Code复制内容到剪贴板

  1. function Remove() {    
  2. var request = db.transaction(["users"], "readwrite").objectStore("users").delete("1");   
  3. request.onsuccess = function(event) {   
  4. alert("Tapas's entry has been removed from your database.");   
  5. };   
  6. }  

我们要将对象的keyPath作为参数字传送递给delete()方法。
 
末了代码
上面包车型大巴办法从目的源中删除一条记下:

JavaScript Code复制内容到剪贴板

  1. <!DOCTYPE html>  
  2. <head>  
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  4. <title>IndexedDB</title>  
  5. <script type="text/javascript">  
  6. var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;   
  7.     
  8. //prefixes of window.IDB objects   
  9. var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;   
  10. var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange   
  11.     
  12. if (!indexedDB) {   
  13. alert("Your browser doesn't support a stable version of IndexedDB.")   
  14. }   
  15. var customerData = [   
  16. { id: "1", name: "Tapas", age: 33, email: "[email protected]" },   
  17. { id: "2", name: "Bidulata", age: 55, email: "[email protected]" }   
  18. ];   
  19. var db;   
  20. var request = indexedDB.open("newDatabase", 1);   
  21.     
  22. request.onerror = function(e) {   
  23. console.log("error: ", e);   
  24. };   
  25.     
  26. request.onsuccess = function(e) {   
  27. db = request.result;   
  28. console.log("success: "+ db);   
  29. };   
  30.     
  31. request.onupgradeneeded = function(event) {   
  32.     
  33. }   
  34. request.onupgradeneeded = function(event) {   
  35. var objectStore = event.target.result.createObjectStore("users", {keyPath: "id"});   
  36. for (var i in userData) {   
  37. objectStore.add(userData[i]);    
  38. }   
  39. }   
  40. function Add() {   
  41. var request = db.transaction(["users"], "readwrite")   
  42. .objectStore("users")   
  43. .add({ id: "3", name: "Gautam", age: 30, email: "[email protected]" });   
  44.     
  45. request.onsuccess = function(e) {   
  46. alert("Gautam has been added to the database.");   
  47. };   
  48.     
  49. request.onerror = function(e) {   
  50. alert("Unable to add the information.");    
  51. }   
  52.     
  53. }   
  54. function Read() {   
  55. var objectStore = db.transaction("users").objectStore("users");   
  56. var request = objectStore.get("2");   
  57. request.onerror = function(event) {   
  58. alert("Unable to retrieve data from database!");   
  59. };   
  60. request.onsuccess = function(event) {    
  61. if(request.result) {   
  62. alert("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email);   
  63. } else {   
  64. alert("Bidulata couldn't be found in your database!");    
  65. }   
  66. };   
  67. }   
  68. function ReadAll() {   
  69. var objectStore = db.transaction("users").objectStore("users");    
  70. var req = objectStore.openCursor();   
  71. req.onsuccess = function(event) {   
  72. db.close();   
  73. var res = event.target.result;   
  74. if (res) {   
  75. alert("Key " + res.key + " is " + res.value.name + ", Age: " + res.value.age + ", Email: " + res.value.email);   
  76. res.continue();   
  77. }   
  78. };   
  79. req.onerror = function (e) {   
  80. console.log("Error Getting: ", e);   
  81. };    
  82. }   
  83. function Remove() {    
  84. var request = db.transaction(["users"], "readwrite").objectStore("users").delete("1");   
  85. request.onsuccess = function(event) {   
  86. alert("Tapas's entry has been removed from your database.");   
  87. };   
  88. }   
  89. </script>  
  90. </head>  
  91.     
  92. <body>  
  93. <button onclick="Add()">Add record</button>  
  94. <button onclick="Remove()">Delete record</button>  
  95. <button onclick="Read()">Retrieve single record</button>  
  96. <button onclick="ReadAll()">Retrieve all records</button>  
  97. </body>  
  98. </html>  

localStorage是不带lock效能的。那么要落到实处前端的多寡分享并且供给lock功用那就需求使用别的本储存格局,譬喻indexedDB。indededDB使用的是事务管理的体制,那实在便是lock功用。
  做那些测量检验须求先轻易的卷入下indexedDB的操作,因为indexedDB的连年相比辛劳,何况七个测量检验页面都须求用到

JavaScript Code复制内容到剪贴板

  1. //db.js   
  2. //封装事务操作   
  3. IDBDatabase.prototype.doTransaction=function(f){   
  4.   f(this.transaction(["Obj"],"readwrite").objectStore("Obj"));   
  5. };   
  6. //连接数据库,成功后调用main函数   
  7. (function(){   
  8.   //展开数据库   
  9.   var cn=indexedDB.open("TestDB",1);   
  10.   //成立数量对象   
  11.   cn.onupgradeneeded=function(e){   
  12.     e.target.result.createObjectStore("Obj");   
  13.   };   
  14.   //数据库连接成功   
  15.   cn.onsuccess=function(e){   
  16.     main(e.target.result);   
  17.   };   
  18. })();   
  19.   接着是七个测量试验页面   
  20. <script src="db.js"></script>  
  21. <script>  
  22. //a.html   
  23. function main(e){   
  24.   (function callee(){   
  25.     //开首四个业务   
  26.     e.doTransaction(function(e){   
  27.       e.put(1,"test"); //设置test的值为1   
  28.       e.put(2,"test"); //设置test的值为2   
  29.     });   
  30.     setTimeout(callee);   
  31.   })();   
  32. };   
  33. </script>  
  34. <script src="db.js"></script>  
  35. <script>  
  36. //b.html   
  37. function main(e){   
  38.   (function callee(){   
  39.     //起初贰个专业   
  40.     e.doTransaction(function(e){   
  41.       //获取test的值   
  42.       e.get("test").onsuccess=function(e){   
  43.         console.log(e.target.result);   
  44.       };   
  45.     });   
  46.     setTimeout(callee);   
  47.   })();   
  48. };   
  49. </script>  

把localStorage换到了indexedDB事务管理。不过结果就不一致

图片 1

测量检验的时候b.html中大概不会应声有出口,因为indexedDB正忙着管理a.html东西,b.html事务丢在了业务丢队列中等待。可是无论怎么着,输出结果也不会是1那么些值。因为indexedDB的蝇头管理单位是业务,实际不是localStorage那样以表明式为单位。那样如若把lock和unlock之间要求管理的事物放入一个业务中就能够兑现。别的,浏览器对indexedDB的帮助不比localStorage,所以采用时还得思考浏览器包容。

那篇作品首要介绍了深远解析HTML5中的IndexedDB索引数据库,富含事务锁等基本作用的连锁使...

AppCache

举个例子您的Web应用中有点功力(恐怕全部应用)要求在退出服务器的意况下采取,那么就足以通过AppCache来令你的顾客在离线状态下也能采用。你所急需做的就是开创三个配备文件,在中间钦命哪些能源要求被缓存,哪些无需。别的,还可以在里边内定有些联机能源在脱机条件下的取代财富。

AppCache的配置文件一般是三个以.appcache最终的文件文件(推荐写法)。文件以CACHE MANIFEST开首,包括下列三局地内容:

  • CACHE – 钦定了什么样财富在客商率先次访问站点的时候供给被下载并缓存
  • NETWORK – 钦点了什么样财富要求在联合条件下技术访谈,这么些能源从不被缓存
  • FALLBACK – 内定了上述能源在脱机条件下的代替资源

参照链接

  • IndexedDB的基本概念-MDN
  • 使用 IndexedDB-MDN
  • IndexedDB API接口-MDN
  • Indexed Database API 2.0 – w3c

    1 赞 2 收藏 1 评论

图片 2

积攒数据

储存数占有两种办法:add()方法put()方法

那三种办法的分歧重要映今后:当要增多数据的指标存款和储蓄空间中曾经存在有一样键的数码时,使用add()方法增多数据会报错误,而put()方准绳会对现成数量举办更新,所以add()方法一般用于初阶化数据,而put()方法用于革新数据

代码如下:

// customerData 为要存储的数据
const customerData = [{ ssn: '444-44-4444', name: 'AAA', age: 35, email: '[AAA@company.com](mailto:AAA@company.com)'},{ ssn: '666-66-6666', name: 'CCC', age: 35, email: '[CCC@company.com](mailto:CCC@company.com)'},{ ssn: '777-77-7777', name: 'DDD', age: 32, email: '[DDD@home.org](mailto:DDD@home.org)'},{ ssn: '555-55-5555', name: 'BBB', age: 32, email: '[BBB@home.org](mailto:BBB@home.org)'},
];

// 创建一个事务,该事务将要对名为“customers”的对象存储空间进行 read和write 操作,并返回事务索引
let transaction = db.transaction('customers', 'readwrite'); 

// 取得索引后,使用objectStore()方法并传入存储空间的名称,就可以访问特定的存储空间,这两步是必须的
let store = transaction.objectStore('customers'); 

// 添加数据到数据库中
for (var i in customerData) {
  // 返回的req也是一个对象,可以为其添加onsuccess和onerror事件,来检测数据是否添加成功
  let req = store.put(customerData[i]);   // 往一个存储空间中添加数据

}
// 判断事务整个操作完成
transaction.oncomplete = function(event) {
  console.log(event.target);
  alert('存储数据完成');
};
}

如上就将数据存款和储蓄到数据库dbNames的customers对象存款和储蓄空间中

地点代码中涉嫌了 [事务],这里先记住:大凡涉及到对数据库的读写删除操作,都急需经过 [事务] 来完成

关于小编:njuyz

图片 3

(腾讯网今日头条:@njuyz) 个人主页 · 笔者的篇章 · 11

四、增删数据

对数据库的操作(增加和删除查改等)都须要通过事务来完成,事务享有三种情势:

  • readonly 只读(能够并发进行,优先采用)
  • readwrite 读写
  • versionchange 版本更动

利用游标查询数据

行使工作能够间接通过 已知的键检索单个对象。而在要求搜索多个目的时,则供给在业务内创立游标。

游标并不会提前搜罗结果,游标先指向结果中的第一项,在吸收接纳查找下一项的授命时,才会针对下一项

如下:

let transaction = db.transaction('customers', 'readwrite'),
let store = transaction.objectStore('customers'),
let request = store.openCursor(null) ; // 这里创建游标
request.onsuccess = function (event) {
  // event.target.result 中保存的是在存储空间中查询到的对象
  // event.target.result 中有几个属性值,可以了解到查询到的对象中的细节,
  // key: 当前访问的对象的键
  // value:当前访问的实际对象
  // primaryKey: 游标使用的键
  // direction:数值,表示游标移动的方向
  let cursor = event.target.result;
  let value, updateRequest, deleteRequest;

  // 这里必须要检查游标中是否有数据
  if (cursor) {
    if (cursor.key === '555-55-5555') {
      value = cursor.value;   // 获取到实际的访问对象
      value.name = 'hexon';   // 修改对象的name属性
      // 调用update()方法可以用指定的对象,更新对象的value
      updateRequest = cursor.update(value);     
      updateRequest.onsuccess = function() {
          // 处理成功
       }
    }
    cursor.continue() ;  // 移动到下一项,会触发下一次请求,同时成功则触发request.onsuccess
  }
}

上边例子中,能够采取cursor.delete()主意删除当前项

示例

第一,你需求在页面上钦定AppCache的布局文件:

XHTML

<!DOCTYPE html> <html manifest="manifest.appcache"> ... </html>

1
2
3
4
<!DOCTYPE html>
<html manifest="manifest.appcache">
...
</html>

在此处相对记得在劳务器端发布上述配置文件的时候,必要将MIME类型设置为text/cache-manifest,不然浏览器无法平常深入分析。

接下去是开创在此之前定义好的种种能源。大家只要在那些示例中,你付出的是贰个互为类站点,客商能够在下边联系外人並且揭橥商酌。顾客在离线的情景下照旧得以访谈网址的静态部分,而关系以及发表商议的页面则会被别的页面代替,不能够访谈。

好的,我们那就起先定义那多少个静态能源:

JavaScript

CACHE MANIFEST CACHE: /about.html /portfolio.html /portfolio_gallery/image_1.jpg /portfolio_gallery/image_2.jpg /info.html /style.css /main.js /jquery.min.js

1
2
3
4
5
6
7
8
9
10
11
CACHE MANIFEST
 
CACHE:
/about.html
/portfolio.html
/portfolio_gallery/image_1.jpg
/portfolio_gallery/image_2.jpg
/info.html
/style.css
/main.js
/jquery.min.js

旁注:配置文件写起来有少数很不方便人民群众。比释迦牟尼佛讲,假诺您想缓存整个目录,你不能够直接在CACHE部分用到通配符(*),而是只可以在NETWOENCOREK部分行使通配符把具有不应当被缓存的财富写出来。

你无需显式地缓存包罗配置文件的页面,因为那些页面会自动被缓存。接下来大家为挂钩和商讨的页面定义FALLBACK部分:

JavaScript

FALLBACK: /contact.html /offline.html /comments.html /offline.html

1
2
3
FALLBACK:
/contact.html /offline.html
/comments.html /offline.html

最后我们用一个通配符来阻止别的的财富被缓存:

JavaScript

NETWORK: *

1
2
NETWORK:
*

最后的结果便是下面那样:

JavaScript

CACHE MANIFEST CACHE: /about.html /portfolio.html /portfolio_gallery/image_1.jpg /portfolio_gallery/image_2.jpg /info.html /style.css /main.js /jquery.min.js FALLBACK: /contact.html /offline.html /comments.html /offline.html NETWORK: *

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CACHE MANIFEST
 
CACHE:
/about.html
/portfolio.html
/portfolio_gallery/image_1.jpg
/portfolio_gallery/image_2.jpg
/info.html
/style.css
/main.js
/jquery.min.js
 
FALLBACK:
/contact.html /offline.html
/comments.html /offline.html
 
NETWORK:
*

再有一件很要紧的事务要记得:你的财富只会被缓存三回!也正是说,假使资源革新了,它们不会自动更新,除非你改改了安排文件。所以有四个极品施行是,在布局文件中追加一项版本号,每一遍换代能源的时候顺便更新版本号:

JavaScript

CACHE MANIFEST # version 1 CACHE: ...

1
2
3
4
5
6
CACHE MANIFEST
 
# version 1
 
CACHE:
...

六、使用游标

取得一个得以操作游标的乞请对象有八个办法:

  • openCursor(keyRange, direction)
  • openKeyCursor(keyRange, direction)
    那八个情势接收的参数同样, 三个参数都以可选的: 第一个参数是限量值得范围,第贰个参数是点名游标方向

游标的应用有以下几处:

  • 在指标存款和储蓄空间上使用: var cursor = objectStore.openCursor()
  • 在目录对象上运用: var cursor = index.openCursor()

介绍

IndexedDB正是叁个数据库
其最大的风味是: 运用对象保存数据,并非行使表来保存数据,同一时间,它是异步的

LocalStorage和SessionStorage

借让你想在Javascript代码里面保存些数据,那么那个东西就派上用场了。前贰个得以保留数据,永世不会晚点(expire)。只若是均等的域和端口,全部的页面中都能访谈到通过LocalStorage保存的数据。举个轻巧的事例,你能够用它来保存客户安装,顾客能够把他的村办喜欢保存在当下应用的Computer上,以往展开应用的时候能够一直加载。前者也能保存数据,然则假如关闭浏览器窗口(译者注:浏览器窗口,window,假使是多tab浏览器,则此处指代tab)就失效了。并且这么些数量无法在差异的浏览器窗口之间分享,纵然是在不相同的窗口中访谈同八个Web应用的其它页面。

旁注:有一点点亟需提示的是,LocalStorage和SessionStorage里面只好保留基本类型的多少,相当于字符串和数字类型。另外具备的数据足以经过独家的toString()方法转化后保存。固然你想保留一个指标,则须求采纳JSON.stringfy方法。(假如这么些指标是二个类,你能够复写它默许的toString()方法,这么些方法会自动被调用)。

TAG标签:
版权声明:本文由必威发布于必威-前端,转载请注明出处:禁止转载,WEB应用在用户浏览器端存储数据