Rumah  >  Artikel  >  hujung hadapan web  >  Tutorial menggunakan Localstorage dalam kemahiran tutorial HTML5_html5

Tutorial menggunakan Localstorage dalam kemahiran tutorial HTML5_html5

WBOY
WBOYasal
2016-05-16 15:46:271619semak imbas

Apakah storan setempat

Beberapa hari yang lalu, saya mendapati bahawa operasi kuki adalah sangat pelik dalam projek lama Selepas berunding, saya ingin menyimpan beberapa maklumat untuk mengelak daripada menghantar parameter pada URL, tetapi saya tidak mempertimbangkan masalah yang akan dihadapi kuki. punca:

 ① Saiz kuki dihadkan kepada kira-kira 4k, yang tidak sesuai untuk menyimpan data perniagaan
 ② Kuki dihantar bersama-sama dengan transaksi HTTP setiap kali, yang membazirkan lebar jalur

Kami sedang melakukan projek mudah alih, jadi teknologi yang sangat sesuai digunakan di sini ialah localstorage boleh dikatakan sebagai pengoptimuman kuki ia boleh digunakan untuk menyimpan data pada klien dengan mudah dan tidak akan dihantar HTTP, tetapi ia bukan Tiada masalah:

 ① Saiz storan setempat dihadkan kepada kira-kira 5 juta aksara, dan penyemak imbas yang berbeza tidak konsisten
 ② Storan setempat tidak boleh dibaca dalam mod privasi
 ③ Intipati storan setempat ialah membaca dan menulis fail jika ada banyak data, ia akan tersekat (firefox akan Mengimport data ke dalam memori pada satu masa adalah menakutkan apabila anda memikirkannya)
④ storan setempat tidak boleh dirangkak oleh perangkak, jangan gunakannya untuk menggantikan sepenuhnya parameter URL yang lulus

Kecacatan tidak menyembunyikan kelebihan, masalah di atas dapat dielakkan, jadi tumpuan kita harus pada cara menggunakan localstorage, dan cara menggunakannya dengan betul.
Penggunaan storan setempat
Pengetahuan asas

Terdapat dua jenis objek storan storan setempat:

 ① sessionStrage: session bermaksud sesi Sesi di sini merujuk kepada tempoh masa dari memasuki tapak web hingga menutup tapak web apabila pengguna melayari laman web Tempoh sah bagi objek sesi hanya begitu lama.

 ② localStorage: Simpan data pada peranti perkakasan pelanggan, tidak kira apa pun peranti itu, yang bermaksud bahawa data akan tetap ada apabila komputer dihidupkan pada masa akan datang.

Perbezaan antara keduanya ialah satu untuk simpanan sementara dan satu lagi untuk simpanan jangka panjang.

Berikut ialah kod ringkas untuk menggambarkan penggunaan asasnya:

Kod XML/HTMLSalin kandungan ke papan keratan
  1. <div id="msg"  style="margin: 10px 0; border: 1px solid black; padding: 10px; width: 300px;   
  2.   tinggi: 100px;">  
  3. div>  
  4. <input taip="teks"  id="teks" />
  5. <pilih id="taip" >  
  6.   <pilihan nilai="sesi" >sessionStoragepilihan>  
  7.   <pilihan nilai="tempatan" >localStoragepilihan>  
  8. pilih>  
  9. <butang onklik="simpan( );">  
  10.   保存数据butang>  
  11. <butang onklik="load( );">  
  12.   读取数据butang>  
  13. <skrip taip="teks/ javascript">  
  14.   var msg = dokumen.getElementById('msg'),   
  15.             teks = dokumen.getElementById('text'),   >
  16.              taip = dokumen.getElementById('type');   
  17.   
  18.   fungsi save() {   
  19.     var str = teks.value;   
  20.     var t = taip.nilai;   
  21.      jika (t == 'sesi') {   
  22.       sessionStorage.setItem('msg', str);   
  23.     } lain {   
  24.       localStorage.setItem('msg', str);   
  25.     }   
  26.   }   
  27.   
  28.   fungsi beban() {   
  29.     var t = taip.nilai;   
  30.      jika (t == 'sesi') {   
  31.       msg.innerHTML = sessionStorage.getItem('msg');   
  32.     } lain {   
  33.       msg.innerHTML = localStorage.getItem('msg');   
  34.     }   
  35.   }   
  36. skrip>  

 真实场景

  实际工作中对localstorage的使用一般有以下需求:

  ① 缓存一般信息,如搜索页的出发城市,达到城市,非实时定位俎息>  ② 缓存城市列表数据,这个数据往往比较大

  ③ 每条缓存信息需要可追踪,比如服务器通知城市数据更新,这个新,这个无问的时候要自动设置过期

  ④ 每条信息具有过期日期状态,在过期外时间需要由服务器拉取敎态

