【JavaScript】Web Storage の使い方
ユーザーのローカルにデータが保存できるWeb Storageを使ってみます。
Web Storageは、ユーザーのローカル環境(ブラウザ)にデータを保存するための仕組みです。 データの保存・上書き・削除・全クリアなどの操作は、JavaScriptで行うことができます。 Web Storageを利用すると、ユーザーごとにカスタマイズされた情報を提供することが可能となります。 この仕組みはクッキー(HTTP cookie)とよく似ていますが、クッキーに比べて保存できる容量が大きいため、 例えば、オフラインでもウェブアプリケーションを動作させられるだけの必要十分なデータをユーザーのローカル環境に保存することなどが可能となります。
Web Storageは二種類
Web StorageはlocalStorageとsessionStorageの二種類があります。
| データの有効期限 | 別ウィンドウ/タブ間の共有 | |
|---|---|---|
| localStorage | 無し(永続的) | 可 | 
| sessionStorage | ブラウザを閉じるまで | 不可 | 
Web Storageを使用する上での注意点
- 保存容量が1オリジン当たり5MBまで。
- 全て文字列として保存されるため、数値を利用する場合は取得時に変換が必要。
- スマホなどプライベートモードでは利用できない。
Web Storageの基本的な使い方
利用可否、保存、取得、削除などの基本的な使い方を簡単にまとめます。
Web Storageが利用可能か調べる
ユーザーがCookieの受け入れを拒否していたり、スマホでプライベートモードを有効にしている場合、Web Storageが利用できません。ですので、最初にユーザーのWeb Storage利用可否をチェックします。
if (localStorage) {
    // 処理
}
または
try {
    localStorage.setItem('_test', 0);
    localStorage.removeItem('_test');
    // 処理       
} catch(e) {
    alert(e);
}Storageを変数へ
localStorageで運用していたものをsessionStorageへ変更した場合などに発生する、書き直し手間や修正ミスを防ぐため、最初に変数へ退避させます。
var st = localStorage; // もしくは sessionStorage
st.test = 'test';以下、上記の設定をした上でのコードとなります。
保存
st.setItem('test', 'test');
st.test = 'test';
st['test'] = 'test';取得
// 個別取得
st.getItem('test'); // 存在しなければ null
st.test;            // 存在しなければ undefined
st['test'];         // 存在しなければ undefined
// 全て取得
for (var key in st) {
    st[key];
}
for (var i = 0, len = st.length; i < len; i++) {
    var k = st.key(i);
    st.getItem(k);
}削除
// 個別削除
st.removeItem('test');
delete st.test;
// 全て削除(同オリジンのストレージ全てが削除されるので注意)
st.clear();オブジェクトの扱い
現在、ストレージへの保存は文字列のみであり、配列やオブジェクトの保存ができません。保存するためにはJSON文字列へと変換する必要があります。
var obj = {name: '山田', age: '30'};
// 保存
st.setItem('test', JSON.stringify(obj));
// 取得
var test = JSON.parse(st.getItem('test'));localStorageで有効期限を設定する
応用編としてlocalStorageに有効期限を設定し、Cookie的な使い方をしてみます。Cookieと比較して保存容量が多くHTTP通信が発生しない利点があります。
以下、24時間有効なオブジェクトをlocalStorageへ保存するためのコードです。
var obj = {
    name: '山田',
    age: 30
};
try {
    localStorage.setItem('_test', 0);
    localStorage.removeItem('_test');
    setStorage('test', obj, 60 * 60 * 24);
    var test = getStorage('test');
    if (test !== undefined) {
        for (var key in test) {
            alert(key + ':' + test[key]); // name:山田 age:30
        }
    }
} catch(e) {
    alert(e);
}
function setStorage(key, value, expire)
{
    expire = expire === undefined ? false: (new Date).getTime() + expire * 1000;
    var data = {
        expire: expire,
        value:  value
    };
    localStorage.setItem(key, JSON.stringify(data));
}
function getStorage(key)
{
    var st = localStorage[key];
    if (st === undefined) {
        return undefined;
    }
    st = JSON.parse(st);
    if (st.expire === false || st.expire > (new Date).getTime()) {
        return st.value;
    } else {
        localStorage.removeItem(key);
        return undefined;
    }
}