Web storageはCookieでは扱えない大容量のデータをブラウザ側に保存するAPI。
- Web storage
- 5MB(仕様上)
- Cookie
- 4KB
蓄積できるデータは、キーと値のセット。
Web storageによって表示コンテンツを事前にブラウザに蓄積しておけば、アクセスの都度、コンテンツ取得のためのサーバーリクエストが必要なくなり、パフォーマンス向上、サーバー負荷の低減が期待できる。
HTML5で導入されたオフライン技術(Application Cache)と組み合わせることでオフライン状況でもWebアプリケーションを利用することができる。
オフラインで作業した状態をWeb Storageに保存しておき、オンライン時にサーバーと同期するといったことができる。
Web Storageで定義されているストレージの種類
- セッションストレージ
- ウィンドウごとのセッションで有効なストレージ
- ローカルストレージ
- ブラウザ内に永続的にデータを保存するストレージ
Storage API
length | ストレージに格納されているキー/値のペア数 |
---|
key() | 指定した番号のキーを返す |
---|---|
getItem() | 指定したキーの値を返す |
setItem() | 指定したキーと値を保存 |
clearDataItem() | 指定したキーの値を削除 |
clear() | すべてのデータを削除 |
ストレージデータへのアクセス権限
アクセス権限はページのオリジンで判断される。
オリジン:
https://hoge.com:8080
スキーム://ドメイン:ポート
storageイベント
ストレージ領域に変更が発生した際に発火。
key | 変更があったキー |
---|---|
oldValue | 変更があった値の古い値 |
newValue | 変更があった値の新しい値 |
url | キーが変更されたドキュメントのアドレス |
storageArea | 変更のあったstorageオブジェクト |
<form method="post" action="https://codes.lists111.com/?p=175"> <textarea id="textarea" cols="50" rows="4"></textarea> <p>最終更新日:<span id="lastModified"></span></p> <p>キー/値のペア数:<span id="storageSet"></span></p> <p>キー[0]:<span id="key"></span></p> <ul id="storages"><li>↓[データ一覧]</li></ul> <input id="submit" type="submit" value="保存"> <input id="clearData" type="button" value="データ削除"> <input id="clearVal" type="text" placeholder="キーを指定して値を削除"> <input id="clearValSubmit" type="submit" value="キーを指定して値を削除"> </form>
;(function() { window.addEventListener('DOMContentLoaded', function() { saveTextarea(); loadLoacalStorageData(); clearStorage(); clearValue(); }, false); var inputData = document.getElementById('textarea'), lastModified = document.getElementById('lastModified'), storageSet = document.getElementById('storageSet'), key = document.getElementById('key'), storages = document.getElementById('storages'), clearData = document.getElementById('clearData'); // テキストエリアの内容をlocalStorageに保存 function saveTextarea() { // 入力内容を保存 var submit = document.getElementById('submit'); submit.addEventListener('click', function() { localStorage.setItem('textarea', inputData.value); // 保存日時を保存 var lastModified = new Date(); localStorage.setItem('lastModified', lastModified); // 保存日時を画面に表示 lastModified.innerHTML = lastModified; }, false); } // ページ読込時に、ローカルストレージに保存されているデータを表示 function loadLoacalStorageData() { inputData.value = localStorage.getItem('textarea'); lastModified.innerHTML = localStorage.getItem('lastModified'); storageSet.innerHTML = localStorage.length; key.innerHTML = localStorage.key(0); // 一覧表示 var liElementNode = ''; var liTextNode = ''; for(var k in localStorage) { liElementNode = document.createElement('li'); liTextNode = document.createTextNode(k + ' : ' + localStorage[k]); liElementNode.appendChild(liTextNode); storages.appendChild(liElementNode); } } // すべてのデータを削除 function clearStorage() { clearData.addEventListener('click', function() { localStorage.clear(); location.reload(); }, false); } // 指定したキーの値を削除 function clearValue(key) { clearValSubmit.addEventListener('click', function() { key = clearVal.value; localStorage.removeItem(key); location.reload(); }, false); } })();