JavaScript/DOM/Element/classList

Aus SELFHTML-Wiki
< JavaScript‎ | DOM‎ | Element
Wechseln zu: Navigation, Suche

Die Eigenschaft Element.classList stellt die Klassen, die einem Element zugeordnet sind, in Form eines DOMTokenList Objekts zur Verfügung.

Syntax

const elementClasses = elementNodeReference.classList;

Während die Element.className-Eigenschaft direkt den Wert des class-Attributs als Zeichenkette zur Verfügung stellt, werden die dort aufgeführten Klassen mittels dieser Eigenschaft als ein Objekt mit der DOMTokenList Schnittstelle angeboten. Dadurch erhalten Sie die Möglichkeit, auch bei mehreren vorhandenen Klassen einzelne davon hinzuzufügen, zu verändern oder zu löschen. Um dies zu erreichen, können Sie mit der Punkt-Notation die folgenden Methoden dieses Objekts aufrufen:

  • add: fügt der Liste eine weitere Klasse hinzu
  • remove: entfernt eine Klasse aus der Liste
  • toggle: schaltet eine Klasse an bzw. ab
  • contains: überprüft, ob eine Liste aller Klassen eine bestimmte Klasse enthält.
  • item: Abrufen des Klassennamens an einer Position in der Liste
  • length: Ermitteln, wieviele Klassennamen die Liste enthält

Eine DOMTokenList ist eine geordnete Menge. Das bedeutet, dass es sich im Prinzip um eine Liste handelt, deren Einträge eine festgelegte Reihenfolge haben und bei der neue Elemente stets am Ende angefügt werden (im Gegensatz beispielsweise zu einem Hash-Set). Die Besonderheit einer Menge ist aber, dass sie das gleiche Element nicht zweimal enthalten kann. Auch wenn Sie für ein Element class="x y z x" notieren, würde die Klasse x nur einmal in der classList zu finden sein.

Anwendungsbeispiele

Liste aller Attributklassen anzeigen

Darstellung als Zeichenkette ansehen …
  function Auswerten() {
    let hinweis = document.getElementById('tipp');
    let text ='Folgende Klassen existieren: ' + hinweis.classList;
    document.getElementById("ausgabe").innerHTML = text;
  }

In diesem Beispiel werden alle vorhandenen Klassen des Absatzes in einem String ausgelesen. Der Wert dieses Strings entspricht in Chrome und Firefox exakt dem Inhalt des class-Attributs, inklusive der Leerstellen. Der Nutzen dieses Beispiels besteht nur darin, Sie auf die Nutzlosigkeit von classList für diesen Zweck aufmerksam zu machen. Verwenden Sie besser die className Eigenschaft für diesen Zweck, um direkt auf das class-Attribut zuzugreifen.

Klassen hinzufügen mit add

Um einer classList eine Klasse hinzuzufügen, verwenden Sie die add Methode. Das Praktische an dieser Methode ist, dass sie die Klasse nur dann hinzufügt, wenn sie noch nicht in der classList vorhanden ist. Sie brauchen also vor dem Aufruf von add nicht selbst zu prüfen, ob Sie möglicherweise ein Duplikat erzeugen würden. Eine neue Klasse wird am Ende der classList hinzugefügt.

Der Rückgabewert von add ist undefined.

Beispiel 1: add ansehen …
  function setzeSicherheitshinweis(elementId) {
    let hinweis = document.getElementById(elementId);
    hinweis.classList.add('sicherheitshinweis');
  }
Beachten Sie: Es ist nicht möglich, in einem Parameter mehrere Klassen (z.B. durch Leerzeichen getrennt) hinzuzufügen.

Wenn Sie einem Element mehrere Klassen auf einmal hinzufügen möchten, rufen Sie entweder add mehrfach auf, oder übergeben Sie für jede Klasse einen eigenes Argument.

Beispiel
  // Füge einem Element die Klassen test, alarm, vorsicht und warnung hinzu
  element.classList.add('test', 'alarm', 'vorsicht', 'warnung');

Klassen entfernen mit remove

Die remove Methode entfernt eine Klasse aus der classList. Die Methode überprüft vorher, ob die zu entfernende Klasse überhaupt vorhanden ist. Wenn nicht, tut sie einfach nichts.

Der Rückgabewert von remove ist undefined.

Beispiel 2: remove ansehen …
  function entferneSicherheitshinweis(elementId) {
    let hinweis = document.getElementById(elementId);
    hinweis.classList.remove('sicherheitshinweis');
  }

Genau wie bei add können Sie mehrere Klassen auf einmal entfernen, indem Sie jede Klasse als eigenes Argument an remove übergeben.

Überprüfen mit contains

Um abzufragen, ob für ein Element eine bestimmte Klasse gesetzt ist, verwenden Sie die contains Methode der classList. Das Ergebnis ist entweder true oder false.

