Crear elementos
En el corcho de la cocina ya hay una nota: milk. La lista es #board. Esa nota es un li con id milk. El marcado va en una sola línea, así que no hay un nodo de texto vacío por un salto de línea.
Quieres añadir tea, bread y eggs. No armes la etiqueta con una cadena. document.createElement("li") te da un li nuevo que todavía no está en el documento. parentElement es null. document.body.contains es false. board.children.length sigue en 1, porque solo está milk.
textContent = "tea" escribe la palabra en ese objeto. No lo cuelga de la página.
board.append(tea) lo pone al final. El resultado de la llamada es undefined. No te devuelve el nodo. appendChild sí te devuelve ese nodo; esta página usa append. prepend pone el pan al principio. insertBefore(eggs, milk) coloca los huevos justo antes de milk, y milk ya es hijo del tablero. El orden queda bread, eggs, milk, tea. children.length pasa a 4.
Un ensayo aparte, solo en el tablero intacto: createTextNode("salt"). Eso es un nodo de texto, no un li. Si lo anexas, children.length se queda en 1. childNodes.length pasa de 1 a 2. nodeType es 3. El último elemento sigue siendo milk. La demo de la página no anexa la sal.
La línea bajo el tablero dice bread / eggs / milk / 4. tea está en la lista, no en esa línea. El 4 es la cuenta de elementos. El texto milk sigue siendo milk. Aquí no tocas ninguna propiedad CSS.
Nodos nuevos, no otra capa de pintura
La página anterior escribió style, setProperty, classList y cssText en una muestra de pintura. No creó ningún nodo. La de antes cambió palabras con textContent, innerHTML e insertAdjacentHTML. Aquí no asignas style, no analizas una cadena HTML y no reescribes la palabra milk. getElementById solo te da el tablero y la nota milk. Las filas nuevas salen de createElement.
Dónde cae cada nodo nuevo
El tablero empieza con un li: milk. Lee las filas en orden. La fila de la sal es un ensayo en ese tablero intacto, antes de que existan tea, bread y eggs. La demo se detiene en insertBefore y no anexa la sal.
📊 Dónde cae cada nodo nuevo
| Llamada | Dónde queda el nodo | Hijos elemento | Confusión fácil |
|---|---|---|---|
createElement("li") |
en ningún sitio; parentElement es null |
sigue 1, milk | creer que ya está en el tablero |
textContent = "tea" |
sigue en ningún sitio | sigue 1 | creer que la palabra inserta un li |
append(tea) |
al final; el resultado es undefined |
2: milk, luego tea | esperar que append devuelva el nodo |
prepend(bread) |
al principio | 3: bread, milk, tea | cambiar prepend por append |
insertBefore(eggs, milk) |
justo antes de milk | 4: bread, eggs, milk, tea | una referencia que no es hija del tablero |
append(createTextNode("salt")) en el tablero intacto |
nodo de texto tras milk, no un li |
sigue 1 | que children.length pase a 2 |
createElement construye el nodo en memoria. El tablero no cambia hasta que un método lo coloca. children cuenta solo hijos elemento. Un nodo de texto está en childNodes y no en children. append y prepend devuelven undefined. appendChild devuelve el nodo que le pasas. append acepta un nodo o una cadena; la cadena se vuelve nodo de texto. appendChild acepta un nodo, y una cadena lanza un error. insertBefore necesita una referencia que ya sea hija de ese padre. Si pasas null, el nodo va al final, la misma idea que append. Esta página pasa milk, no null. Si anexas un nodo que ya está en el tablero, se mueve. No se copia.
El li nuevo todavía no está en el tablero
El archivo abre con la lista de una línea. Aún no has creado nada. Las cuatro lecturas preguntan por el nodo nuevo y por el tablero, antes del texto y antes de colgarlo.
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);
Las salidas son null, false, 1 y una cadena vacía. El navegador tiene un objeto li de verdad. No tiene padre. El único hijo elemento sigue siendo milk. La palabra milk es de esa nota vieja, no de la nueva.
La palabra tea todavía no lo inserta
textContent cambia el texto del nodo que ya tienes. No es un método de inserción. La lista de hijos del tablero no crece.
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);
Las salidas son tea, false y 1. Lees la palabra en el objeto. La página sigue mostrando solo milk. contains es false porque el nodo no está bajo el documento.
append deja el té al final
append añade el nodo como último hijo. La variable fromAppend guarda el resultado de la llamada, que es undefined, no el li. Después, el padre es el tablero y el texto del último elemento es tea. El orden es milk y luego 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);
Las salidas son undefined, true, tea y 2. appendChild(tea) habría mostrado ese mismo nodo. Este fragmento no llama a appendChild. milk sigue siendo el primer hijo elemento.
prepend e insertBefore fijan el orden
Este fragmento vuelve a empezar en el tablero original y coloca tres veces. prepend corre cuando tea ya está al final, así que bread queda como primer hijo. insertBefore(eggs, milk) usa milk como referencia, así que eggs queda entre bread y milk. Los cuatro textos son 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);
Las salidas son bread, eggs, milk y tea. children.length es 4. El índice 1 es eggs, no milk. milk pasa del índice 0 al 2 porque dos notas quedaron delante. El texto de milk sigue siendo la palabra milk.
Un nodo de texto no entra en children
Ejecuta este bloque en el tablero intacto, la lista original de una línea, no después del script de la página. createTextNode construye un nodo de texto. nodeType 3 significa texto. nodeType 1 sería un elemento. children lo ignora, así que la longitud sigue en 1. childNodes lo cuenta, así que esa longitud pasa de 1 a 2. El último elemento sigue siendo la nota milk. Puedes ver la palabra salt en la lista, y aun así no es un 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);
Las salidas son 3, 1, 2 y milk. Una cadena pasada a append, como board.append("salt"), también se vuelve nodo de texto. No se vuelve un li. La demo de más abajo no incluye esta línea.
Una línea bajo el tablero
El script está al final de body, cuando la lista ya existe. Anexa tea, antepone bread e inserta eggs antes de milk. No crea salt. Escribe el índice 0, el 1, el 2 y la cuenta de elementos. No escribe el cuarto texto, tea.
<!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>
La línea queda bread / eggs / milk / 4. La lista en sí es bread, eggs, milk, tea. La línea se detiene en el tercer ítem y luego da la longitud, así que tea no es el último tramo y el último tramo no es una palabra. salt no está. El texto de la nota milk sigue siendo milk. La página siguiente son los eventos. No añade otra forma de construir estos nodos.
Revisa el tablero
- Crea el
liy leeparentElement,document.body.contains,children.lengthytextContent. Los valores son null, false, 1 y una cadena vacía. - Pon el texto tea y lee el texto, contains y la longitud. Los valores son tea, false y 1.
- Anexa tea y lee el resultado de la llamada, si el padre es el tablero, el texto del último elemento y la longitud. Los valores son undefined, true, tea y 2. Luego ejecuta el fragmento del orden y lee bread, eggs, milk, tea.
- En el tablero intacto, anexa el nodo de texto sal y lee
nodeType,children.length,childNodes.lengthy el id del último elemento. Los valores son 3, 1, 2 y milk. La línea de la página: bread / eggs / milk / 4.
Tropezones de este tablero
La lista sigue abriendo con milk. La llamada fue el tipo de inserción equivocado.
- Esperar que
createElement("li")muestre tea en el tablero al momento - Esperar que
textContent = "tea"subachildren.length - Esperar que
appenddevuelva elli; eso lo haceappendChild - Pasar una cadena a
appendChild; la cadena va enappendy allí se vuelve nodo de texto - Llamar a
insertBeforecon una referencia que no es hija del tablero - Contar el nodo de texto sal dentro de
children - Armar la fila nueva con
innerHTML; la página de cambiar HTML analizaba marcado - Poner
style.coloraquí; la página anterior escribió CSS - Leer la línea como bread / eggs / milk / tea
- Llamar a
removeocloneNodeaquí; esta página solo añade las tres notas
Llévate esto
createElement("li")arma una nota suelta:parentElementes null ychildren.lengthsigue en 1textContent = "tea"escribe la palabra y deja el nodo fuera del tableroappend(tea)pone tea al final y el resultado de la llamada es undefinedprepend(bread)einsertBefore(eggs, milk)dejan el orden bread, eggs, milk, teacreateTextNode("salt")en el tablero intacto dejachildren.lengthen 1 ynodeTypeen 3- La línea queda bread / eggs / milk / 4, y el texto milk sigue siendo milk
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior