Heim > Web-Frontend > H5-Tutorial > Hauptteil

Tutorial zur Verwendung von Localstorage in HTML5_HTML5-Tutorial-Fähigkeiten

WBOY
Freigeben: 2016-05-16 15:46:27
Original
1618 Leute haben es durchsucht

Was ist Localstorage?

Vor ein paar Tagen stellte ich fest, dass die Funktionsweise von Cookies in einem alten Projekt sehr seltsam war. Nach Rücksprache wollte ich einige Informationen zwischenspeichern, um die Übergabe von Parametern an die URL zu vermeiden, aber ich habe nicht über die Probleme nachgedacht, die Cookies mit sich bringen würden Ursache:

 ① Die Cookie-Größe ist auf etwa 4 KB begrenzt, was nicht zum Speichern von Geschäftsdaten geeignet ist
 ② Cookies werden jedes Mal zusammen mit HTTP-Transaktionen gesendet, was Bandbreite verschwendet

Wir führen mobile Projekte durch, daher ist die Technologie, die hier wirklich geeignet ist, Localstorage. Man kann sagen, dass es sich um eine Optimierung von Cookies handelt, mit der Daten bequem auf dem Client gespeichert werden können HTTP, aber das ist kein Problem:

 ① Die Größe von localstorage ist auf etwa 5 Millionen Zeichen begrenzt und verschiedene Browser sind inkonsistent
 ② Localstorage kann im Datenschutzmodus nicht gelesen werden
 ③ Das ​​Wesentliche von localstorage ist das Lesen und Schreiben von Dateien, falls vorhanden Viele Daten bleiben hängen (Firefox wird das gleichzeitige Importieren von Daten in den Speicher beängstigend machen, wenn man darüber nachdenkt)
④ Localstorage kann nicht von Crawlern gecrawlt werden. Verwenden Sie es nicht, um die Übergabe von URL-Parametern vollständig zu ersetzen

Mängel verbergen nicht die Vorteile, die oben genannten Probleme können vermieden werden, daher sollte unser Fokus auf der Verwendung von Localstorage und der richtigen Verwendung liegen.
Nutzung von Localstorage
Grundkenntnisse

Es gibt zwei Arten von Localstorage-Speicherobjekten:

 ① sessionStrage: Sitzung bedeutet Sitzung hier bezieht sich auf den Zeitraum vom Betreten der Website bis zum Schließen der Website, wenn der Benutzer eine Website durchsucht.

 ② localStorage: Speichern Sie die Daten auf dem Client-Hardwaregerät, unabhängig davon, um was es sich handelt. Dies bedeutet, dass die Daten beim nächsten Einschalten des Computers immer noch vorhanden sind.

Der Unterschied zwischen den beiden besteht darin, dass eines für die vorübergehende Speicherung und das andere für die Langzeitspeicherung vorgesehen ist.

Hier ist ein einfacher Code, um seine grundlegende Verwendung zu veranschaulichen:

XML/HTML-CodeInhalt in die Zwischenablage kopieren
  1. <div id="msg"  Stil="Rand: 10px 0; Rahmen: 1px schwarz; Innenraum: 10px; Breite: 300px;   
  2.   height: 100px;">  
  3. div>  
  4. <Eingabe Typ="Text"  id="text" />
  5. <select id="type" >  
  6.   <Option Wert="session" >sessionStorageOption>  
  7.   <Option Wert="lokal" >localStorageOption>  
  8. auswählen>  
  9. <button onclick="save( );">  
  10.   保存数据Schaltfläche>  
  11. <button onclick="load( );">  
  12.   读取数据Schaltfläche>  
  13. <script type="text/ Javascript">  
  14.   var msg = document.getElementById('msg'),   
  15.             text = document.getElementById('text'),   
  16.             type = document.getElementById('type');   
  17.   
  18.   Funktion save() {   
  19.     var str = text.value;   
  20.     var t = type.value;   
  21.     if (t == 'session') {   
  22.       sessionStorage.setItem('msg', str);   
  23.     } else {   
  24.       localStorage.setItem('msg', str);   
  25.     }   
  26.   }   
  27.   
  28.   Funktion load() {   
  29.     var t = type.value;   
  30.     if (t == 'session') {   
  31.       msg.innerHTML = sessionStorage.getItem('msg');   
  32.     } else {   
  33.       msg.innerHTML = localStorage.getItem('msg');   
  34.     }   
  35.   }   
  36. Skript>  

 真实场景

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

  ① 缓存一般信息,如搜索页的出发城市,达到城市,非实时定位信息

  ② 缓存城市列表数据,这个数据往往比较大

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

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

