サンプルのソースコードを以下に示す。
HTMLファイルでは、HTML要素のmanifest属性にマニフェストファイルのURLを指定している以外は、特に注目すべき点はない。
hello.html
<!DOCTYPE HTML>
<html manifest="hello.manifest">
<head>
<meta charset="UTF-8">
<title>おはよう</title>
<script src="hello.js"></script>
</head>
<body onload="init()">
<p>おはよう</p>
</body>
</html>
上のHTMLファイルから読み込まれているJavaScriptファイルは以下の通りだ。ドキュメントのonloadイベントで呼び出される、init()というメソッドが1つ定義されているのみだ。
hello.js
function init() {
setInterval(function() {
// (1) キャッシュのアップデートを明示的に行う
applicationCache.update();
}, 5000);
// (2) キャッシュの更新イベントを監視する
applicationCache.addEventListener("updateready", function() {
if (confirm("アップデートを利用できます。リロードしますか?")) {
// (3) キャッシュを最新のものに入れ替える
applicationCache.swapCache();
// リロード
location.reload();
}
}, true);
}
上のソースコードにおけるポイントを以下に示す。
(1) アプリケーションキャッシュは、「window.applicationCache」というオブジェクトを介してJavaScriptコードから操作することができる。ここで使用しているupdate()メソッドは、「キャッシュマニフェストの更新チェック→更新されていれば、リソースをダウンロードし、イベント通知」という、キャッシュ更新のフローを強制的に実行するためのものだ。
(2) アプリケーションキャッシュからは様々なイベントが通知される。ここで監視している「updateready」というイベントは、キャッシュの更新が完了して新しいバージョンが利用できるようになったことを通知するイベントだ。アプリケーションキャッシュから発生するイベントには以下のようなものがある。
- checking … マニフェストファイルのダウンロードとチェックを行っている
- noupdate … マニフェストが変更されていない
- downloading … マニフェストに記述されたリソースのダウンロード中
- progress … 更新プロセスが進行中
- updateready … キャッシュの更新に完了した。swapCache()を呼び出してキャッシュを最新のバージョンと取り替える事が可能。
- cached … 初回のキャッシュに成功した。
- obsolete … マニフェストのダウンロードに失敗し、キャッシュを無効化した
- error … エラーが発生
(3) キャッシュが更新されたら、swapCache()を呼び出すことで最新のキャッシュに切り替えることができる。