Start · Sprachen · JavaScript · Referenz · IDBDatabase: close

IDBDatabase: close

Ereignis

Wird auf einer <code>IDBDatabase</code> ausgelöst, wenn der Browser die Datenbankverbindung unerwartet schließt, etwa beim Löschen der Speicherdaten.

seit JavaScript Baseline: Chrome 31+, Firefox 50+, Safari 10.1+, E Kategorie: webapi

Signatur

db.addEventListener("close", handler)

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

Typ
void
Beschreibung
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.`);
  });
};
Verbindung zu "notizen" wurde unerwartet geschlossen. (erst, wenn z. B. die Website-Daten gelöscht werden)

Ü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();
Verbindung verloren, verbinde neu ... Neu verbunden.

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.');
};
Verbindung bewusst geschlossen.

// Wichtig · Fallstricke

  • Kein Ereignis bei db.close(): Ein manueller Aufruf von close() löst close nicht aus. Wenn Sie beide Fälle behandeln wollen, braucht Ihr eigener Code dafür eine eigene Logik.
  • Nicht mit versionchange verwechseln: Wenn ein anderer Tab eine neue Version öffnet oder die Datenbank löscht, bekommen Sie versionchange. Dort sollten Sie db.close() selbst aufrufen, sonst wird der andere Tab blockiert (blocked).
  • Transaktionen: Laufende Transaktionen werden abgebrochen (AbortError). Danach wirft jeder Aufruf von db.transaction() einen InvalidStateError, 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“).