2010年6月8日火曜日

HTML5 のWeb Storageを使ってみた

今回は、ローカルストレージと、セッションストレージを使ってみました!

■ローカルストレージ
下記のような 簡単なサンプルを作りました。
storeにて値の登録を行います。そうすると、store dateに登録されている一覧が表示されます。
さらに追加で登録を行うと、下記のようになります。


ローカルストレージのサンプル


・ソース
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <script type="text/javascript">  
  5. window.addEventListener('storage', function(event) {  
  6.  //storageというイベントに対して、この関数の処理を追加します。  
  7.  refreshKeyList();  
  8. }, false);  
  9. var store = function(key, value) {  
  10.  //ローカルストレージに指定した、KeyとValueの組み合わせを登録します  
  11.  localStorage.setItem(key, value);  
  12. };  
  13. var del = function(key) {  
  14.  //ローカルストレージから指定したKeyのものを削除します  
  15.  localStorage.removeItem(key);  
  16.  //delete localStorage[key]; //こういう記述方法もできます  
  17. };  
  18. var allDel = function() {  
  19.  localStorage.clear();  
  20. };  
  21. var refreshKeyList = function() {  
  22.  var keyList = document.getElementById('keyList');  
  23.  if(localStorage.length === 0) {  
  24.   //ローカルストレージに格納されているデータのサイズを取得  
  25.   keyList.innerHTML = '値が格納されていません';  
  26.   return;  
  27.  }  
  28.  var list = '';  
  29.  var table = tableCreater.table();  
  30.  var tdKey = tableCreater.td('KEY');  
  31.  var tdVal = tableCreater.td('VALUE');  
  32.  var trTitle = tableCreater.tr();  
  33.  trTitle.appendChild(tableCreater.td());  
  34.  trTitle.appendChild(tdKey);  
  35.  trTitle.appendChild(tdVal);  
  36.  trTitle.appendChild(tableCreater.td());  
  37.  table.appendChild(trTitle);  
  38.    
  39.  for(var i = 0; i < localStorage.length; i++) {  
  40.   //ローカルストレージから指定番号のKey値を取得  
  41.   var key = localStorage.key(i);  
  42.   //ローカルストレージから指定したKey値にひもづけられている値を取得  
  43.   var value = localStorage.getItem(key);  
  44.   
  45.   var td0 = tableCreater.td(i + 1);  
  46.   var td1 = tableCreater.td(key);  
  47.   var td2 = tableCreater.td(value);  
  48.   
  49.   var td3 = tableCreater.td('<input type="submit" value="del" onclick="del(\'' + key  + '\');return false;"/>');  
  50.   
  51.   var tr = tableCreater.tr();  
  52.   tr.appendChild(td0);  
  53.   tr.appendChild(td1);  
  54.   tr.appendChild(td2);  
  55.   tr.appendChild(td3);  
  56.   
  57.   table.appendChild(tr);  
  58.  }  
  59.  keyList.innerHTML = '';  
  60.  keyList.appendChild(table);  
  61. };  
  62. var tableCreater = function() {  
  63.  return {  
  64.   table: function() {  
  65.    return document.createElement('table');  
  66.    },  
  67.   tr: function() {  
  68.    return document.createElement('tr');  
  69.    },  
  70.   td: function(val) {  
  71.    var td =  document.createElement('td');  
  72.    if(val) {  
  73.     td.innerHTML = val;  
  74.    }  
  75.    return td;  
  76.    },  
  77.  };  
  78. }();  
  79. </script>  
  80. </head>  
  81. <body onload="refreshKeyList();">  
  82. <div style="border:solid 1px;padding:8px;">  
  83. <strong>store:</strong>  
  84.   
  85. <table>  
  86. <tr><td>key</td><td>value</td></tr>  
  87. <tr><td><input type="text" id="key"/>:</td><td><input type="text" id="value"/><input type="submit" value="store" onclick="store(document.getElementById('key').value, document.getElementById('value').value); return false;"/></td></tr>  
  88. </table>  
  89.   
  90. </div>  
  91.   
  92.   
  93. <div style="border:solid 1px;padding:8px;">  
  94. <strong>store data:</strong>  
  95.   
  96. <div id="keyList"></div>  
  97. <input type="submit" value="all del" onclick="allDel();return false;" />  
  98. </div>  
  99. </body>  
  100. </html>  
JavaのHashMapに値を格納するような感覚で使えます!
前回記述した通り、格納した値は消してあげないと消えません。
同一オリジン、同一ブラウザでなら、消されるまで値が保持されます。


■セッションストレージ
セッションストレージのサンプル
キャプチャ的には同じなので貼りません^_^;
基本的には、ローカルストレージのlocalstorageをsessionstorageに置換してあげれば使えます!
API的にも同じものが用意されています!

ただし!
前回説明した通り、別ウィンドウを開くと値はコピーされますが、
その瞬間だけ値が同じなだけでどちらかで更新してももう一方には反映されません!
上記のサンプルにて、試せるようにしてあるので実際に試してみてください。

こちらは、ウィンドウを閉じれば保持していた値は消えるので、特に気になるところはないな。
使い道は、、、別ウィンドウを開くときにパラメータとして渡したいってときぐらいしか使わないか?
渡せるけど、その画面から情報は受け取れないけどねw

■いちおうAPIを書いておきます
・メソッドについて

メソッド解説
lengthストレージ内に格納されているデータ数
key(index)指定されたインデックスのKeyを返す。存在しない場合はnullが返る
getItem(key)指定されたKeyに対応する値を返す
setItem(key, data)ストレージに指定したKey値で値を登録する
removeItem(key)ストレージから指定されたKey値に対応するデータを削除する
clear()すべてのデータをストレージから削除する

・storageイベントのプロパティについて

プロパティ解説
key変更されたKey。clear()メソッドが呼ばれた際にnull
oldValue変更前の値(のコピー)。新しいキーで値が登録された場合はnull。
newValue変更後の値(のコピー)。値が削除された場合にはnull。
urlイベント発生元のドキュメントURL。
storageArea変更されたストレージへの参照。
使い方
  1. window.addEventListener('storage'function(event) {  
  2.  // storageに何かイベントが発生したときに呼ばれる処理を記述する。  
  3. }, false);  
なぜか、イベントで処理をするとブラウザがクラッシュすることがありますので、気をつけてください。
使い方が悪いのか?それともブラウザがまだちゃんと対応されていないのか?

0 件のコメント:

コメントを投稿