Start · Sprachen · JavaScript · Referenz · ContentIndex.delete()

ContentIndex.delete()

Methode

Entfernt einen Eintrag anhand seiner <code>id</code> aus dem Content Index des Service Workers und liefert ein <code>Promise&lt;undefined&gt;</code>.

seit JavaScript Experimentell: Chrome/Edge 84+ (Android), kein Fir Kategorie: webapi

Signatur

ContentIndex.prototype.delete(id)

Beschreibung

Die Methode delete() der ContentIndex-Schnittstelle entfernt einen zuvor mit add() registrierten Eintrag aus dem Inhaltsindex. Über den Content Index teilt eine Progressive Web App dem Browser mit, welche Inhalte offline verfügbar sind. Der Browser kann diese Inhalte dann gesammelt anzeigen, etwa auf der Seite „Downloads“ oder in Vorschlägen unter Chrome für Android.

Man ruft delete() auf, sobald ein Inhalt nicht mehr offline verfügbar ist, zum Beispiel wenn ein Artikel aus dem Cache gelöscht wurde, abgelaufen ist oder der Nutzer ihn in der App entfernt hat. Nur so bleibt der Index mit dem tatsächlichen Cache übereinstimmend. Sonst zeigt der Browser Einträge an, die offline gar nicht mehr geladen werden können.

Man erreicht die Schnittstelle über ServiceWorkerRegistration.index, also sowohl aus dem Seitenkontext (navigator.serviceWorker.ready) als auch im Service Worker selbst (self.registration.index). Die Methode gibt ein Promise zurück, das ohne Wert erfüllt wird. Das gilt auch dann, wenn es zur angegebenen id gar keinen Eintrag gab.

Parameter

Name Typ Default Beschreibung
$id Pflicht string Die eindeutige Kennung des zu entfernenden Eintrags. Sie entspricht der id, die beim Aufruf von ContentIndex.add() angegeben wurde.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, sobald der Eintrag entfernt wurde. Ein Fehler tritt z. B. auf, wenn kein aktiver Service Worker registriert ist.

Beispiele

Eintrag aus dem Seitenkontext entfernen

const removeFromIndex = async (articleId) => {
  if (!('serviceWorker' in navigator)) return;
  const registration = await navigator.serviceWorker.ready;

  // Feature-Erkennung: Content Index API vorhanden?
  if (!('index' in registration)) {
    console.warn('Content Index API wird nicht unterstützt');
    return;
  }

  await registration.index.delete(articleId);
  console.log(`Eintrag ${articleId} entfernt`);
};

removeFromIndex('artikel-42');
Eintrag artikel-42 entfernt

Cache und Index gemeinsam aufräumen

const deleteOfflineArticle = async (id, url) => {
  const registration = await navigator.serviceWorker.ready;
  const cache = await caches.open('offline-artikel');

  // Erst Cache leeren, dann den Index-Eintrag entfernen
  await cache.delete(url);
  await registration.index?.delete(id);

  const remaining = await registration.index?.getAll() ?? [];
  console.log('Verbleibende Einträge:', remaining.map((e) => e.id));
};

deleteOfflineArticle('artikel-42', '/artikel/42');
Verbleibende Einträge: ["artikel-7", "artikel-13"]

Auf das Löschen durch den Nutzer im Service Worker reagieren

// sw.js – der Nutzer hat den Eintrag in der Browser-Oberfläche entfernt
self.addEventListener('contentdelete', (event) => {
  event.waitUntil((async () => {
    const cache = await caches.open('offline-artikel');
    await cache.delete(`/artikel/${event.id.replace('artikel-', '')}`);
    console.log(`Cache für ${event.id} bereinigt`);
  })());
});

// Abgelaufene Inhalte selbst aus dem Index entfernen
const pruneExpired = async (maxAgeMs) => {
  const entries = await self.registration.index.getAll();
  const now = Date.now();
  for (const entry of entries) {
    const savedAt = Number(entry.id.split('@')[1] ?? now);
    if (now - savedAt > maxAgeMs) {
      await self.registration.index.delete(entry.id);
    }
  }
};

// Wichtig · Fallstricke

  • Experimentell und eingeschränkt verfügbar: Die API wird nur in Chromium-Browsern unterstützt (vor allem Chrome für Android ab Version 84). Firefox und Safari unterstützen sie nicht. Prüfe deshalb immer vorher mit 'index' in registration, ob sie vorhanden ist.
  • Die API braucht einen sicheren Kontext (HTTPS) und einen aktiven Service Worker.
  • delete() entfernt nur den Eintrag aus dem Index, nicht die zwischengespeicherten Daten. Cache-Einträge (Cache API, IndexedDB) musst du selbst löschen.
  • Wenn du delete() selbst aufrufst, wird das Ereignis contentdelete nicht ausgelöst. Es feuert nur, wenn der Nutzer den Eintrag in der Browser-Oberfläche entfernt.
  • Bei einer unbekannten id wird kein Fehler geworfen. Das Promise wird trotzdem erfüllt.