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) |