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

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

May 16, 2016 pm 03:46 PM
html5 localstorage

ローカルストレージとは

数日前、古いプロジェクトで 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 までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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 でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

See all articles