Start · Sprachen · JavaScript · Referenz · ContentIndexEvent.id

ContentIndexEvent.id

Eigenschaft

Schreibgeschützter <code>string</code>, der den Eintrag im Content Index angibt, den der Nutzer über die Browser-Oberfläche gelöscht hat.

seit JavaScript Experimentell: nur Chromium-Browser (Chrome/Edge 8 Kategorie: webapi

Signatur

ContentIndexEvent.id

Beschreibung

Die Eigenschaft id gibt es nur bei einem ContentIndexEvent. Dieses Ereignis wird als contentdelete-Event im Service Worker ausgelöst, wenn der Nutzer einen Eintrag selbst entfernt, den die Web-App vorher mit registration.index.add() im Content Index registriert hat. Das passiert zum Beispiel über die Liste „Offline verfügbare Inhalte“ im Browser.

Der Wert ist genau die id, die beim Aufruf von ContentIndex.add() im Beschreibungsobjekt angegeben wurde. So kann der Service Worker die passenden Ressourcen wiederfinden und aufräumen, etwa Einträge im Cache Storage oder in IndexedDB. Der Offline-Inhalt verschwindet dann nicht nur aus dem Index, sondern wirklich aus dem Speicher.

Die Eigenschaft ist schreibgeschützt. Wenn man ein ContentIndexEvent selbst erzeugt (zum Beispiel für Tests), wird sie über das Initialisierungsobjekt des Konstruktors gesetzt.

Rückgabewert

Typ
string
Beschreibung
Die id des gelöschten Content-Index-Eintrags. Es ist derselbe Wert, der bei ContentIndex.add() übergeben wurde.

Beispiele

Gelöschten Eintrag im Service Worker aus dem Cache entfernen

// sw.js
self.addEventListener('contentdelete', (event) => {
  console.log('Vom Nutzer gelöscht:', event.id);
  // Konvention: Die Cache-URL wird aus der id abgeleitet
  event.waitUntil(
    caches.open('offline-artikel').then((cache) =>
      cache.delete(`/artikel/${event.id}`)
    )
  );
});
Vom Nutzer gelöscht: artikel-42

Eintrag registrieren – die id kommt später im Event zurück

// Im Seiten-Skript: Artikel offline speichern und im Index registrieren
const speichereOffline = async (artikel) => {
  const registration = await navigator.serviceWorker.ready;
  if (!('index' in registration)) {
    console.warn('Content Index API nicht unterstützt');
    return;
  }
  const cache = await caches.open('offline-artikel');
  await cache.add(`/artikel/${artikel.id}`);
  await registration.index.add({
    id: artikel.id, // taucht später als event.id auf
    title: artikel.titel,
    description: artikel.teaser,
    category: 'article',
    icons: [{ src: '/icons/artikel-192.png', sizes: '192x192', type: 'image/png' }],
    url: `/artikel/${artikel.id}`
  });
};

speichereOffline({ id: 'artikel-42', titel: 'Service Worker verstehen', teaser: 'Grundlagen und Praxis' });

Aufräumen in IndexedDB anhand der id

// sw.js
const loescheMetadaten = (id) => new Promise((resolve, reject) => {
  const req = indexedDB.open('offline-db', 1);
  req.onsuccess = () => {
    const tx = req.result.transaction('artikel', 'readwrite');
    tx.objectStore('artikel').delete(id);
    tx.oncomplete = () => resolve();
    tx.onerror = () => reject(tx.error);
  };
  req.onerror = () => reject(req.error);
});

self.addEventListener('contentdelete', (event) => {
  event.waitUntil(loescheMetadaten(event.id));
});

Event für Tests selbst erzeugen

// Im Service-Worker-Kontext
const testEvent = new ContentIndexEvent('contentdelete', { id: 'artikel-7' });
console.log(testEvent.id);
testEvent.id = 'anders'; // wird ignoriert, weil schreibgeschützt
console.log(testEvent.id);
artikel-7 artikel-7

// Wichtig · Fallstricke

  • Experimentell und eingeschränkt verfügbar: Die Content Index API gibt es nur in Chromium-Browsern, und das in der Praxis vor allem unter Android. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit 'index' in registration, ob sie vorhanden ist.
  • Nur im Service Worker: ContentIndexEvent und das contentdelete-Event gibt es ausschließlich im ServiceWorkerGlobalScope. Außerdem ist ein sicherer Kontext (HTTPS) nötig.
  • Nur bei Löschung durch den Nutzer: Das Event wird nicht ausgelöst, wenn die App selbst registration.index.delete(id) aufruft. In diesem Fall muss die App selbst aufräumen.
  • Für asynchrone Aufräumarbeiten immer event.waitUntil() verwenden. Sonst kann der Browser den Service Worker beenden, bevor die Arbeit erledigt ist.
  • Die id ist ein frei wählbarer String. Wähle eine eindeutige, stabile Konvention, aus der sich Cache-Schlüssel oder Datenbank-Schlüssel eindeutig ableiten lassen.