ホームページ  >  記事  >  ウェブフロントエンド  >  HTML5 での Localstorage の使用に関するチュートリアル_html5 チュートリアル スキル

HTML5 での Localstorage の使用に関するチュートリアル_html5 チュートリアル スキル

WBOY
WBOYオリジナル
2016-05-16 15:46:271619ブラウズ

ローカルストレージとは

数日前、古いプロジェクトで Cookie の動作が非常に奇妙なことに気づきました。相談した結果、URL にパラメータを渡さないように情報をキャッシュしたいと思いましたが、Cookie が引き起こす問題については考慮していませんでした。原因:

① Cookie のサイズは約 4k に制限されており、ビジネスデータの保存には適していません
② Cookie は毎回 HTTP トランザクションと一緒に送信されるため、帯域幅が無駄に消費されます

私たちはモバイルプロジェクトを行っているため、ここで使用するのに本当に適したテクノロジーはローカルストレージです。ローカルストレージは、クライアント上にデータを保存するために使用でき、データは送信されません。 HTTP ですが、問題ありません:

① localstorage のサイズは約 500 万文字に制限されており、異なるブラウザでは一貫性がありません
② Localstorage はプライバシー モードでは読み取れません
③ localstorage の本質は、ファイルがあれば読み書きすることです。データが大量にあるとスタックしてしまいます (Firefox は一度にデータをメモリにインポートすることを考えると恐ろしいです)
④ localstorage はクローラーによってクロールされません。URL パラメーターの受け渡しを完全に置き換える目的で使用しないでください

欠点は利点を隠すものではありません。上記の問題は回避できるため、ローカルストレージの使用方法とそれを正しく使用する方法に重点を置く必要があります。
localstorageの使い方
基礎知識

localstorage ストレージ オブジェクトには 2 つのタイプがあります:

① sessionStrage: セッションとは、ユーザーがウェブサイトを閲覧する際に、ウェブサイトにアクセスしてからウェブサイトを閉じるまでの期間を指します。セッションオブジェクトの有効期間はごくわずかです。

② localStorage: データが何であれ、クライアント ハードウェア デバイスにデータを保存します。これは、次回コンピューターの電源を入れたときにもデータがまだそこにあることを意味します。

2 つの違いは、1 つは一時保管用で、もう 1 つは長期保管用であることです。

基本的な使用法を示す簡単なコードを次に示します。

XML/HTML コードコンテンツをクリップボードにコピー
  1. <div id="msg" スタイル="margin: 10px 0; border: 1px solid black; padding: 10px; width: 300px;
  2. 高さ: 100px;">
  3. div>
  4. <入力 type="テキスト" id="テキスト" />
  5. <select id="type" >
  6. <オプション ="セッション" >セッションストレージオプション>
  7. <オプション ="ローカル" >localStorageオプション>
  8. 選択>
  9. <ボタン クリック="save( );">
  10. データ保存ボタン>
  11. <ボタン onclick="load( );">
  12. 读取数据ボタン>
  13. <スクリプト type="text/ javascript">
  14. var msg = ドキュメント.getElementById('msg'),
  15. テキスト = ドキュメント.getElementById('text'),
  16. タイプ = ドキュメント.getElementById('type');   
  17. 関数 save() {
  18. var str = text.value;   
  19. var t = type.value;   
  20. if (t == 'セッション') {
  21. sessionStorage.setItem('msg', str);   
  22. } else {
  23. localStorage.setItem('msg', str);   
  24. }
  25. }
  26. 関数 load() {
  27. var t = type.value;   
  28. if (t == 'セッション') {
  29. msg.innerHTML = sessionStorage.getItem('msg');   
  30. } else {
  31. msg.innerHTML = localStorage.getItem('msg');   
  32. }
  33. }
  34. スクリプト>

真实场景

实际作業中におけるローカルストレージの使用一般には以下の要件があります:

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

② 缓存城市列表データベース、这个データ往往比较大

③每条缓存信息要可追跡,比如服务器通知城市データ更新,这時候最近访问的時候要自动設置过期

④ 每条信息有期日期状態态,期期外時間期間需要服务器拉取データ

