--- title: ExtendableEvent slug: Web/API/ExtendableEvent tags: - API - ExtendableEvent - Interface - Offline - Reference - Service Workers - ServiceWorker - Workers translation_of: Web/API/ExtendableEvent ---
ExtendableEvent
インターフェイスは、サービスワーカーのライフサイクルの一部として、グローバルスコープでディスパッチされた install
イベントと activate
イベントの存続期間を延長します。 これにより、データベーススキーマがアップグレードされて古いキャッシュエントリが削除されるまで、機能イベント({{domxref("FetchEvent")}} など)が送出されなくなります。
{{domxref("ExtendableEvent.waitUntil","waitUntil()")}} が ExtendableEvent
ハンドラーの外で呼び出された場合、ブラウザーは InvalidStateError
をスローする必要があります。 また、複数の呼び出しが積み重なり、その結果の Promise が存続期間延長 Promise(extend lifetime promises)のリストに追加されることにも注意してください。
注: 上記の段落で説明した振る舞いは、Firefox 43 で修正されました({{bug(1180274)}} を参照)。
このインターフェイスは、{{domxref("Event")}} インターフェイスを継承しています。
{{InheritanceDiagram(700, 60, 20)}}
注: このインターフェイスは、グローバルスコープが {{domxref("ServiceWorkerGlobalScope")}} の場合にのみ使用できます。 {{domxref("Window")}} または別の種類のワーカーのスコープの場合は使用できません。
ExtendableEvent
オブジェクトを作成します。特定のプロパティを実装していませんが、親である {{domxref("Event")}} からプロパティを継承しています。
親である {{domxref("Event")}} からメソッドを継承しています。
イベントの存続期間を延長します。 これは、インストール中({{domxref("ServiceWorkerRegistration.installing", "installing")}})のワーカーの install
{{event("Event_handlers", "event handler")}} と、アクティブ({{domxref("ServiceWorkerRegistration.active", "active")}})ワーカーの activate
{{event("Event_handlers", "event handler")}} で呼び出されることを目的としています。
このコードスニペットは、サービスワーカーのプリフェッチの例からのものです(プリフェッチの例をライブで見る)。 コードは {{domxref("ServiceWorkerGlobalScope.oninstall")}} で {{domxref("ExtendableEvent.waitUntil()")}} を呼び出し、インストール中({{domxref("ServiceWorkerRegistration.installing")}})のワーカーがインストール済み(installed)として扱われるのを、渡された Promise が正常に解決されるまで遅らせます。 Promise は、すべてのリソースがフェッチされてキャッシュされたとき、または例外が発生したときに解決します。
コードスニペットは、サービスワーカーが使用するキャッシュのバージョン管理のベストプラクティスも示しています。 この例ではキャッシュは1つしかありませんが、同じアプローチを複数のキャッシュに使用できます。 キャッシュの一括指定識別子を特定のバージョン管理されたキャッシュ名にマップします。
注: Chrome では、ログ文は、chrome://serviceworker-internals を介してアクセスされる関連サービスワーカーの "Inspect" インターフェイスを介して表示されます。
var CACHE_VERSION = 1; var CURRENT_CACHES = { prefetch: 'prefetch-cache-v' + CACHE_VERSION }; self.addEventListener('install', function(event) { var urlsToPrefetch = [ './static/pre_fetched.txt', './static/pre_fetched.html', 'https://www.chromium.org/_/rsrc/1302286216006/config/customLogo.gif' ]; console.log('install イベントの処理。 プリフェッチするリソース:', urlsToPrefetch); event.waitUntil( caches.open(CURRENT_CACHES['prefetch']).then(function(cache) { return cache.addAll(urlsToPrefetch.map(function(urlToPrefetch) { return new Request(urlToPrefetch, {mode: 'no-cors'}); })).then(function() { console.log('すべてのリソースをフェッチし、キャッシュしました。'); }); }).catch(function(error) { console.error('プリフェッチに失敗:', error); }) ); });
{mode: 'no-cors'}
を使用することが非常に重要です。 この例では、www.chromium.org は CORS をサポートしていません。仕様 | 状態 | コメント |
---|---|---|
{{SpecName('Service Workers', '#extendableevent', 'ExtendableEvent')}} | {{Spec2('Service Workers')}} | 初期定義 |
{{Compat("api.ExtendableEvent")}}