Signatur
Beschreibung
DOMStringList ist ein altes, nur lesbares Listen-Interface für Zeichenketten. Man legt es nie selbst an. Man bekommt es von bestimmten Plattform-APIs zurück, vor allem aus IndexedDB (IDBDatabase.objectStoreNames, IDBObjectStore.indexNames, IDBTransaction.objectStoreNames) und von Location.ancestorOrigins.
Das Interface ist bewusst klein gehalten:
length: Anzahl der Einträge (nur lesbar).item(index): gibt den String an Positionindexzurück, bei ungültigem Indexnull. Man kann auch mit eckigen Klammern zugreifen (list[0]), dann bekommt man bei ungültigem Indexundefined.contains(string): gibttruezurück, wenn der String in der Liste steht.
Eine DOMStringList ist kein echtes Array. Methoden wie map, filter oder includes fehlen. In aktuellen Browsern lässt sie sich mit for...of durchlaufen. Für Array-Methoden wandelt man sie zuerst mit Array.from() oder dem Spread-Operator um.
Die WHATWG-Spezifikation stuft das Interface als veraltet ein. Neue APIs geben stattdessen normale Arrays zurück (sequence<DOMString> bzw. FrozenArray). Aus Kompatibilitätsgründen bleibt DOMStringList aber erhalten und wird in allen Browsern unterstützt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $index Pflicht | number | Parameter von item(index): nullbasierte Position des gewünschten Strings. |
|
| $string Pflicht | string | Parameter von contains(string): der String, nach dem gesucht wird. Groß- und Kleinschreibung zählen, es wird exakt verglichen. |
Beispiele
IndexedDB: prüfen, ob ein Object Store existiert
const request = indexedDB.open('shop', 2);
request.onupgradeneeded = (event) => {
const db = event.target.result;
// objectStoreNames ist eine DOMStringList
if (!db.objectStoreNames.contains('produkte')) {
db.createObjectStore('produkte', { keyPath: 'id' });
}
};
request.onsuccess = (event) => {
const db = event.target.result;
console.log(db.objectStoreNames.length);
console.log(db.objectStoreNames.item(0));
console.log(db.objectStoreNames.contains('produkte'));
};
In ein echtes Array umwandeln und weiterverarbeiten
const db = await new Promise((resolve, reject) => {
const req = indexedDB.open('shop');
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// DOMStringList hat kein map/filter – daher umwandeln
const storeNames = Array.from(db.objectStoreNames);
const sichtbar = storeNames.filter((name) => !name.startsWith('_'));
console.log(sichtbar);
// Durchlaufen mit for...of klappt in aktuellen Browsern direkt
for (const name of db.objectStoreNames) {
console.log(`Store: ${name}`);
}
Location.ancestorOrigins: Einbettung in einem iframe prüfen
const erlaubteHosts = ['https://partner.example.com'];
const origins = window.location.ancestorOrigins; // DOMStringList oder undefined
if (origins && origins.length > 0) {
const direkterParent = origins.item(0);
const erlaubt = erlaubteHosts.includes(direkterParent);
console.log(`Eingebettet von ${direkterParent}, erlaubt: ${erlaubt}`);
} else {
console.log('Nicht eingebettet oder API nicht verfügbar');
}
item() und Klammerzugriff im Vergleich
const list = db.objectStoreNames; // z. B. ["produkte"]
console.log(list.item(5)); // ungültiger Index
console.log(list[5]); // ungültiger Index
console.log(typeof list.includes); // keine Array-Methode
// Wichtig · Fallstricke
- Kein Array:
Array.isArray(list)gibtfalsezurück.includes,map,forEachund ähnliche Methoden gibt es nicht. Stattdessencontains()verwenden oder die Liste mitArray.from()umwandeln. - Nicht selbst erzeugbar:
new DOMStringList()wirft einenTypeError. Es gibt keinen öffentlichen Konstruktor. - Momentaufnahme bei IndexedDB:
IDBTransaction.objectStoreNamesund die Listen außerhalb vononupgradeneededändern sich während der Laufzeit nicht. Wenn man Werte länger behalten will, speichert man sie am besten als Array. - Kompatibilität: Das Interface selbst wird in allen Browsern unterstützt.
Location.ancestorOriginsfehlt aber in Firefox, deshalb immer aufundefinedprüfen.DataTransfer.typeswar früher eineDOMStringList, ist heute aber ein eingefrorenes Array. Alter Code mittypes.contains()funktioniert deshalb nicht mehr zuverlässig, besser isttypes.includes(). - Veraltet: In eigenen APIs keine
DOMStringListnachbauen, sondern normale Arrays verwenden.