Signatur
Beschreibung
Die schreibgeschützte Eigenschaft lowerOpen eines IDBKeyRange-Objekts zeigt, wie die untere Grenze (lower) des Schlüsselbereichs behandelt wird. Bei false ist die Grenze geschlossen, der Wert von lower gehört also dazu (key >= lower). Bei true ist sie offen, der Grenzwert selbst ist ausgeschlossen (key > lower).
Festgelegt wird der Wert beim Erzeugen des Bereichs, und zwar über den Parameter open von IDBKeyRange.lowerBound(lower, open) oder über lowerOpen von IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen). Wer nichts angibt, bekommt false. Nachträglich ändern lässt sich der Wert nicht. Für eine andere Einstellung legt man einen neuen Bereich an.
Praktisch ist die Eigenschaft vor allem, wenn Code einen fremden oder dynamisch erzeugten Schlüsselbereich prüfen, protokollieren oder in einen anderen Bereich umrechnen muss. Das kommt etwa bei der seitenweisen Abfrage vor („alles nach dem zuletzt gelesenen Schlüssel“) oder beim Umwandeln in eine URL- bzw. Debug-Darstellung wie (5, 10].
Rückgabewert
true, wenn die untere Grenze offen ist, der Grenzwert also nicht dazugehört. false, wenn der Grenzwert dazugehört.Beispiele
lowerOpen bei verschiedenen Bereichen auslesen
const inklusive = IDBKeyRange.lowerBound(10); // key >= 10
const exklusive = IDBKeyRange.lowerBound(10, true); // key > 10
const beidseitig = IDBKeyRange.bound(1, 5, true, false); // 1 < key <= 5
console.log(inklusive.lowerOpen);
console.log(exklusive.lowerOpen);
console.log(beidseitig.lowerOpen, beidseitig.upperOpen);
Schlüsselbereich lesbar als Intervall ausgeben
const formatRange = (range) => {
const links = range.lower === undefined ? '(-∞' : `${range.lowerOpen ? '(' : '['}${range.lower}`;
const rechts = range.upper === undefined ? '∞)' : `${range.upper}${range.upperOpen ? ')' : ']'}`;
return `${links}, ${rechts}`;
};
console.log(formatRange(IDBKeyRange.bound(5, 10, true)));
console.log(formatRange(IDBKeyRange.lowerBound('M')));
console.log(formatRange(IDBKeyRange.only(42)));
Seitenweise laden: alles nach dem letzten Schlüssel
// Voraussetzung: Object Store "artikel" mit numerischem Schlüssel
const ladeSeite = (db, letzterKey, anzahl = 20) =>
new Promise((resolve, reject) => {
// Offene Untergrenze: den zuletzt gelesenen Datensatz nicht noch einmal liefern
const range = letzterKey === undefined
? null
: IDBKeyRange.lowerBound(letzterKey, true);
console.log('Untergrenze offen?', range?.lowerOpen ?? 'kein Bereich');
const store = db.transaction('artikel', 'readonly').objectStore('artikel');
const request = store.getAll(range, anzahl);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
// Nutzung:
// const seite1 = await ladeSeite(db);
// const seite2 = await ladeSeite(db, seite1.at(-1).id);
Bestehenden Bereich mit geschlossener Untergrenze neu erzeugen
const original = IDBKeyRange.bound(100, 200, true, true);
// lowerOpen ist schreibgeschützt, also einen neuen Bereich bauen
const inklusiv = IDBKeyRange.bound(original.lower, original.upper, false, original.upperOpen);
console.log(original.lowerOpen, inklusiv.lowerOpen);
console.log(original.includes(100), inklusiv.includes(100));
// Wichtig · Fallstricke
- Die Bedeutung ist leicht zu verwechseln:
lowerOpen === trueheißt, dass der Grenzwert ausgeschlossen ist. Die Bezeichnung „open“ stammt aus der Mathematik (offenes Intervall) und bedeutet nicht „der Wert ist enthalten“. - Schreibgeschützt: Eine Zuweisung wie
range.lowerOpen = truehat keine Wirkung. Im Strict Mode löst sie einenTypeErroraus. Für eine andere Grenze erzeugt man einen neuen Bereich. - Bereiche ohne Untergrenze: Bei
IDBKeyRange.upperBound()istlowergleichundefined, undlowerOpenist laut Spezifikationtrue. Ob überhaupt eine Untergrenze existiert, prüft man daher überlower, nicht überlowerOpen. - Bei
IDBKeyRange.only(key)sindlowerOpenundupperOpenimmerfalse. IDBKeyRange.bound(x, x, true, …)wirft einenDataError, weil ein Bereich mit gleichen, aber offenen Grenzen leer wäre. Dasselbe gilt, wennlower > upperist.- Kompatibilität: Wird von allen aktuellen Browsern unterstützt, auch in Web Workern. Nicht verfügbar in Node.js ohne Polyfill (z. B.
fake-indexeddb).