Elemente auswählen
Ein Bäckerregal hält eine Überschrift und drei Zettel. Die Überschrift sagt Rye. Die Zettel nennen die Schicht: Morning, Noon und Evening. Der letzte Zettel trägt außerdem die Klasse sold. Das Regal ist ein main mit der id shelf. Darin steht ein h2 mit der id loaf, danach drei p-Elemente mit der Klasse tag. Auswählen heißt, das lebendige Dokument nach diesen Knoten unter einem Namen zu fragen, den du vorgibst. document.getElementById("loaf") liefert die Überschrift, und ihr Text ist Rye. document.getElementsByClassName("tag") liefert eine lebendige Liste der Länge 3. document.querySelector(".tag") liefert Morning, den ersten Zettel. document.querySelectorAll(".tag") liefert eine feste Liste, und Index 1 ist Noon. Ein Name, den das Regal nie schreibt, ist null von querySelector und eine Liste der Länge 0 von querySelectorAll.
Fünf Aufrufe, kein Gang den Baum hinunter
Die DOM-Seite nannte den Elternteil einer Überschrift und zählte Elementkinder gegen alle Knoten. Diese Seite liest weder parentElement noch nextElementSibling noch children, und sie ruft Math nicht auf. Der Baum steht schon. Hier unterscheidest du, welcher Aufruf einen Knoten liefert, welcher eine Liste liefert, und welches Ergebnis heißt, dass nichts gepasst hat.
Was jeder Aufruf zurückgibt
Zähle auf dem Regal, das nur die Überschrift und die drei Zettel enthält. Die Lesedatei weiter unten hängt einen weiteren Absatz an, deshalb ändert sich dort die Zahl der p-Elemente.
📊 Was jeder Aufruf zurückgibt
| Aufruf | Was zurückkommt | Auf diesem Regal | Leicht verwechselt |
|---|---|---|---|
getElementById("loaf") |
ein Element oder null |
Überschrifttext Rye | eine Liste, die du indizieren musst |
getElementsByClassName("tag") |
lebendige HTMLCollection |
Länge 3 | den Punkt schreiben, wie in .tag |
getElementsByTagName("p") |
lebendige HTMLCollection |
Länge 3 | die Überschrift, ein h2 |
querySelector(".tag") |
erster Treffer oder null |
der Zettel Morning | jeder Zettel |
querySelectorAll(".tag") |
statische NodeList |
Länge 3; Index 1 ist Noon | eine lebendige Sammlung |
querySelectorAll(".oven") |
leere NodeList |
Länge 0 | null |
Die Klassenmethode und ein CSS-Selektor schreiben den Punkt nicht gleich. getElementsByClassName("tag") will den nackten Namen tag. getElementsByClassName(".tag") sucht eine Klasse, die wörtlich .tag heißt, und liefert die Länge 0. querySelector will CSS, also bleibt der Punkt an .tag. querySelector("tag") sucht ein Element, dessen Tag-Name tag ist, findet keins und liefert null. Index 0 ist der erste Zettel. Index 1 ist Noon. Die Liste von getElementsByClassName ist lebendig: eine spätere Seite, die einen weiteren tag-Zettel anhängt, lässt die Länge wachsen. querySelectorAll behält die Länge vom Augenblick des Aufrufs. Evening trägt zwei Klassen, tag und sold, liegt also in der Liste der Länge 3 und ist zugleich der einzige Treffer für sold.
Eine id, ein Element
Eine id soll auf der Seite eindeutig sein. getElementById liefert dieses eine Element oder null, wenn die id fehlt. Es liefert keine Liste und existiert nur auf document, nicht auf einem Element.
let loaf = document.getElementById("loaf");
console.log(loaf.textContent);
console.log(loaf === null);
Die erste Zeile ist Rye. Die zweite ist false, weil die Überschrift im Regal steht. Teilen sich zwei Elemente die id loaf, liefert der Aufruf trotzdem nur das erste im Dokument.
Klassenname und Tag-Name
Beide Aufrufe liefern eine lebendige HTMLCollection. Lies length, bevor du einen einzelnen Zettel nimmst. Zähle am Regal mit vier Elementen, nicht in der Lesedatei.
console.log(document.getElementsByClassName("tag").length);
console.log(document.getElementsByTagName("p").length);
console.log(document.getElementsByClassName("sold").length);
Die Zeilen sind 3, 3 und 1. Drei Zettel teilen tag. Alle drei sind p-Elemente, die Überschrift ist ein h2, also trifft die Tag-Zahl auf diesem Regal die Klassenzahl. Nur Evening hat sold. getElementsByClassName(".tag") ist ein anderer Aufruf: der Punkt gehört nicht zum Klassennamen, die Länge ist 0.
Der erste CSS-Treffer
querySelector liefert ein Element, das erste in Dokumentreihenfolge, oder null.
console.log(document.querySelector(".tag").textContent);
console.log(document.querySelector("#shelf .sold").textContent);
Die erste Zeile ist Morning. Die zweite ist Evening. #shelf .sold meint ein Element mit der Klasse sold im Regal, nicht das Regal selbst. document.getElementById("shelf").querySelector(".sold") beginnt am Regal und landet auf demselben Zettel Evening.
Jeder Treffer, dann ein Index
querySelectorAll liefert jeden Treffer in einer statischen NodeList. Die Liste darf leer sein. Sie ist nicht null.
let tags = document.querySelectorAll(".tag");
console.log(tags.length);
console.log(tags[1].textContent);
Die Länge ist 3. Index 1 ist Noon. Index 0 ist Morning, Index 2 ist Evening. Diese Liste wächst nicht, wenn ein späteres Skript einen Zettel anhängt. Die HTMLCollection von getElementsByClassName("tag") würde wachsen. Eine ist eine Momentaufnahme, die andere bleibt lebendig.
Ein Name, den das Regal nie schrieb
Frage nach einer id und einer Klasse, die nicht in der Datei stehen.
console.log(document.getElementById("oven"));
console.log(document.querySelector(".oven"));
console.log(document.querySelectorAll(".oven").length);
Die erste Zeile ist null. Die zweite ist null. Die dritte ist 0. querySelectorAll liefert auch dann eine Liste, wenn nichts passt. Du liest die Länge 0, und die Liste selbst ist nicht null. getElementById hat keine Liste, also ist ein Fehltreffer null, nicht 0.
Eine Zeile auf der Seite
Ein Absatz meldet, wie viele tag-Zettel es gibt, den ersten Zettel und den Zettel sold. Das Skript steht am Ende von body, nachdem die Elemente da sind. Die Zeile hat keine Klasse tag und gehört nicht zu den dreien.
<!DOCTYPE html>
<html>
<head>
<title>selecting — page</title>
</head>
<body>
<main id="shelf">
<h2 id="loaf">Rye</h2>
<p class="tag">Morning</p>
<p class="tag">Noon</p>
<p class="tag sold">Evening</p>
<p id="line">…</p>
</main>
<script>
let tags = document.querySelectorAll(".tag");
let line = document.getElementById("line");
line.textContent = tags.length + " / " + tags[0].textContent + " / " + document.querySelector(".sold").textContent;
</script>
</body>
</html>
Der Absatz zeigt 3 / Morning / Evening. In dieser Datei zählt getElementsByTagName("p") die Zahl 4, weil die Zeile ein weiteres p ist. querySelectorAll(".tag") zählt weiter 3. Die nächste Seite ändert das HTML der Elemente, die diese Aufrufe schon gefunden haben.
Das Regal prüfen
- Logge den Überschrifttext und erwarte Rye, dann die null-Prüfung und erwarte false
- Logge Klassenlänge,
p-Länge und sold-Länge: 3, 3 und 1 - Logge den Text des ersten
.tagund erwarte Morning, dann#shelf .soldund erwarte Evening - Logge die Länge von
querySelectorAllund erwarte 3, dann Index 1 und erwarte Noon - Logge die fehlende id und das fehlende
querySelectorund erwarte beide Male null - Logge
querySelectorAll(".oven").lengthund erwarte 0 - Lies den Absatz und erwarte 3 / Morning / Evening
Falscher Aufruf
Die Seite bleibt offen. Der Aufruf, den du geschrieben hast, hat etwas anderes verlangt.
.tagangetElementsByClassNamegeben; der Punkt gehört nur in einen CSS-Selektortagohne Punkt anquerySelectorgeben und die Zettel erwarten- Index 1 als ersten Zettel lesen
- Einen Fehltreffer von
querySelectorAllalsnullnehmen statt als Länge 0 - Einen Fehltreffer von
getElementByIdals Liste der Länge 0 nehmen getElementsByTagName("p")in der Lesedatei zählen und 3 erwarten.mapauf derHTMLCollectionaufrufen; das ist kein Array- Auf dieser Seite
parentElementlesen; das war die Baum-Seite
Das nimmst du mit
getElementByIdliefert ein Element odernullgetElementsByClassNameundgetElementsByTagNameliefern eine lebendigeHTMLCollection- Die Klassenmethode will
tag, nicht.tag querySelectorliefert den ersten CSS-Treffer odernullquerySelectorAllliefert eine statischeNodeList; ein Fehltreffer hat die Länge 0- Index 0 ist Morning und Index 1 ist Noon
- Die nächste Seite ändert HTML an Elementen, die du schon ausgewählt hast
🧠 Testen Sie Ihr Wissen
Testen Sie Ihr Wissen
Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen
📝 Anweisungen
- Lesen Sie jede Frage sorgfältig
- Wählen Sie die beste Antwort für jede Frage
- Sie können das Quiz so oft wiederholen, wie Sie möchten
- Ihr Fortschritt wird oben angezeigt