XML/HTML-Code复制内容到剪贴板
  1. define([], function () {
  2. var Storage = _.inherit({
  3. //Standardattribute
  4. Eigenschaften: Funktion () {
  5. //Proxy-Objekt, Standard ist localstorage
  6. this.sProxy = window.localStorage;
  7. //60 * 60 * 24 * 30 * 1000
  8. ms ==30 Tage
  9. this.defaultLifeTime = 2592000000;
  10. //Der lokale Cache wird zum Speichern der Zuordnung zwischen allen Schlüsselwerten und Ablaufdaten des lokalen Speichers verwendet
  11. this.keyCache
  12. = 'SYSTEM_KEY_TIMEOUT_MAP';
  13. //Wenn die Cache-Kapazität voll ist, wird die Anzahl der Caches jedes Mal gelöscht
  14. this.removeNum
  15. =
  16. 5;
  17. },
  18. assurance: function () {
  19. if (
  20. this.sProxy
  21. === null) {
  22. throw 'sProxy-Eigenschaft nicht überschreiben'; }  
  23. },
  24. initialisieren: Funktion (opts) {
  25. this.propertys();
  26. this.assert();
  27. },
  28. /*
  29. Lokalen Speicher hinzufügen
  30. Das Datenformat umfasst einen eindeutigen Schlüsselwert, eine JSON-Zeichenfolge, ein Ablaufdatum und ein Einzahlungsdatum
  31. Das
  32. -Zeichen ist ein formatierter Anforderungsparameter, der verwendet wird, um neue Daten zurückzugeben, wenn dieselbe Anforderung unterschiedliche Parameter hat. Wenn die Liste beispielsweise die Stadt Peking ist und dann nach Shanghai gewechselt wird, wird das Tag beurteilt ist anders und aktualisiert die zwischengespeicherten Daten. Das Tag entspricht Signatur
  33. Für jeden Schlüsselwert wird nur eine Information zwischengespeichert
  34. */
  35. set: Funktion (Schlüssel, Wert, Timeout, Vorzeichen) {
  36. var _d = neu Datum();
  37. //Einzahlungsdatum
  38. var indate = _d.getTime();
  39. //Endlich gespeicherte Daten
  40. var entity = null;
  41. if (!timeout) {
  42. _d.setTime(_d.getTime() this.defaultLifeTime);
  43. timeout = _d.getTime();
  44. }  
  45. //
  46. this.setKeyCache(key, timeout);
  47. entity = this.buildStorageObj(value, indate, timeout, sign);
  48. versuchen Sie es mit {
  49. this.sProxy.setItem(key, JSON.stringify(entity));
  50. true zurückgeben;
  51. } Catch (e) {
  52. //Wenn der lokale Speicher voll ist, alles löschen
  53. if (
  54. e.name == 'QuotaExceededError') {
  55. // this.sProxy.clear();
  56. //Wenn der lokale Speicher voll ist, wählen Sie die zu löschenden Daten aus, die am nächsten an der Ablaufzeit liegen, aber es fühlt sich besser an, als alles zu löschen zeitaufwändiger sein, innerhalb von 100 ms
  57. if (!this.removeLastCache()) throw 'Die diesmal gespeicherte Datenmenge ist zu groß';
  58. this.set(key, value, timeout, sign);
  59.                                                              
  60. console && console.log(e);
  61. }
  62. gibt false zurück;
  63. },
  64. //Abgelaufenen Cache löschen
  65. RemoveOverdueCache: Funktion () {
  66. var tmpObj = null, i, len;
  67. var
  68. now = new Date().getTime();
  69. //Das Schlüssel-Wert-Paar abrufen
  70. var
  71. cacheStr = this.sProxy.getItem(this.keyCache);
  72. var
  73. cacheMap = []; var
  74. newMap
  75. = []; if (!cacheStr) {
  76. zurück;
  77. }  
  78. cacheMap
  79. =
  80. JSON.parse(cacheStr);
  81. für (
  82. i
  83. =
  84. 0, len = cacheMap.length; i < len; > tmpObj =
  85. cacheMap[i]; if (tmpObj.timeout < now
  86. ) { this.sProxy.removeItem(tmpObj.key); } else {
  87. newMap.push(tmpObj);
  88.                                                               }  
  89. this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));
  90. },
  91. RemoveLastCache: Funktion () {
  92. var i, len;
  93. var num = this.removeNum ||
  94. //Das Schlüssel-Wert-Paar abrufen
  95. var
  96. cacheStr = this.sProxy.getItem(this.keyCache);
  97. var
  98. cacheMap = []; var
  99. delMap
  100. = [];
  101. //Zeigt an, dass der Speicher zu groß ist
  102. if (!cacheStr) return false;
  103. cacheMap.sort(function (a, b) {
  104. return a.timeout - b.timeout;
  105. });
  106. //Welche Daten wurden gelöscht
  107. delMap
  108. =
  109. cacheMap.splice(0, num); für (i
  110. =
  111. 0, len = delMap.length; i < len ) { this.sProxy.removeItem(delMap[i].key);
  112. }  
  113. this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));
  114. true zurückgeben;
  115. },
  116. setKeyCache: Funktion (Schlüssel, Timeout) {
  117. if (!key || !timeout || timeout
  118. <
  119. new Date().getTime( )) zurück; var i, len, tmpObj;
  120. //Die aktuell zwischengespeicherte Schlüsselwertzeichenfolge abrufen
  121. var
  122. oldstr
  123. =
  124. this
  125. .sProxy.getItem( var oldMap = [];
  126. //Ob der aktuelle Schlüssel bereits existiert
  127. var flag
  128. =
  129. false
  130. ;
  131. var obj = {};   
  132.       obj.key = key;   
  133.       obj.timeout = timeout;   
  134.   
  135.       if (oldstr) {   
  136.         oldMap = JSON.parse(oldstr);   
  137.         if (!_.isArray(oldMap)) oldMap = [];   
  138.       }   
  139.   
  140.       für (i = 0len = oldMap.length; i < len; i ) {   
  141.         tmpObj = oldMap[i];   
  142.         if (tmpObj.key == key) {   
  143.           oldMap[i] = obj;   
  144.           flag = true;   
  145.           Pause;   
  146.         }   
  147.       }   
  148.       if (!flag) oldMap.push(obj);   
  149.       //最后将新数组放到缓存中   
  150.       this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  151.   
  152.     },   
  153.   
  154.     buildStorageObj: Funktion (Wert, Indate, Timeout, Sign) {   
  155.       var obj = {   
  156.         Wert: Wert,   
  157.         timeout: timeout,   
  158.         Zeichen: Zeichen,   
  159.         indate: indate   
  160.       };   
  161.       return obj;   
  162.     },
  163. get: Funktion (Schlüssel, Zeichen) {
  164. var result, now = new Date().getTime(
  165. versuchen Sie es mit {
  166. result = this.sProxy.getItem(key);
  167. if (!result) return null;
  168. result = JSON.parse(result);
  169. //Datenablauf
  170. if (result.timeout
  171. < now) return null;
  172. //Signaturüberprüfung ist erforderlich
  173. if (sign) {
  174. if (
  175. sign
  176. === result.sign) return result.value;
  177. null zurückgeben
  178. } else {
  179. return result.value;
  180.                                                              
  181. } Catch (e) {
  182. console && console.log(e);
  183. }  
  184. null zurückgeben
  185. },
  186. //Signatur erhalten
  187. getSign: Funktion (Schlüssel) {
  188. var result,
  189. sign
  190. =
  191. null; versuchen Sie es mit {
  192. result
  193. =
  194. this
  195. .sProxy.getItem(key); if (result) { result
  196. =
  197. JSON
  198. .parse(result);
  199. sign = result
  200. && result.sign
  201.                                                               } Catch (e) { console && console.log(e);
  202. }  
  203.       Rückgabezeichen;   
  204.     },   
  205.   
  206.     remove: function (key) {   
  207.       return this.sProxy.removeItem(key);   
  208.     },   
  209.   
  210.     clear: function () {   
  211.       this.sProxy.clear();   
  212.     }   
  213.   });   
  214.   
  215.   Storage.getInstance = Funktion () {   
  216.     if (this.instance) {   
  217.       return this.instance;   
  218.     } else {   
  219.       return this.instance = new this();   
  220.     }   
  221.   };   
  222.   
  223.   zurück Lagerung;   
  224.   
  225. });  

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

XML/HTML-Code复制内容到剪贴板
  1. define(['AbstractStorage'], function (AbstractStorage) {
  2. var Store = _.inherit({
  3. //Standardattribute
  4. Eigenschaften: Funktion () {
  5. //Jedes Objekt muss einen Speicherschlüssel haben und kann nicht wiederholt werden
  6. this.key = null;
  7. //Der Standardlebenszyklus eines Datenelements, S ist Sekunden, M ist Minuten, D ist Tage
  8. this.lifeTime = '30M';
  9. //Standard-Rückgabedaten
  10. //
  11. this.defaultData
  12. = null;
  13. //Proxy-Objekt, lokales Speicherobjekt
  14. this.sProxy
  15. = new AbstractStorage();
  16. },
  17. setOption: Funktion (Optionen) {
  18. _.extend(this, Optionen);
  19. },
  20. assurance: function () {
  21. if (
  22. this.key
  23. === null) { throw 'Schlüsseleigenschaft nicht überschreiben';
  24. }  
  25. if (
  26. this.sProxy
  27. === null) { throw 'sProxy-Eigenschaft nicht überschreiben';
  28. }  
  29. },
  30. initialisieren: Funktion (opts) {
  31. this.propertys();
  32. this.setOption(opts);
  33. this.assert();
  34. },   
  35.   
  36.     _getLifeTime: function () {   
  37.       var timeout = 0;   
  38.       var str = this.lifeTime;   
  39.       var unit = str.charAt(str.length - 1);   
  40.       var num = str.substring(0, str.length - 1);   
  41.       var Karte = {   
  42.         D: 86400,   
  43.         H: 3600,   
  44.         M: 60,   
  45.         S: 1   
  46.       };   
  47.       if (typeof unit == 'string') {   
  48.         unitunit = unit.toUpperCase();   
  49.       }   
  50.       timeout = num;   
  51.       if (unit) timeout = Map[unit];   
  52.   
  53.       //单位为毫秒   
  54.       return num * timeout * 1000 ;   
  55.     },   
  56.   
  57.     //缓存数据   
  58.     set: Funktion (Wert, Vorzeichen) {   
  59.       //获取过期时间   
  60.       var timeout = new Date();   
  61.       timeout.setTime(timeout.getTime()   this._getLifeTime());   
  62.       this.sProxy.set(this.key, value, timeout.getTime(), sign);   
  63.     },   
  64.   
  65.     //设置单个属性   
  66.     setAttr: Funktion (Name, Wert, Zeichen) {   
  67.       var key, obj;   
  68.       if (_.isObject(name)) {   
  69.         für (Namen eingeben) {   
  70.           if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);   
  71.         }  
  72.         zurück;   
  73.       }   
  74.   
  75.       if (!sign) sign = this.getSign();   
  76.   
  77.       //获取当前对象   
  78.       obj = this.get(sign) || {};   
  79.       if (!obj) return;   
  80.       obj[name] = value;   
  81.       this.set(obj, sign);   
  82.   
  83.     },   
  84.   
  85.     getSign: function () {   
  86.       return this.sProxy.getSign(this.key);   
  87.     },   
  88.   
  89.     remove: function () {   
  90.       this.sProxy.remove(this.key);   
  91.     },   
  92.   
  93.     removeAttr: function (attrName) {   
  94.       var obj = this.get() || {};   
  95.       if (obj[attrName]) {   
  96.         delete obj[attrName];   
  97.       }   
  98.       this.set(obj);   
  99.     },   
  100.   
  101.     get: function (sign) {   
  102.       var result = [], isEmpty = true, a;   
  103.       var obj = this.sProxy.get(this.key, sign);   
  104.       var type = typeof obj;   
  105.       var o = { 'string': true, 'number': true, 'boolean': true };   
  106.       if (o[type]) return obj;   
  107.   
  108.       if (_.isArray(obj)) {   
  109.         für (var i = 0lenobj.length; i < len; i ) {   
  110.           result[i] = obj[i];   
  111.         }  
  112.       } else if (_.isObject(obj)) {   
  113.         result = obj;   
  114.       }   
  115.   
  116.       für (ein Ergebnis) {   
  117.         isEmpty = false;   
  118.         Pause;   
  119.       }   
  120.       return !isEmpty ? Ergebnis : null;   
  121.     },   
  122.   
  123.     getAttr: function (attrName, tag) {   
  124.       var obj = this.get(tag);   
  125.       var attrVal = null;   
  126.       if (obj) {   
  127.         attrVal = obj[attrName];   
  128.       }   
  129.       return attrVal;   
  130.     }   
  131.   
  132.   });   
  133.   
  134.   Store.getInstance = Funktion () {   
  135.     if (this.instance) {   
  136.       return this.instance;   
  137.     } else {   
  138.       return this.instance = new this();   
  139.     }   
  140.   };   
  141.   
  142.   Retouren-Shop;   
  143. });  

  我们真实使用的时候是使用store这个类操作localstorage,代码结束简单测试:
201579150514318.jpg (488×184)

 存储完成, 以后都不会走请求, 于是今天的代码基本结束, 最后在Android Hybrid中有一后退按钮, 此按钮一旦按下会回到上一个页面,这个时候里面的localstorage可能会读取失效!一个简单不靠谱的解决方案是在webapp中加入:

XML/HTML-Code复制内容到剪贴板
  1. window.onunload = function () { };//适合单页应用,不要问我为什么,我也不知道  

 结语

  localstorage是移动开发必不可少的技术点,需要深入了解,具体业务代码后续会放到git上,有兴趣的朋友可以去了解

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!