Web Storage

Web Storageのイベント

Web Storageにはデータに変更があった場合に変更を検知できるStorageイベントがある。このイベントを利用すれば、複数ページでWeb Storageを利用している際に誤ってデータを上書きしたり、表示が古いままだたったりすることを防ぐことができる。

複数ページのビューの同期サンプル

データの登録ページで更新したデータの内容を、別のページでリアルタイムに表示に反映する。

①データの登録ページ

  <form action="#" method="post" id="register">
    <label for="name">名前: </label>
    <input type="text" name="name" value="" id="name">
    <input type="submit" value="登録">
  </form>

  <script type="text/javascript">
    var form = document.querySelector('form');

    // フォームの送信イベント
    document.querySelector('form').addEventListener('submit', function(e){

      // デフォルトの動作をキャンセル
      e.preventDefault();

      // データを”name”をキーにして登録する
      localStorage.setItem('name', form['name'].value);

      // コンソールログ出力
      console.log('name', form['name'].value);
    }, false);
  </script>

②データ表示ページ

  <h1 id="view"></h1>
  <script type="text/javascript">
    // 表示用のh1要素を取得する
    var h1 = document.querySelector('#view');

    // 登録されている"name"を取得して表示する
    h1.textContent = localStorage.getItem('name');

    // Storageイベントで変更を検知
    window.addEventListener("storage", function(e) {

      // 新しい"name"で表示を更新する
      if ( e.key === 'name' ) {
        h1.textContent = e.newValue;
      }
    }, false);

  </script>

jQueryを使ってイベントを取得することもできる。上記の「②データ表示ページ」はjQueryを使うと次のようになる。

<h1 id="view"></h1>
<script type="text/javascript">
$(function(){
  // 表示用のh1要素を取得する
  var h1 = $('#view');
  // 登録されている"name"を取得して表示する
  var msg = localStorage.getItem('name');
  if(msg){
    h1.text(msg);
  }
  // Storageイベントで変更を検知
  $(window).bind("storage", function(e) {
	  // 新しい"name"で表示を更新する
	  if(e.originalEvent.key === 'name'){
	  	h1.text(e.originalEvent.newValue);
	  }
  });
});
</script>

Storageイベントのイベントオブジェクト

メソッド 説明
key 更新されたキー
oldValue 更新前のデータ
newValue 更新後のデータ
url 更新されたページのURL
storageArea 更新されたストレージの種類(localStorageもしくはsessionStorage)