XML/HTML コード复制コンテンツ到剪贴板
  1. define([], function () {
  2. var ストレージ = _.inherit({
  3. //デフォルト属性
  4. プロパティ: function () {
  5. //プロキシ オブジェクト、デフォルトは localstorage
  6. this.sProxy = ウィンドウ.localStorage;
  7. //60 * 60 * 24 * 30 * 1000
  8. ms ==30 日
  9. this.defaultLifeTime = 2592000000 ;
  10. //ローカル キャッシュは、すべての localstorage キー値と有効期限間のマッピングを保存するために使用されます
  11. this.keyCache
  12. = 'SYSTEM_KEY_TIMEOUT_MAP' ;
  13. //キャッシュ容量がいっぱいになった場合、毎回削除されるキャッシュの数
  14. this.removeNum
  15. =
  16. 5; }、
  17. アサート: function () {
  18. if (
  19. this.sProxy
  20. === null) {
  21. throw 'sProxy プロパティをオーバーライドしません' ; }
  22. }、
  23. 初期化: function (opts) {
  24. this.propertys();
  25. this.assert();
  26. }、
  27. /*
  28. ローカルストレージを追加
  29. データ形式には、一意のキー値、JSON 文字列、有効期限、入金日が含まれます
  30. 記号は書式設定されたリクエスト パラメータで、同じリクエストに異なるパラメータがある場合に新しいデータを返すために使用されます。たとえば、リストが北京市であった場合に上海に切り替わった場合、タグであると判断されます。は異なり、キャッシュされたデータを更新します。タグは署名
  31. と同等です。
  32. 各キー値に対して 1 つの情報のみがキャッシュされます
  33. */
  34. set: 関数 (キー、値、タイムアウト、符号) {
  35. var _d = 新しい Date();
  36. //入金日
  37. var
  38. indate = _d.getTime();
  39. //最後にデータを保存しました
  40. var
  41. エンティティ
  42. = null;
  43. if (!timeout) {
  44. _d.setTime(_d.getTime() this.defaultLifeTime);
  45. タイムアウト
  46. =
  47. _d.getTime(); }
  48. //
  49. this.setKeyCache(キー, タイムアウト)
  50. エンティティ
  51. =
  52. this
  53. .buildStorageObj(値、更新、タイムアウト、符号); > 試してみましょう {
  54. this.sProxy.setItem(key, JSON.stringify(entity));
  55. true を返します。
  56. } catch (e) {
  57. //ローカルストレージがいっぱいになったら、すべてクリアします
  58. if (
  59. e.name
  60. == 'QuotaExceededError') {
  61. // this.sProxy.clear();
  62. //ローカルストレージがいっぱいの場合、有効期限に最も近いデータを選択して削除します。これも多少の影響はありますが、キャッシュが多すぎる場合は、このプロセスがすべてクリアされるよりも良いと感じます。 100 ミリ秒以内に、さらに時間がかかります
  63. if (!this.removeLastCache()) throw '今回保存されたデータの量が多すぎます';
  64. this.set(キー、値、タイムアウト、符号);
  65. コンソール && console.log(e);
  66. }
  67. は false を返します。
  68. }、
  69. //期限切れのキャッシュを削除
  70. RemoveOverdueCache: function () {
  71. var tmpObj = null, i, len;
  72. var
  73. now = new Date().getTime(); //キーと値のペアを取得します
  74. var
  75. cacheStr
  76. = this.sProxy.getItem(this.keyCache); var cacheMap
  77. = [];
  78. var newMap = [];
  79. if (!cacheStr) {
  80. 戻る
  81. }
  82. cacheMap
  83. =
  84. JSON
  85. .parse(cacheStr);
  86. for (i =
  87. 0
  88. ,
  89. len
  90. = cacheMap.length; i < len; > tmpObj = cacheMap[i]; if (tmpObj.timeout
  91. < now) { this.sProxy.removeItem(tmpObj.key);
  92. } else { newMap.push(tmpObj);
  93. }
  94. this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));
  95. }、
  96. RemoveLastCache: function () {
  97. 変数 i、レン
  98. var num = this.removeNum ||
  99. //キーと値のペアを取得します
  100. var cacheStr = this.sProxy.getItem(this.keyCache);
  101. var
  102. cacheMap = []; var
  103. delMap
  104. = [];
  105. //ストレージが大きすぎることを示します
  106. if (!cacheStr) が false を返す
  107. cacheMap.sort(function (a, b) {
  108. a.timeout - b.timeout を返します
  109. });
  110. //削除されたデータ
  111. delMap
  112. =
  113. cacheMap.splice(0, num); for (i =
  114. 0
  115. , len = delMap.length; i < len; > this.sProxy.removeItem(delMap[i].key); }
  116. this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));
  117. true を返します。
  118. }、
  119. setKeyCache: function (key, timeout) {
  120. if (!key || !timeout || timeout <
  121. new
  122. Date().getTime( )) 戻る; var i、len、tmpObj;
  123. //現在キャッシュされているキー値文字列を取得します
  124. var oldstr
  125. = this
  126. .sProxy.getItem(this.keyCache); var oldMap = []; //現在のキーがすでに存在するかどうか
  127. var フラグ = false
  128. ; var
  129. obj = {};   
  130. obj.key = キー;   
  131. obj.timeout = タイムアウト;   
  132. if (oldstr) {
  133. oldMap = JSON.parse(oldstr);   
  134. if (!_.isArray(oldMap)) oldMap = [];   
  135. }
  136. for (i = 0, len = oldMap.length; i < len; i ) {
  137. tmpObj = oldMap[i];   
  138. if (tmpObj.key == key) {
  139. oldMap[i] = obj;   
  140. フラグ = true;   
  141. 休憩;   
  142. }
  143. }
  144. if (!flag) oldMap.push(obj);   
  145. //最後将新数组を缓存中に放出
  146. this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap));   
  147. }、
  148. buildStorageObj: function (value, indate, timeout, sign) {
  149. var obj = {
  150. 値: 値、
  151. タイムアウト: タイムアウト、
  152. 記号: 記号、
  153. indate: indate
  154. };   
  155. オブジェクトを返す;   
  156. }、
  157. get: function (key,sign) {
  158. var result、now = new Date().getTime();
  159. 試してみましょう {
  160. 結果 = この.sProxy.getItem(key); if (!result) が null を返す
  161. 結果
  162. = JSON.parse(結果);
  163. //データの有効期限
  164. if (result.timeout
  165. <
  166. now)
  167. //署名検証が必要です
  168. if (符号) {
  169. if (
  170. sign
  171. === result.sign)
  172. 結果の値を返します
  173. null を返します。
  174. } else {
  175. 結果の値を返します
  176. } catch (e) {
  177. コンソール && console.log(e);
  178. }
  179. null を返します。
  180. }、
  181. //署名を取得
  182. getSign: function (key) {
  183. var 結果、
  184. sign
  185. =
  186. null
  187. ;
  188. 試してみましょう { 結果 =
  189. この
  190. .sProxy.getItem(key);
  191. if (結果) {
  192. 結果 = JSON
  193. .parse(結果);
  194. sign
  195. = result && result.sign
  196. } catch (e) {
  197. コンソール && console.log(e); }  
  198. リターン 記号;   
  199. }、
  200. 削除: 関数 (キー) {
  201. return this.sProxy.removeItem(key);   
  202. }、
  203. clear: function () {
  204. this.sProxy.clear();   
  205. }
  206. });   
  207. Storage.getInstance = 関数 () {
  208. if (this.instance) {
  209. this.instance を返す;   
  210. } else {
  211. return this.instance = new this();   
  212. }
  213. };   
  214. ストレージを返す;   
  215. });  

