Signatur
Beschreibung
Die Methode contains() von DOMStringList prüft, ob ein String genau so in der Liste vorkommt. Sie gibt true zurück, wenn es einen Treffer gibt, und sonst false. Verglichen wird exakt: Groß- und Kleinschreibung zählen, und es gibt keine Suche nach Teilstrings.
In der Praxis begegnet einem DOMStringList vor allem in IndexedDB, und zwar bei IDBDatabase.objectStoreNames, IDBTransaction.objectStoreNames und IDBObjectStore.indexNames. Ein weiterer Fall ist Location.ancestorOrigins. Typisch ist diese Prüfung im upgradeneeded-Handler: Man legt einen Object Store oder Index nur an, wenn es ihn noch nicht gibt. So vermeidet man eine ConstraintError-Ausnahme.
DOMStringList ist kein echtes Array. Methoden wie includes(), filter() oder map() fehlen. Für eine einfache Prüfung, ob ein Eintrag vorhanden ist, ist contains() der vorgesehene Weg. Brauchst du weitere Array-Funktionen, wandelst du die Liste mit Array.from() oder dem Spread-Operator in ein Array um.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der gesuchte String. Werte, die keine Strings sind, werden nach den WebIDL-Regeln für DOMString in einen String umgewandelt (z. B. wird undefined zu "undefined"). |
Rückgabewert
true, wenn der String genau so in der Liste vorkommt, sonst false.Beispiele
Object Store nur anlegen, wenn er noch fehlt (IndexedDB)
const request = indexedDB.open('shop', 2);
request.addEventListener('upgradeneeded', (event) => {
const db = event.target.result;
// objectStoreNames ist eine DOMStringList
if (!db.objectStoreNames.contains('kunden')) {
db.createObjectStore('kunden', { keyPath: 'id' });
console.log('Store "kunden" angelegt');
} else {
console.log('Store "kunden" existiert bereits');
}
});
request.addEventListener('success', () => console.log('DB bereit'));
Index bei einer Schema-Migration ergänzen
const request = indexedDB.open('shop', 3);
request.addEventListener('upgradeneeded', (event) => {
// Transaktion, die zum Upgrade gehört
const tx = event.target.transaction;
const store = tx.objectStore('kunden');
// indexNames ist ebenfalls eine DOMStringList
if (!store.indexNames.contains('email')) {
store.createIndex('email', 'email', { unique: true });
}
console.log([...store.indexNames]);
});
Groß-/Kleinschreibung und Umwandlung in ein Array
const request = indexedDB.open('shop');
request.addEventListener('success', () => {
const names = request.result.objectStoreNames;
console.log(names.contains('kunden')); // exakter Treffer
console.log(names.contains('Kunden')); // Groß-/Kleinschreibung zählt
console.log(names.contains('kund')); // keine Teilstring-Suche
// Für Array-Methoden zuerst umwandeln
const liste = Array.from(names).filter((n) => n.startsWith('k'));
console.log(liste);
});
Prüfen, ob die Seite von einem vertrauenswürdigen Ursprung eingebettet ist
const erlaubt = 'https://partner.example.com';
// ancestorOrigins gibt es nicht in jedem Browser
if ('ancestorOrigins' in location) {
const eingebettet = location.ancestorOrigins.contains(erlaubt);
console.log(eingebettet ? 'Einbettung erlaubt' : 'Unbekannter Einbetter');
} else {
console.log('ancestorOrigins nicht unterstützt');
}
// Wichtig · Fallstricke
- Kein Array:
DOMStringListhat keinincludes(). Ein Aufruf wiedb.objectStoreNames.includes('x')wirft einenTypeError. Nutzecontains()oder wandle die Liste vorher mitArray.from()um. - Exakter Vergleich: Groß- und Kleinschreibung zählen, und Leerzeichen werden nicht entfernt. Teilstrings werden nicht gefunden.
- Pflichtargument: Ohne Argument wirft
contains()einenTypeError.contains(undefined)sucht dagegen nach dem String\"undefined\". - Momentaufnahme:
IDBDatabase.objectStoreNamesbildet den Stand des Schemas ab. Aktuell nach Änderungen ist es währendupgradeneededbzw. nach dem erneuten Öffnen der Datenbank. - Kompatibilität: Die Methode wird in allen modernen Browsern unterstützt.
Location.ancestorOriginsfehlt aber in Firefox, deshalb vorher prüfen, ob es vorhanden ist.DataTransfer.typeswar früher in Firefox eineDOMStringList, ist heute aber ein eingefrorenes Array. Dort gilt alsoincludes()stattcontains(). - Sicherheit:
ancestorOriginshilft bei der Prüfung, von wo eine Seite eingebettet ist, ersetzt aber keinen Schutz auf Serverseite. Setze zusätzlich die CSP-Direktiveframe-ancestors.