HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
HTML5のLocalStorageとsessionStorageを使ったことがある人は、HTML5が非常に強力で、クッキーやセッションよりもずっと優れていることを実感していると思いますが、この知識を以下で学んでいきましょう...
一番最初のクッキーは当然誰でも知っているもので、問題は主に4KB程度と小さすぎることと、IE6では1ドメインあたり20個のクッキーしかサポートしておらず、少なすぎるということです。メリットは、誰もがサポートしていること、そして、かなりサポートされていることです。以前javascriptを無効にしたユーザーがもう存在しないように、ずっと前にクッキーを無効にしたユーザーは徐々に存在しなくなりつつあります。
まず当然のこととして、ブラウザがローカルストレージをサポートしているかどうかを確認します。HTML5では、ローカルストレージはlocalStorageとsessionStorageを含むウィンドウのプロパティであり、両者の違いはその名前から明らかでしょう。どちらも全く同じように使われますので、ここではlocalStorageの例を示します。
if(window.localStorage){
<未定義
alert('このブラウザはlocalStorageをサポートしています');
}else{
<未定義
alert('このブラウザはlocalStorageをサポートしていません');
}
データを保存する方法は、例えば window.localStorage.a や window.localStorage["a"] のように、プロパティに直接追加することです。これは、次のように、キーと値のペアの形式で簡単な読み取り、書き込み、および削除の操作を行います。
localStorage.a = 3;//a に "3" をセットします。
localStorage["a"] = "ssf";//a を "ssf" に設定、上記の値をオーバーライドする
localStorage.setItem("b","isaac");//b を "isaac" にセットします。
var a1 = localStorage["a"];//a の値を取得します。
var a2 = localStorage.a;//aの値を取得します。
var b = localStorage.getItem("b");//b の値を取得します。
localStorage.removeItem("c");//c の値を消去します。
ここで使うべきメソッドは、当然ながらgetItem()とsetItem()、そしてremoveItem()でKey-Valueペアをクリアするのが最もおすすめです。もし、すべてのKey-Valueペアを一度にクリアしたいのであれば、clear()を使用することができます。また、HTML5では以下のようにkey()メソッドが用意されており、どのようなキー値があるかわからない場合に利用することができます。
var storage = window.localStorage;
関数 showStorage(){
<未定義
for(var i=0;i<storage.length;i++){
<未定義
//key(i) は対応するキーを取得し、getItem() メソッドは対応する値を取得します。
document.write(storage.key(i) + " : " + storage.getItem(storage.key(i)))です。+ "<br>")。
}
}
なお、HTML5のローカルストレージは文字列しか格納できず、格納された形式は自動的に文字列に変換されるため、読み込む際には自分で型変換をする必要があります。そのため、先のコードでは parseInt を使用する必要があります。
また、iPhone/iPadでsetItem()を設定すると変なQUOTA_EXCEEDED_ERRエラーが出ることがあるので、通常はsetItemの前にremoveItem()を設定すればOKです。
HTML5のローカルストレージは、キーと値のペアの変更をリッスンするストレージイベントも提供しており、次のように使用します。
if(window.addEventListener){.
<未定義
window.addEventListener("storage",handle_storage,false);
}else if(window.attachEvent){.
<未定義
window.attachEvent("onstorage",handle_storage);
}
関数 handle_storage(e){
<未定義
if(!e){e=window.event;}。
//showStorage();
}
イベント変数eについては、StorageEventオブジェクトであり、以下のように、キーと値のペアの変化を見るのに適した、多くの便利なプロパティを提供します。
<テーブル
物件名
タイプ
説明
キー
文字列
追加、削除、または修正された名前付きキー
古い値
任意の
以前の値(現在は上書きされています)、または新しい項目が追加された場合はnullです。
新しい値
任意の
新しい値、または項目が追加された場合はNULL
url/uri
文字列
この変更の引き金となったメソッドを呼び出したページ
ここでは、2つのキーと値の組a,bを追加し、ボタンを追加しています。aに固定値を設定し、ボタンがクリックされたら、b:の値を変更します。
<body>
<p>You have viewed this page <span id="count">0</span> time(s). </p>
<p><input type="button" value="changeStorage" onClick="changeS()"/></p>
<script>
var storage = window.localStorage;
if (!storage.getItem("pageLoadCount")) storage.setItem("pageLoadCount",0);
storage.pageLoadCount = parseInt(storage.getItem("pageLoadCount"))) + 1;// フォーマットする必要があります
document.getElementByIdx_x("count").innerHTML = storage.pageLoadCount;
showStorage() を実行します。
if(window.addEventListener){。
<未定義
window.addEventListener("storage",handle_storage,false);
}else if(window.attachEvent){.
<未定義
window.attachEvent("onstorage",handle_storage);
}
関数 handle_storage(e){
<未定義
if(!e){e=window.event;}。
showObject(e)とします。
}
関数showObject(obj){。
<未定義
//再帰的にオブジェクトを表示する
if(!obj){return;}。
for(var i in obj){
<未定義
if(typeof(obj[i])! ="object" || obj[i]==null ){。
<未定義
document.write(i + " : " + obj[i] + "<br/>");
}else{
<未定義
document.write(i + " : object" + "<br/>");
}
}
}
storage.setItem("a",5);
関数 changeS(){
<未定義
//キーの値を変更し、ストレージイベントをテストします。
if(!storage.getItem("b")){storage.setItem("b",0);} {storage.getItem("b")}とする。
storage.setItem('b',parseInt(storage.getItem('b'))+1);
}
function showStorage(){
<未定義
//localStorageにあるキーと値のペアをループさせる
for(var i=0;i<storage.length;i++){
<未定義
//key(i) は対応するキーを取得し、getItem() メソッドは対応する値を取得します。
document.write(storage.key(i) + " : " + storage.getItem(storage.key(i)))です。+ "<br>")。
}
}
</script>
</body>
sessionStorageは、上記のlocalStorageと非常によく似ており、ほぼ同じような仕組みになっています。
非常にわかりやすいインターフェイスです。
- sessionStorage.getItem(key)。指定したキーに対応するローカルに保存された値を取得する
- sessionStorage.setItem(key,value): キーフィールドに値を格納する。
- sessionStorage.removeItem(key): 指定されたキーに対してローカルに保存された値を削除します。
- sessionStorage.lengthはsessionStorage内のアイテム数です。
sessionStorageとlocalStorageの類似点・相違点
sessionStorageはlocalStorageと異なり、セッションに固有のデータを保存します。つまり、ブラウザを閉じるまでしか残らず、ブラウザを閉じてページを再び開くと、それまでのストレージはクリアされています。一方、LocalStorageは、セッションに依存しない永続的なストレージです。
sessionStorageとlocalStorageが提供するkey()とlengthによって、以下のコードのように、保存されたデータを簡単に反復処理することができます。
<テーブル1
var
storage = window.localStorage;
2
for
(
var
i=0, len = storage.length; i < len; i++){
3
var
key = storage.key(i);
4
var
value = storage.getItem(key);
5
console.log(key +
"="
+ value);
6
}
<テーブル
2
for
(
var
i=0, len = storage.length; i < len; i++){
<テーブル
3
var
key = storage.key(i);
<テーブル
4
var
value = storage.getItem(key);
<テーブル
5
console.log(key +
"="
+ value);
<テーブル
6
}
sessionStorageとlocalStorageのclear()関数は、localStorage.clear()のように、同じソースのlocalStorageのデータをすべて消去しますが、Session Storageについては、現在のセッションのデータのみを消去するために使用されます。
ページを閉じるとsessionStorageのデータはクリアされますが、一時的に保存する必要のあるデータが少量であれば、新しいページを更新したり開き直ったりしてもデータは残っています。私たちは、sessionStorageを使うことができます。あるいは、ページ間の小さなインタラクションを行う。
sessionStorageとlocalStorageは同じメソッドのストレージイベントを持ち、ストレージイベントハンドラでこのストレージアクションをキャンセルすることができません。storageイベントは、データの変更があったときに、ブラウザからあなたへの通知にすぎません。setItem()、removeItem()、clear()メソッドが呼ばれ、実際にデータが変更されたときに、storageイベントが発生します。ここでいう条件は、データが実際に変更されたことであることに注意してください。つまり、現在の記憶領域が空であれば、イベントを発生させずに再度 clear() を呼び出すことはできません。あるいは、setItem() で既存のものと同じ値を設定しても、イベントも発生しません。イベントが発生するのは、保存領域が変更されたときで、これには便利なプロパティが多数含まれています。
- storageArea : ストレージの種類を示す (セッションまたはローカル)
- キー :変更された項目のキー
- 古い値 キーの元の値
- 新値 キーの新しい値
-
url*
: キーの変更が発生する URL
* 注:以前の仕様では、url 属性は uri 属性でした。一部のブラウザは早くからリリースされており、この変更が含まれていません。互換性の理由から、url属性を使用する前に、その存在を確認し、url属性がない場合はuri属性を使用する必要があります
clear()メソッドを呼び出すと、key, oldValue, newValueはすべてnullに設定されます。
関連
-
元のイベントが実行されなかった後に要素を追加するためのjQueryソリューション
-
vue ディレクティブ v-html と v-text
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】 `string.split is not a function` というエラーの原因は何ですか?
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
JSクリックイベント - Uncaught TypeError: プロパティ 'onclick' に null を設定できません。
-
ノード作成時のJavaScriptエラー: xxx.appendChild は関数ではありません。
-
ajaxの役割
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSクロスドメインソリューション リアクト構成 リバースプロキシ
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
jsを使った簡単な照明スイッチのコード
-
Vue+ElementUIによる大規模なフォームの処理例
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
jQueryのコピーオブジェクトの説明
-
Vueにシンプルなメモ帳機能を実装
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?