Elemente erzeugen
An der Korkwand in der Küche steckt schon ein Zettel: milk. Die Liste ist #board. Der Zettel ist ein li mit der id milk. Das Markup steht in einer Zeile, also gibt es keinen leeren Textknoten vom Zeilenumbruch.
Du willst tea, bread und eggs dazu. Bau das Tag nicht aus einem String. document.createElement("li") liefert ein neues li, das noch nicht im Dokument ist. parentElement ist null. document.body.contains ist false. board.children.length bleibt 1, weil nur milk an der Wand hängt.
textContent = "tea" schreibt das Wort auf dieses Objekt. Eingehängt ist es damit noch nicht.
board.append(tea) setzt es ans Ende. Das Ergebnis des Aufrufs ist undefined. Den Knoten gibt append nicht zurück. appendChild gibt denselben Knoten zurück; diese Seite nimmt append. prepend setzt bread an den Anfang. insertBefore(eggs, milk) setzt eggs direkt vor milk, und milk ist schon ein Kind der Wand. Die Reihenfolge ist bread, eggs, milk, tea. children.length wird 4.
Ein Nebenversuch nur an der frischen Wand: createTextNode("salt"). Das ist ein Textknoten, kein li. Hängst du ihn an, bleibt children.length bei 1. childNodes.length geht von 1 auf 2. nodeType ist 3. Das letzte Element ist weiter milk. Die Seitendemo hängt salt nicht an.
Die Zeile unter der Wand lautet bread / eggs / milk / 4. tea steht in der Liste, nicht in dieser Zeile. Die 4 ist die Elementzahl. Der Text milk bleibt milk. Eine CSS-Eigenschaft setzt du hier nicht.
Neue Knoten, kein neuer Anstrich
Die vorige Seite schrieb style, setProperty, classList und cssText auf einen Farbchip. Sie hat keinen Knoten erzeugt. Die Seite davor änderte Wörter mit textContent, innerHTML und insertAdjacentHTML. Hier weist du style nichts zu, du zerlegst keinen HTML-String, und du schreibst das Wort milk nicht um. getElementById gibt dir nur die Wand und den milk-Eintrag. Die neuen Zeilen kommen von createElement.
Wo jeder neue Knoten landet
Die Wand beginnt mit einem li: milk. Lies die Zeilen der Reihe nach. Die salt-Zeile ist ein Nebenversuch an dieser frischen Wand, bevor tea, bread und eggs existieren. Die Seitendemo stoppt bei insertBefore und hängt salt nicht an.
📊 Wo jeder neue Knoten landet
| Aufruf | Wo der neue Knoten sitzt | Elementkinder | Leicht verwechselt |
|---|---|---|---|
createElement("li") |
nirgends; parentElement ist null |
weiter 1, milk | der Eintrag sei schon an der Wand |
textContent = "tea" |
immer noch nirgends | weiter 1 | das Wort selbst füge ein li ein |
append(tea) |
zuletzt; Ergebnis ist undefined |
2: milk, dann tea | append gebe den Knoten zurück |
prepend(bread) |
zuerst | 3: bread, milk, tea | prepend mit append tauschen |
insertBefore(eggs, milk) |
direkt vor milk | 4: bread, eggs, milk, tea | eine Referenz, die kein Kind der Wand ist |
append(createTextNode("salt")) an der frischen Wand |
Textknoten nach milk, kein li |
weiter 1 | children.length werde 2 |
createElement baut den Knoten im Speicher. Die Wand ändert sich erst, wenn eine Methode ihn platziert. children zählt nur Elementkinder. Ein Textknoten steckt in childNodes und nicht in children. append und prepend liefern undefined. appendChild liefert den Knoten, den du übergibst. append nimmt einen Knoten oder einen String; ein String wird ein Textknoten. appendChild nimmt einen Knoten, ein String wirft. insertBefore braucht eine Referenz, die schon Kind dieses Elternteils ist. Übergib null, dann geht der Knoten ans Ende, dieselbe Idee wie append. Diese Seite übergibt milk, nicht null. Hängst du einen Knoten an, der schon an der Wand hängt, wird er verschoben. Kopiert wird er nicht.
Das neue li hängt noch nicht
Die Datei öffnet mit der einzeiligen Liste. Erzeugt ist noch nichts. Die ersten vier Ausgaben fragen den neuen Knoten und die Wand, vor jedem Text und vor jedem Einhängen.
let board = document.getElementById("board");
let tea = document.createElement("li");
console.log(tea.parentElement);
console.log(document.body.contains(tea));
console.log(board.children.length);
console.log(tea.textContent);
Die Ausgaben sind null, false, 1 und ein leerer String. Der Browser hat ein echtes li-Objekt. Es hat kein Elternteil. Das einzige Elementkind ist weiter milk. Das Wort milk gehört zu diesem alten Eintrag, nicht zum neuen.
Das Wort tea hängt ihn noch nicht ein
textContent ersetzt den Text in dem Knoten, den du schon hältst. Das ist keine Einfügemethode. Die Kindliste der Wand wächst nicht.
let board = document.getElementById("board");
let tea = document.createElement("li");
tea.textContent = "tea";
console.log(tea.textContent);
console.log(document.body.contains(tea));
console.log(board.children.length);
Die Ausgaben sind tea, false und 1. Du liest das Wort vom Objekt. Die Seite zeigt weiter nur milk. contains ist false, weil der Knoten nicht unter dem Dokument liegt.
append setzt tea ans Ende
append hängt den Knoten als letztes Kind an. Die Variable fromAppend hält das Aufrufergebnis, und das ist undefined, nicht das li. Danach ist parentElement die Wand, und der Text des letzten Elements ist tea. Die Folge ist milk, dann tea.
let board = document.getElementById("board");
let tea = document.createElement("li");
tea.textContent = "tea";
let fromAppend = board.append(tea);
console.log(fromAppend);
console.log(tea.parentElement === board);
console.log(board.lastElementChild.textContent);
console.log(board.children.length);
Die Ausgaben sind undefined, true, tea und 2. appendChild(tea) hätte denselben Knoten geloggt. Dieses Stück ruft appendChild nicht auf. milk ist weiter das erste Elementkind.
prepend und insertBefore setzen die Folge
Dieses Stück startet wieder an der Originalwand und platziert dreimal. prepend läuft, nachdem tea schon letzte ist, also wird bread das erste Kind. insertBefore(eggs, milk) nimmt milk als Referenz, also sitzt eggs zwischen bread und milk. Die vier Texte sind bread, eggs, milk, tea.
let board = document.getElementById("board");
let milk = document.getElementById("milk");
let tea = document.createElement("li");
tea.textContent = "tea";
board.append(tea);
let bread = document.createElement("li");
bread.textContent = "bread";
board.prepend(bread);
let eggs = document.createElement("li");
eggs.textContent = "eggs";
board.insertBefore(eggs, milk);
console.log(board.children[0].textContent);
console.log(board.children[1].textContent);
console.log(board.children[2].textContent);
console.log(board.children[3].textContent);
Die Ausgaben sind bread, eggs, milk und tea. children.length ist 4. Index 1 ist eggs, nicht milk. milk rutscht von Index 0 auf Index 2, weil zwei Einträge davor liegen. Der Text von milk ist weiter das Wort milk.
Ein Textknoten kommt nicht in children
Führ diesen Block an der frischen Wand aus, der originalen Einzeilenliste, nicht nach dem Seitenskript. createTextNode baut einen Textknoten. nodeType 3 heißt Text. nodeType 1 hieße Element. children ignoriert ihn, die Länge bleibt 1. childNodes zählt ihn, die Länge geht von 1 auf 2. Das letzte Element ist weiter der milk-Eintrag. Du kannst das Wort salt in der Liste sehen, und es ist trotzdem kein li.
let board = document.getElementById("board");
let salt = document.createTextNode("salt");
board.append(salt);
console.log(salt.nodeType);
console.log(board.children.length);
console.log(board.childNodes.length);
console.log(board.lastElementChild.id);
Die Ausgaben sind 3, 1, 2 und milk. Ein String an append, etwa board.append("salt"), wird ebenfalls ein Textknoten. Kein li. Die Seitendemo weiter unten enthält diese Zeile nicht.
Eine Zeile unter der Wand
Das Skript steht am Ende von body, nachdem die Liste da ist. Es hängt tea an, setzt bread nach vorn und fügt eggs vor milk ein. salt entsteht nicht. Es schreibt Index 0, 1 und 2 und die Elementzahl. Den vierten Text, tea, schreibt es nicht.
<!DOCTYPE html>
<html>
<head>
<title>create elements — page</title>
</head>
<body>
<ul id="board"><li id="milk">milk</li></ul>
<p id="line">…</p>
<script>
let board = document.getElementById("board");
let milk = document.getElementById("milk");
let tea = document.createElement("li");
tea.textContent = "tea";
board.append(tea);
let bread = document.createElement("li");
bread.textContent = "bread";
board.prepend(bread);
let eggs = document.createElement("li");
eggs.textContent = "eggs";
board.insertBefore(eggs, milk);
document.getElementById("line").textContent =
board.children[0].textContent + " / " +
board.children[1].textContent + " / " +
board.children[2].textContent + " / " +
board.children.length;
</script>
</body>
</html>
Die Zeile lautet bread / eggs / milk / 4. Die Liste selbst ist bread, eggs, milk, tea. Die Zeile stoppt beim dritten Eintrag und nennt dann die Länge, also ist tea nicht das letzte Stück und das letzte Stück kein Wort. salt fehlt. Der Text des milk-Eintrags bleibt milk. Die nächste Seite sind Ereignisse. Sie baut diese Knoten nicht noch einmal anders.
Prüf die Wand
- Erzeuge das
liund liesparentElement,document.body.contains,children.lengthundtextContent. Die Werte sind null, false, 1 und ein leerer String. - Setze den Text auf tea und lies Text, contains und die Länge. Die Werte sind tea, false und 1.
- Hänge tea an und lies das Aufrufergebnis, ob der Elternteil die Wand ist, den Text des letzten Elements und die Länge. Die Werte sind undefined, true, tea und 2. Dann führ das Reihenfolge-Stück aus und lies bread, eggs, milk, tea.
- An der frischen Wand hänge den salt-Textknoten an und lies
nodeType,children.length,childNodes.lengthund die id des letzten Elements. Die Werte sind 3, 1, 2 und milk. Die Seitenzeile: bread / eggs / milk / 4.
Stolperstellen an dieser Wand
Die Liste öffnet weiter mit milk. Der Aufruf war die falsche Art einzufügen.
- Erwarten, dass
createElement("li")tea sofort an der Wand zeigt - Erwarten, dass
textContent = "tea"children.lengtherhöht - Erwarten, dass
appenddaslizurückgibt; das tutappendChild - Einen String an
appendChildgeben; ein String gehört zuappendund wird dort ein Textknoten insertBeforemit einer Referenz aufrufen, die kein Kind der Wand ist- Den salt-Textknoten in
childrenmitzählen - Die neue Zeile mit
innerHTMLbauen; die HTML-ändern-Seite hat Markup zerlegt - Hier
style.colorsetzen; die vorige Seite schrieb CSS - Die Zeile als bread / eggs / milk / tea lesen
- Hier
removeodercloneNodeaufrufen; diese Seite fügt nur die drei Einträge hinzu
Nimm das mit
createElement("li")baut einen losgelösten Eintrag,parentElementist null undchildren.lengthbleibt 1textContent = "tea"schreibt das Wort und lässt den Knoten von der Wandappend(tea)setzt tea ans Ende, das Aufrufergebnis ist undefinedprepend(bread)undinsertBefore(eggs, milk)ergeben die Folge bread, eggs, milk, teacreateTextNode("salt")an der frischen Wand lässtchildren.lengthbei 1 und meldetnodeType3- Die Zeile lautet bread / eggs / milk / 4, und der Text milk bleibt milk
🧠 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