JavaScript DOM-Elemente auswählen
DOM-Elemente in JavaScript auswählen mit getElementById, querySelector, querySelectorAll, getElementsByClassName, matches und closest — mit Beispielen und Anwendungshinweisen.
Bevor du mit JavaScript irgendetwas auf einer Seite verändern kannst — Text aktualisieren, eine Klasse umschalten, einen Klick-Handler anhängen — musst du zunächst das gewünschte Element finden. Dieser Vorgang des Findens wird Auswählen eines DOM-Elements genannt. Dieses Kapitel behandelt alle dafür benötigten Methoden, erklärt, was jede davon zurückgibt, und zeigt, wann welche Methode am besten geeignet ist.
Was „ein Element auswählen" bedeutet
Das Document Object Model (DOM) ist die lebendige, baumförmige Darstellung deines HTML im Browser. Jedes Tag wird zu einem Node-Objekt, das du in JavaScript lesen und verändern kannst. Auswählen ist der Prozess, einen oder mehrere dieser Nodes zu lokalisieren, um eine Referenz darauf in einer Variablen zu speichern:
const heading = document.querySelector('h1');
// `heading` now points at the real <h1> on the page.Sobald du diese Referenz hast, funktioniert alles andere — das Lesen von Attributen und Eigenschaften, das Ändern von Stilen, das Hinzufügen von Event-Listenern — damit.
Die Auswahlmethoden lassen sich in zwei Gruppen einteilen:
- ID- / Klassen- / Tag-Suchen — schnell, geben live Collections zurück (außer
getElementById). - CSS-Selektor-Suchen (
querySelector,querySelectorAll) — flexibel, akzeptieren jeden CSS-Selektor, geben ein statisches Ergebnis zurück.
Ein Element nach ID auswählen: getElementById
Der schnellste Weg, ein einzelnes Element zu greifen, ist über seine eindeutige id. Die Methode gibt das Element zurück oder null, wenn kein Element mit dieser ID existiert.
const element = document.getElementById('example');
element.textContent = 'You selected the element by its ID!';Da IDs eindeutig sein sollen, gibt getElementById ein einzelnes Element zurück (keine Collection) und ist die direkteste und leistungsfähigste Suche.
Wenn kein Element übereinstimmt, gibt getElementById null zurück. Der Zugriff auf eine Eigenschaft von null wirft einen TypeError: Cannot read properties of null. Schütze dich dagegen: const el = document.getElementById('maybe'); if (el) { /* ... */ }.
Nach Klassenname auswählen: getElementsByClassName
Diese Methode gibt eine live HTMLCollection aller Elemente zurück, die die angegebene Klasse tragen. „Live" bedeutet, dass die Collection sich automatisch aktualisiert, wenn sich das DOM ändert.
const elements = document.getElementsByClassName('example');
Array.from(elements).forEach((element, index) => {
element.textContent = `Element ${index + 1} changed!`;
});Eine HTMLCollection ist array-ähnlich, aber kein echtes array, daher fehlen ihr forEach/map. Konvertiere sie mit Array.from() (oder dem Spread-Operator [...elements]), bevor du array-Methoden verwendest.
Da die Collection live ist, können beim Durchlaufen mit for (let i = 0; i < c.length; i++) während des Entfernens übereinstimmender Elemente Einträge übersprungen werden — die Länge verringert sich dabei. Erstelle mit Array.from() einen Schnappschuss, wenn du das DOM während der Schleife verändern möchtest.
Nach Tag-Name auswählen: getElementsByTagName
Wählt alle Elemente mit einem bestimmten Tag-Namen aus und gibt eine live HTMLCollection zurück.
const paragraphs = document.getElementsByTagName('p');
for (let i = 0; i < paragraphs.length; i++) {
paragraphs[i].style.backgroundColor = 'yellow';
}Übergib '*', um jedes Element auf der Seite zu treffen. Das ist nützlich, wenn du alle Tags einer bestimmten Art bearbeiten möchtest, beispielsweise um jeden Absatz hervorzuheben.
Nach name-Attribut auswählen: getElementsByName
Gibt eine live NodeList von Elementen zurück, die dasselbe name-Attribut teilen. Dies ist am nützlichsten für Formularelemente — zum Beispiel alle Radio-Buttons einer Gruppe:
const options = document.getElementsByName('plan');
options.forEach((radio) => {
radio.addEventListener('change', () => {
console.log('Selected plan:', radio.value);
});
});Für eine ausführlichere Formularverarbeitung, siehe Arbeiten mit Formularen im DOM.
Mit CSS-Selektoren auswählen: querySelector
querySelector gibt das erste Element zurück, das einem beliebigen CSS-Selektor entspricht, den du übergibst, oder null, wenn nichts übereinstimmt. Dies ist die vielseitigste Methode für ein einzelnes Element.
const element = document.querySelector('.example');
element.style.backgroundColor = 'lightblue';Da sie die vollständige CSS-Selektor-Syntax akzeptiert, kannst du tief gezielt suchen: querySelector('nav ul li.active a') findet den ersten übereinstimmenden Link, ohne mehrere Aufrufe zu verketten.
Alle Treffer auswählen: querySelectorAll
Gibt eine statische NodeList aller Elemente zurück, die dem Selektor entsprechen. Im Gegensatz zu getElementsBy... aktualisiert sich dieser Schnappschuss nicht, wenn sich das DOM später ändert.
const elements = document.querySelectorAll('.example');
elements.forEach((element, index) => {
element.style.backgroundColor = 'lightgreen';
element.textContent = `Element ${index + 1} highlighted!`;
});Eine NodeList hat eine echte forEach-Methode, sodass du sie direkt iterieren kannst. Um map/filter zu nutzen, konvertiere sie zuerst mit Array.from(elements).
querySelectorAll gibt eine statische NodeList zurück — sie spiegelt keine danach hinzugefügten oder entfernten Elemente wider. getElementsByClassName und getElementsByTagName geben live HTMLCollections zurück, die das tun. Wähle statisch, wenn du einen stabilen Schnappschuss möchtest, live, wenn die Collection das DOM verfolgen soll.
Eine Suche auf ein Element eingrenzen
Alle querySelector*- und getElementsBy*-Methoden existieren auch auf einzelnen Elementen, nicht nur auf document. Wenn du sie auf einem Element aufrufst, beschränkt sich die Suche auf dessen Nachkommen:
const card = document.querySelector('.card');
const title = card.querySelector('.title'); // only inside .cardDas Eingrenzen hält Abfragen schnell und verhindert, dass unbeabsichtigt Elemente anderswo auf der Seite gefunden werden.
Ein Element testen: matches
matches gibt kein Element zurück — es gibt true/false zurück, je nachdem, ob ein bestimmtes Element einem CSS-Selektor entspricht. Es eignet sich ideal innerhalb von Event-Handlern und bei Event-Delegation.
const element = document.getElementById('test');
if (element.matches('.example')) {
element.style.color = 'red';
element.textContent = 'Element matches the selector!';
}Den Baum nach oben durchlaufen: closest
closest beginnt beim Element selbst und geht durch seine Vorfahren nach oben, bis es das nächste Element findet, das dem Selektor entspricht (oder null). Es ist der sauberste Weg, ein umgebendes Element zu finden.
const element = document.getElementById('child');
const parent = element.closest('.outer');
parent.style.border = '2px solid red';matches + closest bilden das Rückgrat der Event-Delegation: Hänge einen einzigen Listener an einen Container, und nutze im Handler event.target.closest('.item'), um herauszufinden, welches Kind tatsächlich angeklickt wurde. Mehr dazu in Event-Handling im DOM.
Selektoren für präzises Targeting kombinieren
CSS-Selektoren lassen sich kombinieren, sodass du so spezifisch sein kannst, wie du brauchst, ohne zusätzlichen Code:
const element = document.querySelector('.example.special');
element.style.backgroundColor = 'pink';
element.textContent = 'Special element highlighted!';Hier trifft .example.special ein Element, das beide Klassen hat. Du kannst Kombinatoren verketten (>, Nachfahren-Leerzeichen, +, ~), Attributselektoren (input[type="email"]) und Pseudoklassen (li:first-child).
Welche Methode soll ich verwenden?
| Methode | Gibt zurück | Live? | Am besten für |
|---|---|---|---|
getElementById | einzelnes Element / null | n/a | ein Element mit bekannter eindeutiger ID |
getElementsByClassName | HTMLCollection | live | alle Elemente einer Klasse mit DOM-Tracking |
getElementsByTagName | HTMLCollection | live | alle Elemente eines Tags |
getElementsByName | NodeList | live | Formularelemente mit gleichem name |
querySelector | erster Treffer / null | n/a | erstes Element, das einem CSS-Selektor entspricht |
querySelectorAll | NodeList | static | ein stabiler Schnappschuss aller Treffer |
matches | boolean | n/a | prüfen, ob ein Element einem Selektor entspricht |
closest | nächster Vorfahre / null | n/a | ein umgebendes Element finden |
Faustregeln:
- Greife standardmäßig auf
querySelector/querySelectorAllzurück — eine konsistente API mit voller CSS-Unterstützung. - Verwende
getElementById, wenn du eine eindeutige ID hast und die schnellstmögliche Suche benötigst. - Nutze eine live Collection (
getElementsBy...) nur dann, wenn du gezielt möchtest, dass sie DOM-Änderungen verfolgt; andernfalls bevorzuge das statischequerySelectorAll.
Häufige Fallstricke
null-Ergebnisse.getElementById,querySelectorundclosestgeben allenullzurück, wenn kein Treffer vorliegt. Überprüfe das Ergebnis immer, bevor du es verwendest.- Ausführung vor dem Aufbau des DOM. Wenn dein Skript in
<head>läuft, bevor die Elemente geparst wurden, liefern Selektionen nichts zurück. Setze Skripte ans Ende von<body>, nutzedefer, oder warte aufDOMContentLoaded. - Collections sind keine arrays.
HTMLCollectionhat keinforEach.NodeListhatforEach, aber keinmap/filter. Konvertiere im Zweifelsfall mitArray.from().
Fazit
Das Auswählen von Elementen ist der Einstiegspunkt für jede DOM-Aufgabe. Für den Großteil des Codes bieten querySelector und querySelectorAll eine flexible, CSS-gestützte API; getElementById bleibt die schnellste Wahl für eindeutige IDs; und matches / closest ermöglichen eine saubere Event-Delegation. Sobald du Elemente zuverlässig auswählen kannst, fahre mit DOM-Manipulation und DOM-Traversierung fort.
Hinweis zur Performance: Alle diese Methoden sind für typische Seiten schnell genug. Die eigentlichen Kosten entstehen, wenn sie wiederholt in engen Schleifen aufgerufen werden — speichere eine Auswahl in einer Variablen, anstatt sie erneut abzufragen. Statische NodeLists von querySelectorAll vermeiden den Reflow-Verwaltungsaufwand, der live HTMLCollections auf dem aktuellen Stand hält.