Start · Sprachen · JavaScript · Referenz · new IDBVersionChangeEvent()

new IDBVersionChangeEvent()

Methode

Erzeugt ein neues <code>IDBVersionChangeEvent</code>, das eine Versionsänderung einer IndexedDB-Datenbank beschreibt, etwa für <code>upgradeneeded</code> oder <code>versionchange</code>.

seit JavaScript Baseline: alle modernen Browser (Konstruktor seit Kategorie: webapi

Signatur

new IDBVersionChangeEvent(type, options)

Beschreibung

Der Konstruktor IDBVersionChangeEvent() erzeugt ein Event-Objekt, das eine Versionsänderung einer IndexedDB-Datenbank beschreibt. Normalerweise erzeugt der Browser solche Events selbst: bei upgradeneeded (eine Datenbank wird mit höherer Version geöffnet), bei versionchange (eine andere Verbindung will die Version ändern oder die Datenbank löschen), bei blocked und beim success von indexedDB.deleteDatabase().

Selbst aufrufen muss man den Konstruktor vor allem in Unit-Tests, Mocks und Polyfills (z. B. fake-indexeddb). Dort will man Upgrade-Logik oder Handler für versionchange prüfen, ohne eine echte Datenbank anzulegen. Die Eigenschaften oldVersion und newVersion legt man über das Options-Objekt fest.

Das Event erbt von Event. newVersion ist null, wenn die Datenbank gelöscht wird. Ein selbst erzeugtes Event hat isTrusted === false und löst im Browser kein echtes Schema-Upgrade aus. Innerhalb eines von Hand ausgelösten Handlers gibt es also auch keine Versionsänderungs-Transaktion.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Name des Events, typischerweise "upgradeneeded", "versionchange", "blocked" oder "success".
$options object {} Optionales Wörterbuch (IDBVersionChangeEventInit). Es erweitert EventInit um:
  • oldVersion (number, Standard 0): bisherige Version der Datenbank.
  • newVersion (number | null, Standard null): neue Version, oder null beim Löschen.
  • außerdem bubbles, cancelable und composed aus EventInit (jeweils Standard false).

Rückgabewert

Typ
IDBVersionChangeEvent
Beschreibung
Ein neues IDBVersionChangeEvent-Objekt mit den angegebenen Werten für oldVersion und newVersion.

Beispiele

Event erzeugen und Eigenschaften lesen

const event = new IDBVersionChangeEvent('upgradeneeded', {
  oldVersion: 1,
  newVersion: 2
});

console.log(event.type);       // Event-Name
console.log(event.oldVersion); // alte Version
console.log(event.newVersion); // neue Version
console.log(event.isTrusted);  // selbst erzeugt => false
upgradeneeded 1 2 false

Upgrade-Logik im Unit-Test prüfen

// Migrationslogik, unabhängig von einer echten Datenbank
const getMigrations = (event) => {
  const steps = [];
  if (event.oldVersion < 1) steps.push('Store "users" anlegen');
  if (event.oldVersion < 2) steps.push('Index "email" anlegen');
  if (event.oldVersion < 3) steps.push('Store "settings" anlegen');
  return steps;
};

const fakeEvent = new IDBVersionChangeEvent('upgradeneeded', {
  oldVersion: 1,
  newVersion: 3
});

console.log(getMigrations(fakeEvent));
[ 'Index "email" anlegen', 'Store "settings" anlegen' ]

versionchange-Handler per dispatchEvent testen

// EventTarget ersetzt hier die IDBDatabase-Verbindung
const fakeDb = new EventTarget();
let closed = false;

fakeDb.addEventListener('versionchange', (event) => {
  if (event.newVersion === null) {
    console.log('Datenbank wird gelöscht – Verbindung schließen');
  } else {
    console.log(`Update auf Version ${event.newVersion} – bitte neu laden`);
  }
  closed = true;
});

fakeDb.dispatchEvent(
  new IDBVersionChangeEvent('versionchange', { oldVersion: 2, newVersion: null })
);
console.log('closed:', closed);
Datenbank wird gelöscht – Verbindung schließen closed: true

// Wichtig · Fallstricke

  • Kein echtes Upgrade: Ein selbst erzeugtes und ausgelöstes Event startet keine Versionsänderungs-Transaktion. createObjectStore() funktioniert nur in einem echten upgradeneeded-Handler von indexedDB.open().
  • newVersion ist standardmäßig null. Vergisst man den Wert, sieht es für den Handler so aus, als würde die Datenbank gelöscht.
  • Ohne den Aufruf mit new wirft der Konstruktor einen TypeError. Fehlt das Argument type, gibt es ebenfalls einen TypeError.
  • Die frühere, nicht standardisierte Eigenschaft version und die Methode initIDBVersionChangeEvent() gelten als veraltet und sind entfernt. Verwende nur oldVersion und newVersion.
  • Browser-Kompatibilität: In allen aktuellen Browsern verfügbar, auch in Web Workern. In Node.js gibt es IndexedDB nicht eingebaut; dort hilft z. B. fake-indexeddb.
  • Praxis-Tipp: Im echten versionchange-Handler immer db.close() aufrufen. Sonst bleiben Upgrades in anderen Tabs mit blocked hängen.