Signatur
Beschreibung
Das close-Ereignis tritt auf einer IDBDatabase-Instanz ein, wenn die Verbindung unerwartet geschlossen wird. Typische Auslöser: Der Nutzer löscht die Website-Daten in den Browser-Einstellungen, der Speicher wird wegen Speicherdruck bereinigt oder es tritt ein Fehler auf der Festplatte bzw. in der Speicher-Engine auf.
Das Ereignis wird nicht ausgelöst, wenn Sie die Verbindung selbst mit db.close() schließen. Es ist also ein Signal für Situationen, auf die Ihr Code nicht vorbereitet war. Offene Transaktionen werden dabei mit einem AbortError abgebrochen.
Der Handler lässt sich mit db.addEventListener("close", handler) oder über die Eigenschaft db.onclose registrieren. Das Ereignis ist ein einfaches Event: Es steigt nicht auf (kein Bubbling) und lässt sich nicht abbrechen.
In der Praxis nutzen Sie das Ereignis, um die Datenbank-Referenz Ihrer Anwendung ungültig zu machen, dem Nutzer einen Hinweis anzuzeigen oder die Verbindung per indexedDB.open() neu aufzubauen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname, hier immer "close". |
|
| $handler Pflicht | (event: Event) => void | Callback, das beim unerwarteten Schließen aufgerufen wird. event.target ist die betroffene IDBDatabase. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Listener-Optionen wie once oder signal. |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein einfaches Event-Objekt.Beispiele
close-Listener mit addEventListener registrieren
const request = indexedDB.open('notizen', 1);
request.onupgradeneeded = () => {
request.result.createObjectStore('eintraege', { keyPath: 'id' });
};
request.onsuccess = () => {
const db = request.result;
db.addEventListener('close', (event) => {
console.warn(`Verbindung zu "${event.target.name}" wurde unerwartet geschlossen.`);
});
};
Über die onclose-Eigenschaft und automatisch neu verbinden
let db = null;
const openDb = () => new Promise((resolve, reject) => {
const req = indexedDB.open('shop', 1);
req.onupgradeneeded = () => req.result.createObjectStore('warenkorb', { keyPath: 'sku' });
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const connect = async () => {
db = await openDb();
db.onclose = async () => {
console.log('Verbindung verloren, verbinde neu ...');
db = null;
try {
await connect();
console.log('Neu verbunden.');
} catch (err) {
console.error('Neuverbindung fehlgeschlagen:', err);
}
};
};
await connect();
Listener wieder entfernen und close() abgrenzen
const req = indexedDB.open('cache', 1);
req.onsuccess = () => {
const db = req.result;
const onUnexpectedClose = () => console.log('Unerwartet geschlossen!');
db.addEventListener('close', onUnexpectedClose);
// Später: Listener entfernen und bewusst schließen
db.removeEventListener('close', onUnexpectedClose);
db.close(); // löst KEIN close-Ereignis aus
console.log('Verbindung bewusst geschlossen.');
};
// Wichtig · Fallstricke
- Kein Ereignis bei
db.close(): Ein manueller Aufruf vonclose()löstclosenicht aus. Wenn Sie beide Fälle behandeln wollen, braucht Ihr eigener Code dafür eine eigene Logik. - Nicht mit
versionchangeverwechseln: Wenn ein anderer Tab eine neue Version öffnet oder die Datenbank löscht, bekommen Sieversionchange. Dort sollten Siedb.close()selbst aufrufen, sonst wird der andere Tab blockiert (blocked). - Transaktionen: Laufende Transaktionen werden abgebrochen (
AbortError). Danach wirft jeder Aufruf vondb.transaction()einenInvalidStateError, verwerfen Sie also die alte Referenz. - Endlosschleifen vermeiden: Wenn Sie automatisch neu verbinden, begrenzen Sie die Versuche oder bauen Sie eine Wartezeit ein. Der Speicher kann dauerhaft unbrauchbar sein, etwa bei vollem Datenträger oder im privaten Modus mancher Browser.
- Kompatibilität: Wird in allen modernen Browsern unterstützt (Firefox erst ab Version 50). Das Ereignis ist schwer zu testen: Am einfachsten löschen Sie die Website-Daten über die Entwicklerwerkzeuge (Application/Storage → „Clear site data“).