Kod XML/HTML
复制内容到剪贴板
  1. takrif([], fungsi () {
  2. var Storan = _.warisan({
  3. //Atribut lalai
  4. sifat: fungsi () {
  5. //Objek proksi, lalai ialah storan setempat
  6. this.sProxy = tetingkap.localStorage;
  7. //60 * 60 * 24 * 30 * 1000 ms ==30 hari
  8. ini.defaultLifeTime = 2592000000;
  9. //Cache tempatan digunakan untuk menyimpan pemetaan antara semua nilai kunci storan setempat dan tarikh tamat tempoh
  10. ini.keyCache = 'SYSTEM_KEY_TIMEOUT_MAP';
  11. //Apabila kapasiti cache penuh, bilangan cache dipadamkan setiap kali
  12. ini.removeNum
  13. = 5
  14. },
  15. tegaskan: fungsi () {
  16. jika (
  17. this.sProxy
  18. === null) { buang 'not override sProxy property';
  19. }  
  20. },
  21. mulakan: fungsi (pilihan) {
  22. this.propertys();
  23. this.assert();
  24. },
  25. /*
  26. Tambah storan setempat
  27. Format data termasuk nilai kunci unik, rentetan json, tarikh luput, tarikh deposit
  28. Tanda
  29. ialah parameter permintaan yang diformatkan, digunakan untuk mengembalikan data baharu apabila permintaan yang sama mempunyai parameter yang berbeza Contohnya, jika senarai itu adalah bandar Beijing, dan kemudian bertukar ke Shanghai, ia akan menilai bahawa teg itu adalah berbeza dan kemas kini data yang dicache adalah bersamaan dengan Tandatangan
  30. Hanya satu maklumat akan dicache untuk setiap nilai kunci
  31. */
  32. set: fungsi (kunci, nilai, tamat masa, tanda) {
  33. var _d = baharu Tarikh(
  34. //Tarikh deposit
  35. var indate = _d.getTime(
  36. //Akhirnya data disimpan
  37. var entiti = null;
  38. jika (!masa tamat) {
  39. _d.setTime(_d.getTime() this.defaultLifeTime);
  40. masa tamat
  41. = _d.getTime( }  
  42. //
  43. this.setKeyCache(kunci, tamat masa);
  44. entiti
  45. =
  46. ini.buildStorageObj(nilai, indate, tamat masa, tanda); > cuba {
  47. this.sProxy.setItem(key, JSON.stringify(entiti));
  48. kembali benar;
  49. } tangkap (e) {
  50. //Apabila storan setempat penuh, kosongkan semuanya
  51. jika (
  52. e.nama
  53. == 'QuotaExceededError') {
  54. // this.sProxy.clear();
  55. //Apabila storan setempat penuh, pilih data yang paling hampir dengan masa tamat tempoh untuk dipadamkan. Ini juga akan memberi kesan, tetapi rasanya lebih baik daripada mengosongkan semua cache, proses ini akan lebih memakan masa, dalam 100ms
  56. jika (!this.removeLastCache()) buang 'Jumlah data yang disimpan kali ini terlalu besar';
  57. set ini(kunci, nilai, tamat masa, tanda);
  58.                                                               
  59. konsol && console.log(e);
  60. }
  61. kembali palsu;
  62. },
  63. //Padam cache tamat tempoh
  64. removeOverdueCache: function () {
  65. var tmpObj = null, i, len;
  66. var
  67. sekarang = baharu Tarikh().getTime();
  68. //Dapatkan pasangan nilai kunci
  69. var
  70. cacheStr = ini.sProxy.getItem(this.keyCache); var
  71. CacheMap
  72. = []; var
  73. Peta baharu
  74. = []; jika (!cacheStr) {
  75. kembali;
  76. }  
  77. cacheMap
  78. = JSON.parse(cacheStr
  79. untuk (
  80. i
  81. = 0, len = Peta cache.panjang i < len i ) {
  82. tmpObj
  83. = CacheMap[i] jika (tmpObj.masa tamat
  84. <
  85. sekarang) { this.sProxy.removeItem(tmpObj.key);
  86. } lain {
  87. newMap.push(tmpObj);
  88.                                                               
  89. }  
  90. this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));
  91. },
  92. removeLastCache: function () {
  93. var i, len;
  94. var
  95. num = ini.removeNum || 5;
  96. //Dapatkan pasangan nilai kunci
  97. var
  98. cacheStr
  99. = ini.sProxy.getItem(this.keyCache); var CacheMap
  100. = [];
  101. var delMap
  102. = [];
  103. //Menunjukkan bahawa storan terlalu besar
  104. jika (!cacheStr) mengembalikan palsu;
  105. cacheMap.sort(fungsi (a, b) {
  106. kembali a.masa tamat - b.masa tamat;
  107. });
  108. //Apakah data yang telah dipadamkan
  109. delMap
  110. =
  111. cacheMap
  112. .splice(0, num); untuk (i = 0
  113. ,
  114. len = delMap.panjang i < len i ) { this.sProxy.removeItem(delMap[i].key); }  
  115. this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));
  116. kembali benar;
  117. },
  118. setKeyCache: fungsi (kunci, tamat masa) {
  119. jika (!key || !timeout || timeout
  120. <
  121. baharu
  122. Date().getTime( )) kembali;
  123. var i, len, tmpObj;
  124. //Dapatkan rentetan nilai kunci yang sedang dicache var
  125. oldstr
  126. =
  127. ini
  128. .sProxy.getItem(this.keyCache);
  129. var
  130. Peta lama
  131. = [];
  132. //Sama ada kunci semasa sudah wujud var bendera
  133. =
  134. salah; var
  135. obj
  136. = {};   
  137.       obj.key = key;   
  138.       obj.masa tamat = masa tamat;   
  139.   
  140.       jika (oldstr) {   
  141.         oldMap = JSON.parse(oldstr);   
  142.         jika (!_.isArray(oldMap)) oldMap = [];   
  143.       }   
  144.   
  145.        untuk (i = 0len = Peta lama.panjang;  i < len;  i ) {   
  146.         tmpObj = Peta lama[i];   
  147.         jika (tmpObj.key == kunci) {   
  148.           Peta lama[i] = obj;   
  149.           bendera = benar;   
  150.           rehat;   
  151.         }   
  152.       }   
  153.        jika (!flag) oldMap.push(obj);   
  154.       //最后将新数组放到缓存中   
  155.       this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  156.   
  157.     },   
  158.   
  159.     buildStorageObj: fungsi (nilai, indate, tamat masa, tanda) {   
  160.       var obj = {   
  161.         nilai: nilai,   
  162.         masa tamat: masa tamat,   
  163.         tanda: tanda,   
  164.         indate: indate   
  165.       };   
  166.       kembali obj;   
  167.     },
  168. dapatkan: fungsi (kunci, tanda) {
  169. var hasil, sekarang = baharu Tarikh().getTime();
  170. cuba {
  171. hasil = ini.sProxy.getItem(key);
  172. jika (!hasil) mengembalikan null;
  173. hasil
  174. = JSON.parse(hasil);
  175. //Tamat tempoh data
  176. jika (hasil.masa tamat
  177. <
  178. sekarang) kembalikan null; //Pengesahan tandatangan diperlukan
  179. jika (tanda) {
  180. jika (
  181. tanda
  182. === hasil.tanda)
  183. pulangkan hasil.nilai; kembalikan null;
  184. } lain {
  185. pulangkan hasil.nilai;
  186.                                                               
  187. } tangkap (e) {
  188. konsol && console.log(e);
  189. }  
  190. kembalikan null;
  191. },
  192. //Dapatkan tandatangan
  193. getSign: fungsi (kunci) {
  194. hasil var,
  195. tanda
  196. =
  197. null
  198. cuba { hasil
  199. =
  200. ini
  201. .sProxy.getItem(key);
  202. jika (hasil) { hasil =
  203. JSON
  204. .parse(hasil);
  205. tanda = hasil && result.sign
  206.                                                               
  207. } tangkap (e) { konsol && console.log(e); }  
  208.       tanda pulangan;   
  209.     },   
  210.   
  211.     alih keluar: fungsi (kunci) {   
  212.       kembali this.sProxy.removeItem(key);   
  213.     },   
  214.   
  215.     jelas: fungsi () {   
  216.       this.sProxy.clear();   
  217.     }   
  218.   });   
  219.   
  220.   Storage.getInstance = fungsi () {   
  221.     jika (ini.contoh) {   
  222.       kembali ini.contoh;   
  223.     } lain {   
  224.       kembali ini.contoh = baharu ini();   
  225.     }   
  226.   };   
  227.   
  228.   kembali Storan;   
  229.   
  230. });  

这段代码包含了localstorage的基本操作,并且对以上问题做了处理,而真实的使用实的使用实的使用实的使用圆还莲

Kod XML/HTML
复制内容到剪贴板
  1. define(['AbstractStorage'], fungsi (AbstractStorage) {
  2. var Kedai = _.warisan({
  3. //Atribut lalai
  4. sifat: fungsi () {
  5. //Setiap objek mesti mempunyai kunci storan dan tidak boleh diulang
  6. kunci ini = null;
  7. //Kitaran hayat lalai bagi sekeping data, S ialah saat, M ialah minit, D ialah hari
  8. ini.lifeTime = '30M'
  9. //Data pulangan lalai
  10. //
  11. ini.defaultData = null
  12. //Objek proksi, objek storan setempat
  13. this.sProxy = baharu AbstractStorage();
  14. },
  15. setPilihan: fungsi (pilihan) {
  16. _.lanjutkan(ini, pilihan);
  17. },
  18. tegaskan: fungsi () {
  19. jika (
  20. kunci.ini
  21. === null) { buang 'tidak mengatasi harta kunci';
  22. }  
  23. jika (
  24. this.sProxy
  25. === null) { buang 'not override sProxy property';
  26. }  
  27. },
  28. mulakan: fungsi (pilihan) {
  29. this.propertys();
  30. this.setOption(opts);
  31. this.assert();
  32. },   
  33.   
  34.     _getLifeTime: fungsi () {   
  35.       var masa tamat = 0;   
  36.       var str = ini.lifeTime;   
  37.       var unit = str.charAt(str.length - 1);   
  38.       var num = str.substring(0, str.length - 1);   
  39.       var Peta = {   
  40.         D: 86400,   
  41.         H: 3600,   
  42.         M: 60,   
  43.         S: 1  
  44.       };   
  45.       jika (jenis unit == 'rentetan') {   
  46.         unitunit = unit.toUpperCase();   
  47.       }   
  48.       masa tamat = bilangan;   
  49.        jika (unit) masa tamat = Peta[unit];   
  50.   
  51.       //单位为毫秒   
  52.       bilangan pulangan * tamat masa * 1000 ;   
  53.     },   
  54.   
  55.     //缓存数据   
  56.     set: fungsi (nilai, tanda) {   
  57.       //获取过期时间   
  58.       var tamat masa = baharu Tarikh();   
  59.       masa tamat.setTime(masa tamat.getTime()  ini._getLifeTime());   
  60.       this.sProxy.set(this.key, value, timeout.getTime(), sign);   
  61.     },   
  62.   
  63.     //设置单个属性   
  64.     setAttr: fungsi (nama, nilai, tanda) {   
  65.       kunci var, obj;   
  66.       jika (_.isObject(name)) {   
  67.         untuk (masukkan nama) {   
  68.            jika (name.hasOwnProperty(key)) this.setAttr(k, nama[k], nilai);   
  69.         }  
  70.         kembali;   
  71.       }   
  72.   
  73.       jika (!sign) tanda = ini.getSign();   
  74.   
  75.       //获取当前对象   
  76.       obj = ini.get(sign) | {};   
  77.       jika (!obj) kembali;   
  78.       obj[name] = nilai;   
  79.       set.ini(obj, tanda);   
  80.   
  81.     },   
  82.   
  83.     getSign: fungsi () {   
  84.       kembali this.sProxy.getSign(this.key);   
  85.     },   
  86.   
  87.     alih keluar: fungsi () {   
  88.       this.sProxy.remove(this.key);   
  89.     },   
  90.   
  91.     moveAttr: function (attrName) {   
  92.       var obj = ini.get() || {};   
  93.       jika (obj[attrName]) {   
  94.         padam obj[attrName];   
  95.       }   
  96.       this.set(obj);   
  97.     },   
  98.   
  99.     dapatkan: fungsi (tanda) {   
  100.       var hasil = [], Kosong = benarbenar
  101. >, a;   
  102.       var obj = ini
  103. .sProxy.get(this.key, sign);   
  104.       var taip = jenis
  105.  obj;   
  106.       var o
  107.  = { 'rentetan': true, 'number': true, 'boolean': true };   
  108.       jika (o[type]) kembali obj;   
  109.   
  110.       jika (_.isArray(obj)) {   
  111.         untuk (var i = 0lenobj.panjang;  i < len;  i ) {   
  112.           hasil[i] = obj[i];   
  113.         }  
  114.       } lain jika (_.isObject(obj)) {   
  115.         hasil = obj;   
  116.       }   
  117.   
  118.       untuk (sebagai hasil) {   
  119.         kosong = salah;   
  120.         rehat;   
  121.       }   
  122.       kembali !isKosong ? hasil : null;   
  123.     },   
  124.   
  125.     getAttr: fungsi (attrName, tag) {   
  126.       var obj = ini.get(tag);   
  127.       var attrVal = null;   
  128.        jika (obj) {   
  129.         attrVal = obj[attrName];   
  130.       }   
  131.       return attrVal;   
  132.     }   
  133.   
  134.   });   
  135.   
  136.   Store.getInstance = fungsi () {   
  137.     jika (ini.contoh) {   
  138.       kembali ini.contoh;   
  139.     } lain {   
  140.       kembali ini.contoh = baharu ini();   
  141.     }   
  142.   };   
  143.   
  144.   pulangan Kedai;   
  145. });  

  我们真实使用的时候是使用store这个类操作localstorage,代码结束简单测试:
 存储完成,以后都不会走请求,于是今天的代码基本结束 ,最后在android一中中是中中文一旦按下会回到上一个页面,这个时候里面的localstorage可能会读取失效!一个简单不靠谱的解决方案是在webapp中加入:

Kod XML/HTML
复制内容到剪贴板
  1. window.ounload = fungsi () { };//适合单页应用,不要义,不要问,不要问,不要问也不知道  
 结语

  localstorage是移动开发必不可少的技术点,需要深入了解,具体业务代码业务代码后他的技术点,需要深入了解,具体业务代码业务代码后从他,后从美朋友可以去了解


Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn