Maison > interface Web > Tutoriel H5 > le corps du texte

Tutoriel sur l'utilisation de Localstorage dans les compétences du didacticiel HTML5_html5

WBOY
Libérer: 2016-05-16 15:46:27
original
1630 Les gens l'ont consulté

Qu'est-ce que le stockage local

Il y a quelques jours, j'ai trouvé que le fonctionnement des cookies était très étrange dans un ancien projet. Après consultation, j'ai souhaité mettre en cache certaines informations pour éviter de passer des paramètres sur l'URL, mais je n'ai pas envisagé les problèmes que poseraient les cookies. cause :

 ① La taille des cookies est limitée à environ 4 Ko, ce qui n'est pas adapté au stockage de données professionnelles
 ② Les cookies sont envoyés à chaque fois avec des transactions HTTP, ce qui gaspille de la bande passante

Nous réalisons des projets mobiles, donc la technologie qui est vraiment appropriée à utiliser ici est le stockage local. On peut dire que le stockage local est une optimisation des cookies. Il peut être utilisé pour stocker facilement des données sur le client et ne sera pas transmis avec. HTTP, mais ce n'est pas le cas. Pas de problème :

 ① La taille du stockage local est limitée à environ 5 millions de caractères et les différents navigateurs sont incohérents
 ② Le stockage local ne peut pas être lu en mode confidentialité
 ③ L'essence du stockage local est de lire et d'écrire des fichiers s'il y en a. beaucoup de données, elles seront bloquées (Firefox importera des données en mémoire en même temps est effrayant quand on y pense)
④ le stockage local ne peut pas être exploré par les robots d'exploration, ne l'utilisez pas pour remplacer complètement le passage des paramètres d'URL

Les défauts ne cachent pas les avantages, les problèmes ci-dessus peuvent être évités, nous devons donc nous concentrer sur la façon d'utiliser le stockage local et sur la manière de l'utiliser correctement.
Utilisation du stockage local
Connaissances de base

Il existe deux types d'objets de stockage local :

 ① sessionStrage : session signifie session. La session fait ici référence à la période de temps allant de l'entrée sur le site Web à la fermeture du site Web lorsque l'utilisateur navigue sur un site Web. La période de validité de l'objet de session n'est que limitée.

 ② localStorage : enregistrez les données sur le périphérique matériel client, quel qu'il soit, ce qui signifie que les données seront toujours là lors de la prochaine mise sous tension de l'ordinateur.

La différence entre les deux est que l'un est destiné au stockage temporaire et l'autre au stockage à long terme.

Voici un code simple pour illustrer son utilisation de base :

Code XML/HTMLCopier le contenu dans le presse-papiers
  1. <div id="msg"  style="marge :  10px 0; bordure : 1px noir uni ; remplissage :  10px; largeur : 300px ;   
  2.   hauteur : 100px;">  
  3. div>  
  4. <entrée type="texte"  id="texte" />
  5. <sélectionner id="type" >  
  6.   <option valeur="session" >sessionStorageoption>  
  7.   <option valeur="local" >localStorageoption>  
  8. sélectionner>  
  9. <bouton on clique="enregistrer( );">  
  10.   保存数据bouton>  
  11. <bouton onclique="charger( );">  
  12.   读取数据bouton>  
  13. <script type="texte/ javascript">  
  14.   var msg = document.getElementById('msg'),   
  15.             text = document.getElementById('text'),   
  16.             type = document.getElementById('type');   
  17.   
  18.   fonction save() {   
  19.     var str = text.value;   
  20.     var t = type.value;   
  21.     si (t == 'session') {   
  22.       sessionStorage.setItem('msg', str);   
  23.     } autre {   
  24.       localStorage.setItem('msg', str);   
  25.     }   
  26.   }   
  27.   
  28.   fonction load() {   
  29.     var t = type.value;   
  30.     si (t == 'session') {   
  31.       msg.innerHTML = sessionStorage.getItem('msg');   
  32.     } autre {   
  33.       msg.innerHTML = localStorage.getItem('msg');   
  34.     }   
  35.   }   
  36. script>  

 真实场景

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

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

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

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

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

