Signatur
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
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');
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');
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 Ereigniscontentdeletenicht ausgelöst. Es feuert nur, wenn der Nutzer den Eintrag in der Browser-Oberfläche entfernt. - Bei einer unbekannten
idwird kein Fehler geworfen. Das Promise wird trotzdem erfüllt.