Start · Sprachen · JavaScript · Referenz · DOMStringList.contains()

DOMStringList.contains()

Methode

Prüft, ob ein bestimmter String in einer <code>DOMStringList</code> enthalten ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

DOMStringList.prototype.contains(string)

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

Typ
boolean
Beschreibung
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'));
Store "kunden" angelegt 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]);
});
["email"]

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);
});
true false false ["kunden"]

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');
}
Einbettung erlaubt

// Wichtig · Fallstricke

  • Kein Array: DOMStringList hat kein includes(). Ein Aufruf wie db.objectStoreNames.includes('x') wirft einen TypeError. Nutze contains() oder wandle die Liste vorher mit Array.from() um.
  • Exakter Vergleich: Groß- und Kleinschreibung zählen, und Leerzeichen werden nicht entfernt. Teilstrings werden nicht gefunden.
  • Pflichtargument: Ohne Argument wirft contains() einen TypeError. contains(undefined) sucht dagegen nach dem String \"undefined\".
  • Momentaufnahme: IDBDatabase.objectStoreNames bildet den Stand des Schemas ab. Aktuell nach Änderungen ist es während upgradeneeded bzw. nach dem erneuten Öffnen der Datenbank.
  • Kompatibilität: Die Methode wird in allen modernen Browsern unterstützt. Location.ancestorOrigins fehlt aber in Firefox, deshalb vorher prüfen, ob es vorhanden ist. DataTransfer.types war früher in Firefox eine DOMStringList, ist heute aber ein eingefrorenes Array. Dort gilt also includes() statt contains().
  • Sicherheit: ancestorOrigins hilft bei der Prüfung, von wo eine Seite eingebettet ist, ersetzt aber keinen Schutz auf Serverseite. Setze zusätzlich die CSP-Direktive frame-ancestors.