Signatur
Beschreibung
Die schreibgeschützte Eigenschaft direction des Interfaces IDBCursor gibt an, in welcher Richtung der Cursor die Datensätze durchläuft. Die Richtung legst du beim Öffnen des Cursors fest, und zwar über den zweiten Parameter von IDBObjectStore.openCursor(), IDBObjectStore.openKeyCursor(), IDBIndex.openCursor() oder IDBIndex.openKeyCursor(). Danach lässt sie sich nicht mehr ändern.
Mögliche Werte:
"next"(Standard): aufsteigend nach Schlüssel, Duplikate werden mitgeliefert."nextunique": aufsteigend. Bei gleichen Index-Schlüsseln wird nur der erste Datensatz (mit dem kleinsten Primärschlüssel) geliefert."prev": absteigend nach Schlüssel, Duplikate werden mitgeliefert."prevunique": absteigend. Bei gleichen Index-Schlüsseln wird nur ein Datensatz geliefert, ebenfalls der mit dem kleinsten Primärschlüssel.
Nützlich ist die Eigenschaft vor allem in allgemeinen Hilfsfunktionen, die einen Cursor übergeben bekommen und je nach Richtung anders arbeiten sollen, etwa beim Blättern, bei der Anzeige „neueste zuerst“ oder beim Protokollieren. Die unique-Varianten machen nur bei Indizes einen Unterschied, die nicht eindeutig sind. In einem Object Store sind die Primärschlüssel ohnehin eindeutig.
Rückgabewert
IDBCursorDirection) mit der Durchlaufrichtung, die beim Öffnen des Cursors festgelegt wurde.Beispiele
Richtung eines Standard-Cursors auslesen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = () => {
const db = request.result;
const store = db.createObjectStore('produkte', { keyPath: 'id' });
store.add({ id: 1, name: 'Tastatur' });
store.add({ id: 2, name: 'Maus' });
};
request.onsuccess = () => {
const db = request.result;
const store = db.transaction('produkte').objectStore('produkte');
store.openCursor().onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) return;
console.log(cursor.direction, cursor.key, cursor.value.name);
cursor.continue();
};
};
Neueste Einträge zuerst mit "prev"
const zeigeNeuesteZuerst = (db) => {
const store = db.transaction('produkte').objectStore('produkte');
store.openCursor(null, 'prev').onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) return;
console.log(`${cursor.direction}: ${cursor.value.name}`);
cursor.continue();
};
};
Doppelte Index-Werte mit "nextunique" überspringen
// Annahme: Index 'kategorie' auf dem Store 'produkte' (nicht eindeutig)
const listeKategorien = (db) => {
const index = db.transaction('produkte').objectStore('produkte').index('kategorie');
const kategorien = [];
index.openKeyCursor(null, 'nextunique').onsuccess = (event) => {
const cursor = event.target.result;
if (!cursor) {
console.log(kategorien);
return;
}
// Generische Prüfung über direction
if (cursor.direction.endsWith('unique')) {
kategorien.push(cursor.key);
}
cursor.continue();
};
};
// Wichtig · Fallstricke
Schreibgeschützt: Wenn du cursor.direction etwas zuweist, bleibt das wirkungslos (im Strict Mode gibt es einen TypeError). Für eine andere Richtung musst du einen neuen Cursor öffnen.
Ungültige Werte: Wenn du openCursor() einen unbekannten Richtungs-String übergibst, wird ein TypeError geworfen. Veraltete numerische Konstanten wie IDBCursor.NEXT (aus frühen Entwürfen der Spezifikation) funktionieren in aktuellen Browsern nicht mehr.
Unique-Varianten: "prevunique" liefert bei gleichen Index-Schlüsseln den Datensatz mit dem kleinsten Primärschlüssel, nicht den letzten. Das überrascht oft.
Kompatibilität: Wird in allen modernen Browsern unterstützt, auch in Web Workern. In Node.js gibt es IndexedDB nicht nativ, dafür braucht es zum Beispiel fake-indexeddb.