このセグメントコードにはローカルストレージの基本的な操作が含まれており、上記の処理が実行されているため、実際の使用はさらに抽象化されます:

XML/HTML コード复制コンテンツ到剪贴板
  1. define(['AbstractStorage'], function (AbstractStorage) {
  2. var ストア = _.inherit({
  3. //デフォルト属性
  4. プロパティ: function () {
  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. =
  16. new AbstractStorage(); }、
  17. setOption: 関数 (オプション) {
  18. _.extend(this, options)
  19. ;
  20. }、
  21. アサート: function () {
  22. if (
  23. this.key
  24. === null) {
  25. 'キープロパティを上書きしない' をスローします ; }
  26. if (
  27. this.sProxy
  28. === null) {
  29. throw 'sProxy プロパティをオーバーライドしません' ; }
  30. }、
  31. 初期化: function (opts) {
  32. this.propertys();
  33. this.setOption(opts);
  34. this.assert();
  35. },
  36. _getLifeTime: function () {
  37. var タイムアウト = 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 地図 = {
  42. D: 86400,
  43. H: 3600、
  44. M: 60,
  45. S: 1
  46. };   
  47. if (typeof unit == 'string') {
  48. ユニットユニット = unit.toUpperCase();   
  49. }
  50. タイムアウト = num;   
  51. if (unit) timeout = Map[unit];   
  52. //单位は毫秒
  53. return num * timeout * 1000 ;   
  54. }、
  55. //缓存データ
  56. set: 関数 (値, 符号) {
  57. //获取过期時間
  58. var timeout = new Date();   
  59. timeout.setTime(timeout.getTime() this._getLifeTime());   
  60. this.sProxy.set(this.key, value, timeout.getTime(), sign);   
  61. }、
  62. //设置单个プロパティ
  63. setAttr: function (name, value, sign) {
  64. var key, obj;   
  65. if (_.isObject(name)) {
  66. for (名前のキー) {
  67. if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);   
  68. }  
  69. 戻る;   
  70. }
  71. if (!sign) sign = this.getSign();   
  72. //获取当前对象
  73. obj = this.get(sign) || {};   
  74. if (!obj) return;   
  75. obj[名前] = 値;   
  76. this.set(obj, sign);   
  77. }、
  78. getSign: function () {
  79. return this.sProxy.getSign(this.key);   
  80. }、
  81. 削除: function () {
  82. this.sProxy.remove(this.key);   
  83. }、
  84. removeAttr: function (attrName) {
  85. var obj = this.get() || {};   
  86. if (obj[attrName]) {
  87. obj[attrName] を削除します。   
  88. }
  89. this.set(obj);   
  90. }、
  91. get: function (sign) {
  92. var 結果 = [],isEmpty = true、a;   
  93. var obj = this.sProxy.get(this.key, sign);   
  94. var type = typeof obj;   
  95. var o = { 'string': true, 'number': true, 'boolean': true };   
  96. if (o[type]) return obj;   
  97. if (_.isArray(obj)) {
  98. for (var i = 0, len = obj.length; i < len; i ) {
  99. 結果[i] = obj[i];   
  100. }  
  101. } else if (_.isObject(obj)) {
  102. 結果 = obj;   
  103. }
  104. for (a in result) {
  105. isEmpty = false;   
  106. 休憩;   
  107. }
  108. return !isEmpty ? 結果: null;   
  109. }、
  110. getAttr: function (attrName, tag) {
  111. var obj = this.get(tag);   
  112. var attrVal = null;   
  113. if (obj) {
  114. attrVal = obj[attrName];   
  115. }
  116. return attrVal;   
  117. }
  118. });   
  119. Store.getInstance = 関数 () {
  120. if (this.instance) {
  121. this.instance を返す;   
  122. } else {
  123. return this.instance = new this();   
  124. }
  125. };   
  126. ストアに戻る;   
  127. });  

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

保存完了、以後ずっと実行要求なし、今日の代コード基本終了、最後に Android ハイブリッド内に後退錉があり、この钮が下に来ると上の 1 つの面に戻り、今度は気候の面のローカルストレージが读取される可能性があります失效! 一つの解決策はウェブアプリに追加されています:

XML/HTML コード复制コンテンツ到剪贴板
  1. window.onunload = function () { };//适合单页应用、不要问我は物么、我也不知道

结语

localstorage は移動開墾必需的技术点,深深理解が必要,特定の务代コード後续会が git 上に放り出す,有関心な友友可去知

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。