Code XML/HTML复制内容到剪贴板
  1. define([], function() {
  2. var Stockage = _.inherit({
  3. //Attributs par défaut
  4. propriétés : fonction () {
  5. //Objet proxy, la valeur par défaut est localstorage
  6. this.sProxy = fenêtre.localStorage;
  7. //60 * 60 * 24 * 30 * 1000 ms ==30 jours
  8. this.defaultLifeTime = 2592000000
  9. //Le cache local est utilisé pour stocker le mappage entre toutes les valeurs de clé de stockage local et les dates d'expiration
  10. this.keyCache = 'SYSTEM_KEY_TIMEOUT_MAP';
  11. //Lorsque la capacité du cache est pleine, le nombre de caches supprimés à chaque fois
  12. this.removeNum = 5 ;
  13. },
  14. assert: function () {
  15. if (
  16. this.sProxy === null) {
  17. lancer « ne pas remplacer la propriété sProxy » ;
  18. }  
  19. },
  20. initialiser : fonction (opts) {
  21. this.propertys();
  22. this.assert();
  23. },
  24. /*
  25. Ajouter un stockage local
  26. Le format des données comprend une valeur de clé unique, une chaîne JSON, une date d'expiration et une date de dépôt
  27. Le signe
  28. est un paramètre de requête formaté, utilisé pour renvoyer de nouvelles données lorsque la même requête a des paramètres différents. Par exemple, si la liste est la ville de Pékin, puis basculée vers Shanghai, il jugera que la balise. est différent et met à jour les données mises en cache. La balise est équivalente à Signature
  29. .
  30. Une seule information sera mise en cache pour chaque valeur clé
  31. */
  32. set : fonction (clé, valeur, délai d'attente, signe) {
  33. var _d = nouveau Date();
  34. //Date de dépôt
  35. var indate = _d.getTime();
  36. //Données enfin enregistrées
  37. var entité = null
  38. ;
  39. si (!timeout) {
  40. _d.setTime(_d.getTime() this.defaultLifeTime);
  41. timeout = _d.getTime();
  42. }  
  43. //
  44. this.setKeyCache(clé, délai d'attente);
  45. entity = this.buildStorageObj(value, indate, timeout, sign); >
  46. essayez {
  47. this.sProxy.setItem(key, JSON.stringify(entity));
  48. renvoie vrai;
  49. } capture(e) {
  50. //Lorsque le stockage local est plein, effacez tout
  51. if (
  52. e.name == 'QuotaExceededError') {
  53. // this.sProxy.clear();
  54. //Lorsque le stockage local est plein, sélectionnez les données les plus proches de l'heure d'expiration à supprimer. Cela aura également un certain impact, mais c'est mieux que de tout effacer. S'il y a trop de caches, ce processus le fera. prendre plus de temps, dans les 100 ms
  55. if (!this.removeLastCache()) throw 'La quantité de données stockées cette fois est trop importante'
  56. this.set(clé, valeur, délai d'attente, signe
  57. );
  58.                                                              
  59. console && console.log(e);
  60. }
  61. return false;
  62. },
  63. //Supprimer le cache expiré
  64. removeOverdueCache : function() {
  65. var tmpObj = null, je, len
  66. var maintenant = nouveau Date().getTime();
  67. //Obtenir la paire clé-valeur
  68. var
  69. cacheStr = this.sProxy.getItem(this.keyCache); var
  70. cacheMap
  71. = []; var newMap
  72. = [];
  73. if (!cacheStr) { retour;
  74. }  
  75. cacheMap
  76. =
  77. JSON
  78. .parse(cacheStr); pour (i
  79. =
  80. 0
  81. ,
  82. len = cacheMap.length; je < len ; > tmpObj = cacheMap[i];
  83. if (tmpObj.timeout < maintenant) {
  84. this.sProxy.removeItem(tmpObj.key); } autre { newMap.push(tmpObj);
  85.                                                              
  86. }  
  87. this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));
  88. },
  89. removeLastCache : function() {
  90. var je, len
  91. var num = this.removeNum ||
  92. //Obtenir la paire clé-valeur
  93. var cacheStr = this.sProxy.getItem(this.keyCache);
  94. var
  95. cacheMap = []; var
  96. delMap
  97. = [];
  98. //Indique que le stockage est trop grand
  99. if (!cacheStr) renvoie false
  100. cacheMap.sort(function (a, b) {
  101. return a.timeout - b.timeout
  102. });
  103. //Quelles données ont été supprimées
  104. delMap
  105. =
  106. cacheMap.splice(0, num); pour (i =
  107. 0
  108. , len = delMap.length; je < len ; > this.sProxy.removeItem(delMap[i].key); }  
  109. this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));
  110. renvoie vrai;
  111. },
  112. setKeyCache : fonction (clé, délai d'attente) {
  113. if (!key || !timeout || timeout <
  114. nouveau
  115. Date().getTime( )) retour; var i, len, tmpObj
  116. //Obtenir la chaîne de valeur de clé actuellement mise en cache
  117. var oldstr
  118. = this
  119. .sProxy.getItem(this.keyCache); var oldMap = []; //Si la clé actuelle existe déjà
  120. var drapeau = faux
  121. ;
  122. var obj = {};   
  123.       obj.key = clé ;   
  124.       obj.timeout = timeout ;   
  125.   
  126.       si (oldstr) {   
  127.         oldMap = JSON.parse(oldstr);   
  128.         if (!_.isArray(oldMap)) oldMap = [];   
  129.       }   
  130.   
  131.       pour (i = 0len = oldMap.length; i < len; i ) {   
  132.         tmpObj = oldMap[i];   
  133.         if (tmpObj.key == key) {   
  134.           oldMap[i] = obj;   
  135.           drapeau = vrai;   
  136.           pause ;   
  137.         }   
  138.       }   
  139.       if (!flag) oldMap.push(obj);   
  140.       //最后将新数组放到缓存中   
  141.       this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  142.   
  143.     },   
  144.   
  145.     buildStorageObj : fonction (valeur, date, délai d'attente, signe) {   
  146.       var obj = {   
  147.         valeur : valeur,   
  148.         délai d'expiration : délai d'expiration,   
  149.         signe : signe,   
  150.         indate: indate   
  151.       } ;   
  152.       return obj ;   
  153.     },
  154. get : fonction (clé, signe) {
  155. résultat var, maintenant = nouveau Date().getTime();
  156. essayez {
  157. résultat = ce.sProxy.getItem(key); if (!result) renvoie null
  158. résultat
  159. = JSON.parse(résultat);
  160. //Expiration des données
  161. if (result.timeout
  162. <
  163. maintenant) renvoie null
  164. //Une vérification de la signature est requise
  165. si (signe) {
  166. if (
  167. signe
  168. === result.sign)
  169. return result.value
  170. renvoie null
  171. } autre {
  172. return result.value
  173.                                                              
  174. } capture(e) {
  175. console && console.log(e);
  176. }  
  177. renvoie null
  178. },
  179. //Obtenir une signature
  180. getSign : fonction (clé) {
  181. résultat var,
  182. signe
  183. =
  184. null
  185. ; essayez {
  186. résultat
  187. =
  188. ce
  189. .sProxy.getItem(key); si (résultat) { résultat
  190. =
  191. JSON
  192. .parse(résultat);
  193. signe = résultat && résultat.sign
  194.                                                               } capture(e) { console && console.log(e);
  195. }  
  196.       panneau de retour ;   
  197.     },   
  198.   
  199.     supprimer : fonction (touche) {   
  200.       return this.sProxy.removeItem(key);   
  201.     },   
  202.   
  203.     clear : function () {   
  204.       this.sProxy.clear();   
  205.     }   
  206.   });   
  207.   
  208.   Storage.getInstance = fonction () {   
  209.     si (cette.instance) {   
  210.       return this.instance ;   
  211.     } autre {   
  212.       return this.instance = new this();   
  213.     }   
  214.   } ;   
  215.   
  216.   retour Stockage ;   
  217.   
  218. });  


Code XML/HTML复制内容到剪贴板
  1. define(['AbstractStorage'], function (AbstractStorage) {
  2. var Store = _.inherit({
  3. //Attributs par défaut
  4. propriétés : fonction () {
  5. //Chaque objet doit avoir une clé de stockage et ne peut pas être répété
  6. this.key = null
  7. ;
  8. //Le cycle de vie par défaut d'une donnée, S correspond aux secondes, M aux minutes, D aux jours
  9. this.lifeTime = '30M'
  10. ;
  11. //Données de retour par défaut
  12. // this.defaultData = null
  13. ;
  14. //Objet proxy, objet localstorage
  15. this.sProxy = nouveau AbstractStorage();
  16. },
  17. setOption : fonction (options) {
  18. _.extend(ce, options);
  19. },
  20. assert: function () {
  21. if (this.key === null) {
  22. lancer « ne pas remplacer la propriété clé » ;
  23. }  
  24. if (this.sProxy === null) {
  25. lancer « ne pas remplacer la propriété sProxy » ;
  26. }  
  27. },
  28. initialiser : fonction (opts) {
  29. this.propertys();
  30. this.setOption(opts);
  31. this.assert();
  32. },   
  33.   
  34.     _getLifeTime: function () {   
  35.       var délai d'attente = 0 ;   
  36.       var str = ce.lifeTime ;   
  37.       var unit = str.charAt(str.length - 1);   
  38.       var num = str.substring(0, str.length - 1);   
  39.       var Carte = {   
  40.         D : 86400,   
  41.         H : 3600,   
  42.         M : 60,   
  43.         S : 1   
  44.       } ;   
  45.       if (type d'unité == 'chaîne') {   
  46.         unitéunité = unit.toUpperCase();   
  47.       }   
  48.       délai d'expiration = num ;   
  49.       si (unité) délai d'attente = Carte[unité] ;   
  50.   
  51.       //单位为毫秒   
  52.       retour num * timeout * 1000 ;   
  53.     },   
  54.   
  55.     //缓存数据   
  56.     set : fonction (valeur, signe) {   
  57.       //获取过期时间   
  58.       var délai d'expiration = nouveau Date();   
  59.       timeout.setTime(timeout.getTime()   this._getLifeTime());   
  60.       this.sProxy.set(this.key, value, timeout.getTime(), sign);   
  61.     },   
  62.   
  63.     //设置单个属性   
  64.     setAttr : fonction (nom, valeur, signe) {   
  65.       clé var , obj ;   
  66.       if (_.isObject(name)) {   
  67.         pour (entrez le nom) {   
  68.           if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);   
  69.         }  
  70.         retour ;   
  71.       }   
  72.   
  73.       if (!sign) sign = this.getSign();   
  74.   
  75.       //获取当前对象   
  76.       obj = ceci.get(signe) || {} ;   
  77.       if (!obj) retour ;   
  78.       obj[nom] = valeur ;   
  79.       this.set(obj, sign);   
  80.   
  81.     },   
  82.   
  83.     getSign: function () {   
  84.       return this.sProxy.getSign(this.key);   
  85.     },   
  86.   
  87.     supprimer : function () {   
  88.       this.sProxy.remove(this.key);   
  89.     },   
  90.   
  91.     removeAttr : function (attrName) {   
  92.       var obj = this.get() || {} ;   
  93.       if (obj[attrName]) {   
  94.         supprimer obj[attrName] ;   
  95.       }   
  96.       this.set(obj);   
  97.     },   
  98.   
  99.     obtenir : fonction (signe) {   
  100.       var result = [], isEmpty = true, une ;   
  101.       var obj = this.sProxy.get(this.key, sign);   
  102.       var type = typeof obj;   
  103.       var o = { 'string' : true, 'number' : true, 'boolean' : true } ;   
  104.       if (o[type]) return obj;   
  105.   
  106.       if (_.isArray(obj)) {   
  107.         pour (var i = 0lenobj.length; i < len; i ) {   
  108.           result[i] = obj[i];   
  109.         }  
  110.       } else if (_.isObject(obj)) {   
  111.         résultat = obj;   
  112.       }   
  113.   
  114.       pour (un en résultat) {   
  115.         isEmpty = false;   
  116.         pause ;   
  117.       }   
  118.       revenir !isEmpty  ? résultat  : nul ;   
  119.     },   
  120.   
  121.     getAttr: function (attrName, tag) {   
  122.       var obj = this.get(tag);   
  123.       var attrVal = null;   
  124.       si (obj) {   
  125.         attrVal = obj[attrName];   
  126.       }   
  127.       return attrVal ;   
  128.     }   
  129.   
  130.   });   
  131.   
  132.   Store.getInstance = fonction () {   
  133.     si (cette.instance) {   
  134.       return this.instance ;   
  135.     } autre {   
  136.       return this.instance = new this();   
  137.     }   
  138.   } ;   
  139.   
  140.   retour Magasin ;   
  141. });  

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

Pour Android Hybrid Le stockage local et le stockage local失效!一个简单不靠谱的解决方案是在webapp中加入:

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

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


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!