>  기사  >  웹 프론트엔드  >  HTML5_html5 튜토리얼 기술에서 Localstorage 사용에 대한 튜토리얼

HTML5_html5 튜토리얼 기술에서 Localstorage 사용에 대한 튜토리얼

WBOY
WBOY원래의
2016-05-16 15:46:271619검색

로컬스토리지란 무엇인가요

며칠 전, 이전 프로젝트에서 쿠키 작동이 매우 이상하다는 사실을 발견했습니다. 상담 후 URL에 매개변수가 전달되지 않도록 일부 정보를 캐시하고 싶었지만 쿠키가 발생할 수 있는 문제는 고려하지 않았습니다. 원인:

 ① 쿠키 크기는 약 4k로 제한되어 비즈니스 데이터 저장에 적합하지 않습니다.
 ② 쿠키는 매번 HTTP 트랜잭션과 함께 전송되므로 대역폭이 낭비됩니다

저희는 모바일 프로젝트를 진행하고 있는데, 여기서 정말 활용하기 적합한 기술은 로컬 스토리지입니다. 로컬 스토리지는 쿠키의 최적화라고 할 수 있습니다. 클라이언트에 데이터를 편리하게 저장하는 데 사용할 수 있으며, HTTP이지만 문제 없습니다.

④ localstorage는 크롤러가 크롤링할 수 없으므로 URL 매개 변수 전달을 완전히 대체하는 데 사용하지 마십시오

결함이 장점을 숨기지 않고 위의 문제를 피할 수 있으므로 로컬 스토리지를 어떻게 사용하는지, 어떻게 올바르게 사용하는지에 초점을 맞춰야 합니다.
로컬스토리지 활용

기본지식

로컬 스토리지 저장소 개체에는 두 가지 유형이 있습니다.

 ① sessionStrage: 세션은 세션을 의미합니다. 여기서 세션은 사용자가 웹사이트를 탐색할 때 웹사이트에 입장한 후 웹사이트를 닫을 때까지의 기간을 의미합니다.

 ② localStorage: 데이터가 무엇이든 클라이언트 하드웨어 장치에 데이터를 저장합니다. 즉, 다음에 컴퓨터를 켤 때 데이터가 그대로 유지됩니다.

둘의 차이점은 하나는 임시 보관용이고 다른 하나는 장기 보관용이라는 점입니다.

기본 사용법을 설명하는 간단한 코드는 다음과 같습니다.

XML/HTML 코드
클립보드에 콘텐츠 복사
  1. <div id="msg"  스타일="여백: 10px 0; 테두리: 1px 단색 검은색; 패딩: 10px; 너비: 300px;   
  2.   높이: 100px;">  
  3. div>  
  4. <입력 유형="텍스트"  id="text" />
  5. <선택 id="type" >  
  6.   <옵션 ="세션" >세션저장옵션>  
  7.   <옵션 ="로컬" >로컬스토리지옵션>  
  8. 선택>  
  9. <버튼 클릭="저장( );">  
  10.   保存数据버튼>  
  11. <버튼 클릭="load( );">  
  12.   读取数据버튼>  
  13. <스크립트 유형="text/ javascript">  
  14.   var msg = document.getElementById('msg'),   
  15.            텍스트 = 문서.getElementById('text'),   
  16.             유형 = 문서.getElementById('type');   
  17.   
  18.   함수 save() {   
  19.     var str = text.value;   
  20.     var t = type.value;   
  21.     if (t == '세션') {   
  22.       sessionStorage.setItem('msg', str);   
  23.     } 그밖에 {   
  24.       localStorage.setItem('msg', str);   
  25.     }   
  26.   }   
  27.   
  28.   함수 load() {   
  29.     var t = type.value;   
  30.     if (t == '세션') {   
  31.       msg.innerHTML = sessionStorage.getItem('msg');   
  32.     } 그밖에 {   
  33.       msg.innerHTML = localStorage.getItem('msg');   
  34.     }   
  35.   }   
  36. 스크립트>  

 真实场景

  实际工作中对localstorage를 사용하는 데 사용하는 일이 없습니다.

  ① 缓存一般信息,如搜索页적 OUT发citycity,达到citycity ,不实时定位信息

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

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

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

