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

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

May 16, 2016 pm 03:46 PM
html5 localstorage

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

며칠 전, 이전 프로젝트에서 쿠키 작동이 매우 이상하다는 사실을 발견했습니다. 상담 후 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으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML의 테이블 테두리 HTML의 테이블 테두리 Sep 04, 2024 pm 04:49 PM

HTML의 테이블 테두리 안내. 여기에서는 HTML의 테이블 테두리 예제를 사용하여 테이블 테두리를 정의하는 여러 가지 방법을 논의합니다.

HTML의 중첩 테이블 HTML의 중첩 테이블 Sep 04, 2024 pm 04:49 PM

HTML의 Nested Table에 대한 안내입니다. 여기에서는 각 예와 함께 테이블 내에 테이블을 만드는 방법을 설명합니다.

HTML 여백-왼쪽 HTML 여백-왼쪽 Sep 04, 2024 pm 04:48 PM

HTML 여백-왼쪽 안내. 여기에서는 HTML margin-left에 대한 간략한 개요와 코드 구현과 함께 예제를 논의합니다.

HTML 테이블 레이아웃 HTML 테이블 레이아웃 Sep 04, 2024 pm 04:54 PM

HTML 테이블 레이아웃 안내. 여기에서는 HTML 테이블 레이아웃의 값에 대해 예제 및 출력 n 세부 사항과 함께 논의합니다.

HTML에서 텍스트 이동 HTML에서 텍스트 이동 Sep 04, 2024 pm 04:45 PM

HTML에서 텍스트 이동 안내. 여기서는 Marquee 태그가 구문과 함께 작동하는 방식과 구현할 예제에 대해 소개합니다.

HTML 정렬 목록 HTML 정렬 목록 Sep 04, 2024 pm 04:43 PM

HTML 순서 목록에 대한 안내입니다. 여기서는 HTML Ordered 목록 및 유형에 대한 소개와 각각의 예에 대해서도 설명합니다.

HTML 온클릭 버튼 HTML 온클릭 버튼 Sep 04, 2024 pm 04:49 PM

HTML onclick 버튼에 대한 안내입니다. 여기에서는 각각의 소개, 작업, 예제 및 다양한 이벤트의 onclick 이벤트에 대해 설명합니다.

HTML 입력 자리 표시자 HTML 입력 자리 표시자 Sep 04, 2024 pm 04:54 PM

HTML 입력 자리 표시자 안내. 여기서는 코드 및 출력과 함께 HTML 입력 자리 표시자의 예를 논의합니다.

See all articles