Beispiel 3: contains
  if (elem.classList.contains('circle')) {
    console.log("Das Element steht für einen Kreis.");
  }

Sie sollten solche Abfragen nicht verwenden, um den style eines Elements zu ändern. Dafür sind Klassenselektoren im CSS da.

Wirkliche Anwendungsfälle für contains sind eher selten. Die naheliegendste Anwendung könnte das Umschalten einer Klasse sein, aber dafür gibt es bereits eine eigene Methode.

Umschalten mit toggle

Die toggle Methode prüft, ob die classList die angegebene Klasse bereits enthält. Wenn ja, verhält sich toggle so wie remove und entfernt die Klasse. Und wenn sie noch nicht vorhanden ist, verhält sich toggle so wie add und fügt die Klasse hinzu. Mit jedem Aufruf wird also das Vorhandensein dieser Klasse umgeschaltet.

Der Rückgabewert der Methode entspricht contains, d.h. toggle gibt true zurück, wenn die Klasse nach der Rückkehr in der classList vorhanden ist, und andernfalls false.

Beispiel 4: toggle ansehen …
document.addEventListener("DOMContentLoaded", function () {

  document.querySelector('#button1').addEventListener('click',showHide);
  document.querySelector('#button2').addEventListener('click',showHide);

  function showHide(event){ 
    event.target.parentNode.classList.toggle('hide');
    let text = event.target.firstChild;
    text.data = text.data == 'mehr' ? 'weniger' : 'mehr';
  }
});

Im Beispiel gibt es zwei section-Elemente, deren Inhalt beim Klick auf die Buttons gezeigt oder verborgen wird.

Bei einem Klick auf den Button wird die Funktion showHide() aufgerufen, die mit event.target ermittelt, welcher Button geklickt wurde und dann mit parentNode dem Elternelement mit der Methode classList.toggle eine neue Klasse zuweist. Zeitgleich wird mit innerText der Text des Buttons geändert.

Bei einem weiteren Klick wird die Klasse erneut gewechselt. Im Beispiel wird noch mit einer CSS Transition dafür gesorgt, dass der Übergang sanft erfolgt.

force: ein zweites Argument bei toggle

Es gibt auch den Anwendungsfall, dass man eine Klasse setzen möchte, wenn ein bestimmter Test true ergibt, und sie andernfalls entfernen. Das kann man lösen, dass man den Test durchführt und je nach Ergebnis classList.add oder classList.remove aufruft. Um dies zu vereinfachen, unterstützt toggle einen zweiten Parameter, der einen booleschen Wert empfängt und Ihnen genau diese Logik abnimmt. Übergeben Sie als zweiten Parameter true (oder einen Wert, der nach true konvertiert wird), wird die Klasse hinzugefügt. Übergeben Sie false, wird sie entfernt. Die Übergabe von undefined entspricht dem Weglassen des Parameters und führt zum zuvor beschrieben Umschaltverhalten.

Klasse abhängig von booleschem Wert setzen
let darkmode = windows.matchMedia("(prefers-color-scheme: dark)");
document.body.classList.toggle("dark-mode", darkmode.matches);

Die matchMedia-Methode des window-Objekts erstellt MediaQueryList Objekt, mit dem man abfragen kann, ob eine bestimmte CSS-@media Abfrage zutrifft oder nicht. Die matches Eigenschaft dieses Objekts ist true, wenn die Abfrage zutreffend ist. Das Code-Beispiel setzt am body-Element die Klasse dark-mode, wenn der Benutzer im Betriebssystem (oder vielleicht im Browser, sofern der das anbietet) den dunklen Modus für Anwendungen eingestellt hat.

Zugriff auf Klassennamen über ihre Position in der Liste: item und length

Mit der item-Methode können Sie die Einträge in der classList an Hand ihrer Position abrufen. Die erste Klasse hat die Position 0. Um zu erfahren, wieviele Einträge in der classList stehen, verwenden Sie die length Eigenschaft.

Die item-Methode ist ein Synonym für den internen Indexer der DOMTokenList. Sie können Sie die classList daher auch direkt wie ein Array verwenden.

Beispiel 5: item
for (let i = 0; i < elem.classList.length; i++) {
    let klasse1 = elem.classList.item(i);
    let klasse2 = elem.classList[i];          // gleiches Ergebnis
}

Im Beispiel durchläuft das angesprochene Element eine Schleife, in der alle vorhandenen Klassen ausgelesen werden. Es wäre verlockend, die Variable, in die die i-te Klasse eingelesen wird, class zu nennen, aber das ist ein reserviertes Wort in JavaScript und würde zu einem Syntaxfehler führen.

Beachten Sie: Wenn Sie item verwenden, rufen Sie eine Methode auf und verwenden deshalb runde Klammern. Nutzen Sie statt dessen den Indexer, müssen Sie die eckigen Klammern verwenden.

Siehe auch

Weblinks