XML/HTML 코드复复内容到剪贴板
  1. define([], function () {
  2. var 저장소 = _.inherit({
  3. //기본 속성
  4. 속성: 함수() {
  5. //프록시 객체, 기본값은 localstorage
  6. this.sProxy = .localStorage
  7. //60 * 60 * 24 * 30 * 1000 ms ==30일
  8. this.defaultLifeTime = 2592000000
  9. //로컬 캐시는 모든 localstorage 키 값과 만료 날짜 간의 매핑을 저장하는 데 사용됩니다.
  10. this.keyCache = 'SYSTEM_KEY_TIMEOUT_MAP';
  11. //캐시 용량이 가득 차면 매번 삭제되는 캐시 개수
  12. this.removeNum = 5;
  13. },
  14. 주장: 함수 () {
  15. if (
  16. this.sProxy
  17. === null) { throw 'sProxy 속성을 재정의하지 않음'
  18. }  
  19. },
  20. 초기화: 함수(선택) {
  21. this.propertys()
  22. this.assert()
  23. },
  24. /*
  25. 로컬 저장소 추가
  26. 데이터 형식에는 고유 키 값, json 문자열, 만료 날짜, 입금 날짜가 포함됩니다.
  27. 기호는 동일한 요청에 다른 매개변수가 있을 때 새 데이터를 반환하는 데 사용되는 형식화된 요청 매개변수입니다. 예를 들어 목록이 베이징 시이고 상하이로 전환된 경우 태그가 다음과 같은 것으로 판단됩니다. 다르며 캐시된 데이터를 업데이트합니다. 태그는 서명
  28. 과 동일합니다.
  29. 각 키 값에 대해 하나의 정보만 캐시됩니다.
  30. */
  31. 집합: 함수(키, 값, 시간 초과, 부호) {
  32. var _d = 날짜()
  33. //입금일
  34. var indate = _d.getTime()
  35. //최종 저장 데이터
  36. var 엔티티 = null;
  37. if (!timeout) {
  38. _d.setTime(_d.getTime() this.defaultLifeTime)
  39. 시간 초과 = _d.getTime()
  40. }  
  41. //
  42. this.setKeyCache(key, timeout)
  43. entity = this.buildStorageObj(value, indate, timeout, sign)
  44. 시도해보세요 {
  45. this.sProxy.setItem(key, JSON.stringify(entity))
  46. true를 반환합니다.
  47. } 잡기 (e) {
  48. //로컬 스토리지가 가득 차면 모두 삭제
  49. if (
  50. e.name == 'QuotaExceededError') {
  51. // this.sProxy.clear()
  52. if (!this.removeLastCache()) throw '이번에 저장된 데이터의 양이 너무 큽니다.'
  53. this.set(key, value, timeout, sign)
  54.                                                        
  55. 콘솔 && console.log(e)
  56. }
  57. false 반환
  58. },
  59. //만료된 캐시 삭제
  60. RemoveOverdueCache: 함수 () {
  61. var tmpObj = null, i, len;
  62. var
  63. 지금 = new Date().getTime()
  64. //키-값 쌍 가져오기
  65. var
  66. cacheStr = this.sProxy.getItem(this.keyCache)
  67. var
  68. cacheMap = []
  69. var
  70. newMap = []
  71. if (!cacheStr) {
  72. 복귀
  73. }  
  74. cacheMap = JSON.parse(cacheStr)
  75. for (
  76. i = 0, len = cacheMap.length; i < len; >
  77. tmpObj = cacheMap[i] if (tmpObj.timeout
  78. < 지금) { this.sProxy.removeItem(tmpObj.key)
  79. } else {
  80. newMap.push(tmpObj)
  81.                                                        
  82. }  
  83. this.sProxy.setItem(this.keyCache, JSON.stringify(newMap))
  84. },
  85. 제거LastCache: 함수() {
  86. var i, len
  87. var num = this.removeNum || 5;
  88. //키-값 쌍 가져오기
  89. var
  90. cacheStr = this.sProxy.getItem(this.keyCache)
  91. var
  92. cacheMap = []
  93. var
  94. delMap = []
  95. //저장용량이 너무 크다는 표시
  96. if (!cacheStr) 반환 false
  97. 캐시맵.정렬(함수 (a, b) {
  98. a.timeout 반환 - b.timeout
  99. })
  100. //삭제된 데이터
  101. delMap = cacheMap.splice(0, num); for (
  102. i
  103. = 0, len = delMap.length; i < len; > this.sProxy.removeItem(delMap[i].key)
  104. }  
  105. this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap))
  106. true를 반환합니다.
  107. },
  108. setKeyCache: 함수(키, 시간 초과) {
  109. if (!key || !timeout || timeout <
  110. new Date().getTime( )) 반환 var i, len, tmpObj
  111. //현재 캐시된 키 값 문자열 가져오기
  112. var oldstr
  113. = this.sProxy.getItem(this.keyCache) var oldMap
  114. = [] //현재 키가 이미 존재하는지 여부
  115. var 플래그
  116. = false; var obj = {};   
  117.       obj.key = key;   
  118.       obj.timeout = 시간 초과;   
  119.   
  120.       if (oldstr) {   
  121.         oldMap = JSON.parse(oldstr);   
  122.         if (!_.isArray(oldMap)) oldMap = [];   
  123.       }   
  124.   
  125.       for (i = 0len = oldMap.length;  i < len;  i ) {   
  126.         tmpObj = oldMap[i];   
  127.         if (tmpObj.key == key) {   
  128.           oldMap[i] = obj;   
  129.           플래그 = ;   
  130.           휴식;   
  131.         }   
  132.       }   
  133.       if (!flag) oldMap.push(obj);   
  134.       //最后将新数组放到缓存中   
  135.       this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  136.   
  137.     },   
  138.   
  139.     buildStorageObj: 함수 (값, indate, timeout, sign) {   
  140.       var obj = {   
  141.         값: 값,   
  142.         시간 초과: 시간 초과,   
  143.         기호: 서명,   
  144.         indate: indate   
  145.       };   
  146.       obj 반환;   
  147.     },
  148. get: 함수(키, 기호) {
  149. var 결과, now = new Date().getTime()
  150. 시도해보세요 {
  151. 결과 = .sProxy.getItem(key)
  152. if(!result)는 null을 반환합니다.
  153. 결과 = JSON.parse(결과)
  154. //데이터 만료
  155. if (result.timeout < now) return null;
  156. //서명확인이 필요합니다
  157. if (부호) {
  158. if (
  159. sign === result.sign)
  160. 결과.값 반환
  161. null 반환
  162. } else {
  163. 결과.값 반환
  164.                                                        
  165. } 잡기 (e) {
  166. 콘솔 && console.log(e)
  167. }  
  168. null 반환
  169. },
  170. //서명 받기
  171. getSign: 함수(키) {
  172. var 결과,
  173. sign
  174. = null; 시도해보세요 {
  175. 결과
  176. =
  177. .sProxy.getItem(key) if (결과) {
  178. 결과
  179. =
  180. JSON.parse(결과) sign
  181. =
  182. 결과 && result.sign                                                         } 잡기 (e) {
  183. 콘솔 && console.log(e)
  184. }  
  185.       반환 기호;   
  186.     },   
  187.   
  188.     제거: 기능(키) {   
  189.       return this.sProxy.removeItem(key);   
  190.     },   
  191.   
  192.     지우기: 함수 () {   
  193.       this.sProxy.clear();   
  194.     }   
  195.   });   
  196.   
  197.   Storage.getInstance = 함수 () {   
  198.     if (this.instance) {   
  199.       return this.instance;   
  200.     } 그밖에 {   
  201.       return this.instance = new this();   
  202.     }   
  203.   };   
  204.   
  205.   반납 저장소;   
  206.   
  207. });  

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

XML/HTML 코드复复内容到剪贴板
  1. define(['AbstractStorage'], function(AbstractStorage) {
  2. var Store = _.inherit({
  3. //기본 속성
  4. 속성: 함수() {
  5. //각 객체에는 저장 키가 있어야 하며 반복할 수 없습니다.
  6. this.key = null;
  7. //데이터의 기본 수명 주기, S는 초, M은 분, D는 일
  8. this.lifeTime = '30M';
  9. //기본 반환 데이터
  10. //
  11. this.defaultData
  12. = null
  13. //프록시 객체, 로컬 저장소 객체
  14. this.sProxy
  15. = new AbstractStorage()
  16. },
  17. setOption: 함수(옵션) {
  18. _.extend(this, 옵션)
  19. },
  20. 주장: 함수 () {
  21. if (
  22. this.key
  23. === null) { '키 속성을 재정의하지 않음'을 발생시킵니다.
  24. }  
  25. if (
  26. this.sProxy
  27. === null) { throw 'sProxy 속성을 재정의하지 않음'
  28. }  
  29. },
  30. 초기화: 함수(선택) {
  31. this.propertys()
  32. this.setOption(opts)
  33. this.assert()
  34. },   
  35.   
  36.     _getLifeTime: 함수 () {   
  37.       var 시간 초과 = 0;   
  38.       var str = this.lifeTime;   
  39.       var 단위 = str.charAt(str.length - 1);   
  40.       var num = str.substring(0, str.length - 1);   
  41.       var 지도 = {   
  42.         D: 86400,   
  43.         H: 3600,   
  44.         남: 60,   
  45.         대: 1   
  46.       };   
  47.       if (typeof unit == 'string') {   
  48.         단위단위 = unit.toUpperCase();   
  49.       }   
  50.       시간 초과 = 번호;   
  51.       if (단위) 시간 초과 = 지도[단위];   
  52.   
  53.       //单位为毫秒   
  54.       반환 숫자 * 시간 초과 * 1000 ;   
  55.     },   
  56.   
  57.     //缓存数据   
  58.     설정: 함수(값, 기호) {   
  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: 함수(이름, 값, 기호) {   
  67.       var key, obj;   
  68.       if (_.isObject(이름)) {   
  69.         (키 입력 이름) {   
  70.           if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);   
  71.         }  
  72.         반품;   
  73.       }   
  74.   
  75.       if (!sign) sign = this.getSign();   
  76.   
  77.       //获取当前对象   
  78.       obj = 이것.get(sign) || {};   
  79.       (!obj) return인 경우;   
  80.       obj[이름] = 값;   
  81.       this.set(obj, sign);   
  82.   
  83.     },   
  84.   
  85.     getSign: 함수 () {   
  86.       return this.sProxy.getSign(this.key);   
  87.     },   
  88.   
  89.     제거: 함수 () {   
  90.       this.sProxy.remove(this.key);   
  91.     },   
  92.   
  93.     removeAttr: 함수 (attrName) {   
  94.       var obj = this.get() || {};   
  95.       if (obj[attrName]) {   
  96.         obj[attrName] 삭제;   
  97.       }   
  98.       this.set(obj);   
  99.     },   
  100.   
  101.     get: 함수(부호) {   
  102.       var 결과 = [], isEmpty = true, a;   
  103.       var obj = this.sProxy.get(this.key, sign);   
  104.       var 유형 = 유형 obj;   
  105.       var o = { 'string': true, 'number': true, 'boolean': true };   
  106.       if (o[type]) return obj;   
  107.   
  108.       if (_.isArray(obj)) {   
  109.         for (var i = 0lenobj.length;  i < len;  i ) {   
  110.           결과[i] = obj[i];   
  111.         }  
  112.       } else if (_.isObject(obj)) {   
  113.         결과 = obj;   
  114.       }   
  115.   
  116.       (결과적으로) {   
  117.         isEmpty = false;   
  118.         휴식;   
  119.       }   
  120.       return !isEmpty ? 결과 : null;   
  121.     },   
  122.   
  123.     getAttr: 함수(attrName, 태그) {   
  124.       var obj = this.get(tag);   
  125.       var attrVal = null;   
  126.       if (obj) {   
  127.         attrVal = obj[attrName];   
  128.       }   
  129.       attrVal 반환;   
  130.     }   
  131.   
  132.   });   
  133.   
  134.   Store.getInstance = 함수 () {   
  135.     if (this.instance) {   
  136.       return this.instance;   
  137.     } 그밖에 {   
  138.       return this.instance = new this();   
  139.     }   
  140.   };   
  141.   
  142.   매장 반품;   
  143. });  

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

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

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

 结语

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.