Start · Sprachen · JavaScript · Referenz · IDBVersionChangeEvent

IDBVersionChangeEvent

Schnittstelle

Ereignis-Objekt der IndexedDB API, das bei <code>upgradeneeded</code>, <code>versionchange</code> und <code>blocked</code> ausgelöst wird und alte sowie neue Datenbankversion liefert.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

interface IDBVersionChangeEvent extends Event

Beschreibung

IDBVersionChangeEvent ist das Ereignis-Objekt, das die IndexedDB API immer dann nutzt, wenn sich die Version einer Datenbank ändert oder ändern soll. Es wird bei den Ereignissen upgradeneeded (auf dem IDBOpenDBRequest), blocked (auf dem IDBOpenDBRequest) und versionchange (auf einer bereits geöffneten IDBDatabase) ausgelöst. Beim Löschen einer Datenbank über indexedDB.deleteDatabase() erhält auch das success-Ereignis ein IDBVersionChangeEvent.

Die wichtigsten Eigenschaften sind oldVersion (bisherige Version, 0 bei einer neu angelegten Datenbank) und newVersion (Zielversion bzw. null, wenn die Datenbank gelöscht wird). Damit lassen sich inkrementelle Schema-Migrationen umsetzen: Je nach oldVersion werden nur die fehlenden Object Stores und Indizes angelegt.

Nur im upgradeneeded-Handler läuft eine versionchange-Transaktion, in der createObjectStore(), deleteObjectStore() und createIndex() erlaubt sind. Das Ereignis versionchange auf einer offenen Verbindung ist das Signal, diese Verbindung mit db.close() zu schließen, damit ein Upgrade in einem anderen Tab nicht blockiert wird.

Der Konstruktor new IDBVersionChangeEvent(type, options) existiert zwar, wird aber praktisch nur für Tests gebraucht. In normalem Code bekommt man das Objekt vom Browser.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Nur für den Konstruktor: Name des Ereignisses, z. B. "upgradeneeded", "versionchange" oder "blocked".
$options { oldVersion?: number, newVersion?: number | null, bubbles?: boolean, cancelable?: boolean } { oldVersion: 0, newVersion: null } Nur für den Konstruktor: Anfangswerte für oldVersion und newVersion sowie die üblichen Event-Optionen.

Rückgabewert

Typ
IDBVersionChangeEvent
Beschreibung
Ereignis-Objekt mit den schreibgeschützten Eigenschaften oldVersion (number) und newVersion (number | null).

Beispiele

Schema-Migration im upgradeneeded-Handler

const request = indexedDB.open('shop', 3);

request.addEventListener('upgradeneeded', (event) => {
  const db = request.result;
  console.log(`Upgrade von v${event.oldVersion} auf v${event.newVersion}`);

  // Migrationen schrittweise nachholen (bewusst ohne break)
  switch (event.oldVersion) {
    case 0:
      db.createObjectStore('products', { keyPath: 'id' });
    case 1: {
      const store = request.transaction.objectStore('products');
      store.createIndex('by_name', 'name');
    }
    case 2:
      db.createObjectStore('orders', { autoIncrement: true });
  }
});

request.addEventListener('success', () => {
  console.log('Datenbank bereit:', request.result.version);
});
Upgrade von v0 auf v3 Datenbank bereit: 3

Offene Verbindung bei versionchange schließen

const openDb = () => new Promise((resolve, reject) => {
  const req = indexedDB.open('shop', 3);
  req.onsuccess = () => {
    const db = req.result;
    // Ein anderer Tab möchte upgraden oder löschen
    db.onversionchange = (event) => {
      console.log(`Anderer Tab will v${event.newVersion} – Verbindung wird geschlossen`);
      db.close();
    };
    resolve(db);
  };
  req.onerror = () => reject(req.error);
});

const db = await openDb();
Anderer Tab will v4 – Verbindung wird geschlossen

Blockiertes Upgrade erkennen

const req = indexedDB.open('shop', 4);

req.onblocked = (event) => {
  console.warn(
    `Upgrade v${event.oldVersion} → v${event.newVersion} blockiert. Bitte andere Tabs schließen.`
  );
};

req.onupgradeneeded = (event) => {
  console.log('Upgrade läuft, alte Version:', event.oldVersion);
};
Upgrade v3 → v4 blockiert. Bitte andere Tabs schließen.

Ereignis für Tests selbst erzeugen

const evt = new IDBVersionChangeEvent('versionchange', {
  oldVersion: 2,
  newVersion: 3
});

console.log(evt instanceof Event, evt.type, evt.oldVersion, evt.newVersion);
true versionchange 2 3

// Wichtig · Fallstricke

  • Kein break im Migrations-switch: Das bewusste Durchfallen sorgt dafür, dass Nutzer mit sehr alter Version alle Zwischenschritte durchlaufen.
  • newVersion ist null, wenn die Datenbank über deleteDatabase() gelöscht wird. Wer im versionchange-Handler damit rechnet, muss diesen Fall abfangen.
  • Blockierung: Schließen offene Verbindungen in anderen Tabs nicht per db.close(), bleibt das Upgrade hängen (blocked). Deshalb immer einen onversionchange-Handler registrieren.
  • Schemaänderungen (createObjectStore, createIndex) sind nur während der Versionswechsel-Transaktion im upgradeneeded-Handler erlaubt, sonst wird eine InvalidStateError-DOMException geworfen.
  • Die Version muss eine positive ganze Zahl sein. Eine niedrigere Version als die bestehende führt zu einem VersionError.
  • Die frühere, nicht standardisierte Eigenschaft dataLoss sowie die veraltete Methode IDBDatabase.setVersion() sollten nicht mehr verwendet werden.
  • Kompatibilität: in allen modernen Browsern verfügbar, auch in Web Workern. In privaten Fenstern mancher Browser ist IndexedDB eingeschränkt oder nur flüchtig.