Crear y eliminar nodos en el DOM con JavaScript.
Dominar la creación y eliminación de nodos en el DOM es una de las habilidades más poderosas para cualquier desarrollador web. Entender cómo generar, modificar o eliminar elementos dinámicamente te permitirá construir interfaces interactivas y eficientes. En este artículo vas a aprender paso a paso cómo hacerlo como un profesional, con ejemplos claros y prácticos.

Índice
1. ¿Qué significa crear y eliminar nodos del dom con javascript?
Crear y eliminar nodos del DOM (Document Object Model) con JavaScript significa modificar dinámicamente la estructura, el contenido o la presentación de una página web después de que ha sido cargada por el navegador.
Es la base para hacer que una página sea interactiva y reactiva.
1.1. ¿Qué es un Nodo?
En el contexto del DOM, un nodo es la unidad más básica del árbol que representa tu página HTML. Todo en el HTML es un nodo:
- Nodos elemento: Son las etiquetas HTML, como
<div>,<p>,<img>,<a>. Estos son los nodos que normalmente creamos y eliminamos. - Nodos de texto: Es el texto dentro de las etiquetas (por ejemplo, el texto «Hola» dentro de un
<p>Hola</p>).
Cuando usas JavaScript para «crear» o «eliminar» un nodo, realmente estás manipulando este árbol de elementos.
1.2. Añadir contenido = Crear nodos con JavaScript
Significa generar nuevos elementos HTML o texto y colocarlos en un lugar específico de tu página web.
Cómo funciona:
- Creación en memoria: Usas un método como
document.createElement('div')para crear un nuevo nodo. En este punto, el nodo existe solo en la memoria de JavaScript y no es visible en la página. - Inserción: Usas un método como
contenedor.appendChild(nuevoDiv)ocontenedor.append(nuevoDiv)para enganchar ese nodo recién creado al árbol del DOM existente. Solo después de este paso el elemento se dibuja en la pantalla .
Ejemplo práctico: Al agregar un nuevo producto a un carrito de compras, crear una nueva publicación en una red social, o mostrar un mensaje de error.
1.3. Quitar contenido = Eliminar nodos con JavaScript
Significa remover un elemento HTML o un texto existente de la estructura del DOM, quitándolo de la vista del usuario y de la memoria del navegador.
Cómo funciona:
- Selección: Primero, obtienes una referencia al nodo que deseas eliminar (ej.
const elemento = document.querySelector('#id-del-elemento');). - Remoción: Usas el método
elemento.remove()para desengancharlo del árbol del DOM. El elemento ya no existe en la página.
EJEMPLO práctico: Cuando un usuario cierra una notificación, elimina un artículo de su lista de tareas pendientes (To-Do List), o quitas elementos de una lista para limpiarla.
2. ¿Cómo crear nodos? Paso a paso
Este proceso asegura que creas el elemento, lo preparas con contenido y atributos, y lo insertas de forma eficiente en el árbol del DOM.
2.1. PASO 1. Crear el nodo elemento (La etiqueta HTML)
Utiliza el método document.createElement() para generar un nuevo elemento en la memoria de JavaScript.
2.1.1. ¿Qué es document.createElement()?
El método document.createElement(tagName) (esto es igual a document.createElement(), solo que tagName hace referencia al elementos HTML que vamos a introducir) es la forma estándar y más fundamental de crear un Nodo Elemento (es decir, una etiqueta HTML) usando JavaScript.
Propósito:
Su función es simple: toma una cadena de texto (tagName) y devuelve una referencia al nuevo nodo de elemento recién creado.
tagName: Debe ser una cadena de texto que represente el nombre de la etiqueta HTML que quieres crear (ej.'div','p','button','a','img'). No es sensible a mayúsculas/minúsculas, pero la convención moderna es usar minúsculas.
Características clave
- Solo en memoria:
- El nodo se crea y existe únicamente dentro de la memoria de JavaScript. Aún no forma parte del árbol DOM visible y, por lo tanto, no se muestra en el navegador ni afecta el diseño de la página.
- No tiene contenido ni estilo:
- Por defecto, el elemento es un «cascarón» vacío, sin clases CSS, atributos, o contenido interno. Estos deben ser añadidos en los pasos subsiguientes.
2.1.2. Ejemplos de usos comunes de document.createElement():
Aquí tienes varios ejemplos de cómo usar document.createElement() para crear diferentes tipos de nodos:
📌EJEMPLO 1: Creando un contenedor básico (<div>)
Este es el nodo más común para organizar contenido.
// 1. Declaramos una constante para almacenar la referencia al nuevo elemento.
const nuevoContenedor = document.createElement('div');
// 2. Después de esta línea, 'nuevoContenedor' es un objeto JavaScript
// que representa <div></div>.
console.log(nuevoContenedor);
// Resultado en consola: <div></div> (un objeto Element)
Lenguaje del código: JavaScript (javascript)
- Explicación: Creamos una variable llamada
nuevoContenedorque ahora contiene el objeto DOM de undiv. Estedivestá listo para recibir clases, contenido y ser insertado en la página.
📌EJEMPLO 2: Creando un enlace interactivo (<a>)
Los elementos interactivos también se crean de la misma manera.
// 1. Creamos el elemento de anclaje (hipervínculo)
const nuevoEnlace = document.createElement('a');
// 2. Ojo: En este paso, 'nuevoEnlace' es solo <a></a>.
// Tendremos que añadir el atributo 'href' en el siguiente paso.
// Ejemplo del siguiente paso (Atributos):
nuevoEnlace.href = 'https://www.google.com';
nuevoEnlace.textContent = 'Ir a Google';
console.log(nuevoEnlace);
// Resultado en consola: <a href="https://www.google.com">Ir a Google</a>
// (aunque aún no está en el DOM real)
Lenguaje del código: JavaScript (javascript)
- Explicación: Se genera el nodo de anclaje (
<a>). Aunque aquí adelantamos la asignación dehrefytextContent(que son del Paso 2 y 3), el Paso 1 solo es la llamada adocument.createElement('a').
📌EJEMPLO 3: Creando un elemento de imagen (<img>)
Este es un ejemplo crucial ya que requiere un atributo src para funcionar.
// 1. Creamos el elemento de imagen
const nuevaImagen = document.createElement('img');
// 2. La imagen por sí sola no se mostrará hasta que le demos una fuente (src).
// Ejemplo del siguiente paso (Atributos):
nuevaImagen.src = 'ruta/a/mi/imagen.jpg';
nuevaImagen.alt = 'Descripción de la imagen';
console.log(nuevaImagen);
// Resultado en consola: <img src="ruta/a/mi/imagen.jpg" alt="Descripción de la imagen">
Lenguaje del código: JavaScript (javascript)
- Explicación: Se crea el nodo
<img>. La utilidad de la imagen depende enteramente de los atributos que le asignemos en los siguientes pasos (srcyalt).
2.1.3. Lo que devuelve document.createElement()
El valor devuelto por este método es un objeto JavaScript. Este objeto hereda propiedades y métodos que te permiten manipularlo en los pasos posteriores, tales como:
classList: Para manejar clases CSS.id: Para asignar un ID.setAttribute(): Para asignar atributos personalizados.appendChild(): Para añadir nodos hijos (texto o elementos).
En resumen, el Paso 1 es la fabricación del material base. Sin este paso, no tienes el objeto que puedas adornar y luego montar en el árbol DOM.
2.2. PASO 2: Preparar el nodo: Atributos y clases
Una vez que has creado el nodo con document.createElement(), este es un lienzo en blanco. Para que sea útil, necesitas asignarle propiedades que definan cómo se ve (CSS) y cómo funciona (atributos HTML, como id, src, href, o atributos de datos).
2.2.1. Asignándole clases (classList)
Las clases CSS son fundamentales para aplicar estilos y frameworks como Bootstrap o Tailwind. Para esto, utilizamos la propiedad classList.
AÑADIR CLASES USANDO classList y .add()
classList(El Administrador)classListes una propiedad de solo lectura de un elemento DOM que devuelve un objetoDOMTokenList.- Permite inspeccionar y modificar la lista de clases CSS que tiene un elemento sin tener que manipular directamente el string completo del atributo
class. - Proporciona una interfaz segura para manejar clases, evitando errores como sobrescribir clases existentes o introducir espacios en blanco accidentales.
.add()(La Acción).add()es un método del objetoclassList. Añade una o más clases CSS al elemento al que está asociado elclassList.- Asegura la atomicidad: Si intentas agregar una clase que el elemento ya tiene, simplemente la ignora, garantizando que no haya clases duplicadas en el DOM.
Ejemplo
Si tienes un elemento <div class="base"></div> y ejecutas:
miDiv.classList.add('activo', 'borde-rojo');Lenguaje del código: JavaScript (javascript)
Aquí; el resultado final en el DOM será: <div class="base activo borde-rojo"></div>. .add() hizo el trabajo de anexar las nuevas clases de forma limpia.
OTRAS OPERACIONES COMUNES DE classList
| Método | Propósito |
|---|---|
element.classList.remove('clase') |
Quita una clase. |
element.classList.toggle('clase') |
Alterna: si tiene la clase, la quita; si no, la añade. |
element.classList.contains('clase') |
Devuelve true si el elemento tiene la clase. |
2.2.2. Asignándole Atributos (ID, Datos y Propiedades Estándar)
Para asignar IDs, fuentes de imagen, destinos de enlace o cualquier otra propiedad HTML estándar, tienes dos caminos profesionales:
- Notación de punto
setAttribute().
1️⃣ Asignando atributos con notación de Punto (Propiedades Comunes)
Para atributos nativos de JavaScript/DOM (como id, src, href, value, textContent), la notación de punto es el método más rápido y preferido.
Ejemplo:
const nuevoInput = document.createElement('input');
const nuevoEnlace = document.createElement('a');
// 1. Asignar propiedades comunes con notación de punto.
nuevoInput.type = 'text';
nuevoInput.placeholder = 'Escribe tu nombre';
nuevoEnlace.href = 'contacto.html';
console.log(nuevoInput);
// Resultado: <input type="text" placeholder="Escribe tu nombre">
Lenguaje del código: JavaScript (javascript)
Explicación: Después de crear el <input> (paso 1), se le asignan directamente los valores a sus propiedades de objeto type y placeholder. Esto es limpio y eficiente para las propiedades más usadas.
2️⃣ASIGNANDO ATRIBUTOS CON setAttribute() (Atributos personalizados)
El método setAttribute(name, value) es esencial cuando:
- Necesitas asignar atributos personalizados (como
data-*). - El atributo HTML tiene un nombre que no coincide bien con la propiedad DOM (aunque esto es raro).
| Método | Propósito |
|---|---|
element.setAttribute(name, value) |
Asigna un valor a cualquier atributo, incluso personalizado. |
Ejemplo:
const nuevaTarjeta = document.createElement('div');
// 1. Asignar el ID (también se podría con notación de punto).
nuevaTarjeta.setAttribute('id', 'producto-401');
// 2. Asignar un atributo de datos (data-*) para manipularlo con JS o CSS.
nuevaTarjeta.setAttribute('data-estado', 'activo');
nuevaTarjeta.setAttribute('data-categoria', 'electronica');
console.log(nuevaTarjeta);
// Resultado: <div id="producto-401" data-estado="activo" data-categoria="electronica"></div>
Lenguaje del código: JavaScript (javascript)
Explicación: El div de la tarjeta necesita información específica (estado, categoría) que no tiene una propiedad nativa en el objeto div. setAttribute() permite añadir estos atributos data-* que son extremadamente útiles para manipular o filtrar elementos después con JavaScript.
2.2.3. Resumen del paso 2
Este paso garantiza que cuando el nodo se inserte en el DOM (Paso 5), ya tenga toda la información necesaria para verse correctamente (clases) y funcionar correctamente (atributos como href, src, data-id).
| Atributo | Método Recomendado | Razón |
|---|---|---|
| Clases | element.classList.add() |
El mejor método para manipular clases de forma no destructiva. |
| ID, src, href, value | .id = ... |
Más rápido y legible para las propiedades comunes. |
| data-*, atributos custom | element.setAttribute() |
Necesario para atributos no estándar o personalizados. |
2.3. PASO 3: Crear y/o añadir el contenido.
Como hemos visto, la manipulación del DOM sigue una secuencia lógica. En el Paso 1, generamos la estructura base llamando a la etiqueta HTML con document.createElement(). En el Paso 2, definimos su apariencia y funcionalidad asignando clases y atributos (class, id, data-*).
Ahora entramos en el Paso 3: Definir el Contenido. Aquí respondemos a la pregunta: ¿Qué verá el usuario dentro de estas etiquetas?
Para dotar de contenido al elemento que creamos, disponemos de tres estrategias principales:
- Contenido de texto puro (Seguro):
- Usamos el método
textContentpara asignar texto directamente - O alternativamente, creamos un nodo de texto con
document.createTextNode(). - Este es el método más seguro, ya que el navegador garantiza que el contenido se trate estrictamente como texto y no como código ejecutable.
- Usamos el método
- Contenido HTML (Rápido pero arriesgado):
- Utilizamos la propiedad
innerHTMLcuando el contenido debe incluir etiquetas HTML anidadas (ej. negritas, enlaces o saltos de línea). - Advertencia profesional: Se debe usar con cautela, ya que inyectar contenido no confiable vía
innerHTMLabre la puerta a ataques de Cross-Site Scripting (XSS).
- Utilizamos la propiedad
- Anidamiento de nodos:
- Si el contenido es complejo (ej. un formulario, un botón), volvemos a repetir el Paso 1 creando un nuevo nodo hijo.
Una vez que el contenido existe, ya sea texto puro o un nodo hijo, el desafío es montarlo dentro de nuestro elemento padre (el nodo creado en el Paso 1). Aquí es donde intervienen los métodos de inserción, siendo el más clásico elementoPadre.appendChild(contenido) y sus alternativas modernas como elementoPadre.append(contenido).
Ahora veamos cómo se desarrollan las 3 estrategias nombradas anteriormente:
2.3.1. Contenido de texto puro (El enfoque seguro)
Esta estrategia es el estándar de oro para asignar texto, especialmente cuando proviene de fuentes externas o entradas de usuario. Su principal ventaja es la seguridad, ya que previene la ejecución de código malicioso incrustado (ataques XSS).
OPCIÓN 1. document.createTextNode()
¿Qué es y para qué sirve?
- ¿Qué es? Es un método que crea un Nodo de Texto completamente nuevo, independiente de cualquier elemento HTML. Un nodo de texto es el objeto más granular del DOM que contiene el texto literal de la página.
- ¿Para qué sirve? Sirve para encapsular una cadena de texto y prepararla para ser insertada como hijo de un nodo elemento (usando
appendChild()oappend()). Es la forma más antigua y literal de crear el texto dentro del DOM.
Ejemplo:
// Paso 1: Crear el elemento padre (por ejemplo, un párrafo)
const contenedor = document.createElement('p');
// Paso 2: Crear el Nodo de Texto con el contenido
const textoLiteral = document.createTextNode('El precio final es: $199.99');
// Paso 3: Montar el Nodo de Texto dentro del elemento padre
contenedor.appendChild(textoLiteral);
console.log(contenedor.outerHTML);
// Resultado: <p>El precio final es: $199.99</p>
Lenguaje del código: JavaScript (javascript)
Explicación del código:
document.createElement('p'): Creamos el elemento contenedor (<p>).document.createTextNode(...): Creamos un objeto de tipo TextNode que almacena la cadena de texto. Este objeto existe en la memoria, pero aún no está asociado al párrafo.contenedor.appendChild(textoLiteral): Adjuntamos el TextNode como el hijo directo del elemento<p>. Esto lo hace visible en el navegador una vez que el<p>mismo es insertado en el DOM principal (Paso 5).
OPCIÓN 2. element.textContent
¿Qué es y para qué sirve?
- ¿Qué es? Es una propiedad (no un método) de la interfaz
Nodeque permite obtener o establecer el contenido textual de un nodo y de todos sus descendientes. - ¿Para qué sirve? Es el método profesional y más conciso para insertar o reemplazar contenido de texto simple dentro de un elemento. Al usarlo, internamente JavaScript maneja la creación y montaje del nodo de texto por ti.
Ejemplo:
// Paso 1: Crear el elemento padre (por ejemplo, un encabezado)
const titulo = document.createElement('h1');
// Paso 2: Asignar el contenido de texto directamente usando la propiedad textContent
titulo.textContent = 'Bienvenido a mi sitio web';
// 3. El nodo ya tiene el contenido y está listo para ser insertado en el DOM
console.log(titulo.outerHTML);
// Resultado: <h1>Bienvenido a mi sitio web</h1>
Lenguaje del código: JavaScript (javascript)
Explicación del código:
document.createElement('h1'): Creamos el elemento contenedor (<h1>).titulo.textContent = '...': Asignamos directamente la cadena de texto a la propiedadtextContent. JavaScript automáticamente crea el TextNode con ese valor y lo inserta como hijo dentro del<h1>. Es una operación atómica (en un solo paso).
Comparativa Clave y Seguridad
| Característica | document.createTextNode() |
element.textContent |
|---|---|---|
| Tipo | Método que crea un objeto de texto. | Propiedad del objeto elemento. |
| Uso (Moderno) | Menos común; se usa cuando se requiere manipulación del TextNode mismo. |
Recomendado para asignar solo texto simple por su concisión. |
| Sintaxis | Requiere dos pasos: crear y luego adjuntar (appendChild). |
Un solo paso: asignación simple (=). |
| Seguridad | Extremadamente seguro. | Extremadamente seguro. |
| Interpretación | Trata la cadena como texto plano. | Trata la cadena como texto plano. |
Tanto document.createTextNode() como textContent son seguros porque, si la cadena contiene código HTML como <strong>Texto</strong> o incluso un <script>Malicioso</script>, el navegador no lo interpreta como etiquetas, sino que lo muestra literalmente como texto en la pantalla, neutralizando cualquier riesgo de inyección de código.
Si necesitas insertar HTML (por ejemplo, quieres que el <strong> se vea en negrita), debes usar innerHTML, pero asumiendo el riesgo si la fuente no es confiable.
2.3.2. Contenido HTML (Rápido pero arriesgado) usando innerHTML:
¿Qué es innerHTML?
La propiedad innerHTML es una forma rápida y poderosa de obtener o establecer el contenido HTML (incluyendo todas las etiquetas y estructura) dentro de un elemento.
- Propósito: Permite insertar una cadena de texto que el navegador no tratará como texto simple, sino que la parseará (analizará) e interpretará como código HTML real. Esto significa que puedes inyectar elementos como
<strong>,<a>, o<span>directamente. - Funcionamiento: Cuando asignas una cadena a
elemento.innerHTML, el navegador borra cualquier contenido anterior del elemento y luego construye una nueva estructura DOM (nodos) a partir de la cadena de texto proporcionada.
¿Para qué sirve?
Sirve para los siguientes casos de uso:
- Inserción de HTML complejo: Cuando necesitas insertar una estructura HTML predefinida que sería tedioso crear nodo por nodo (
createElement()). - Vaciado rapido: Es el método más rápido para eliminar todo el contenido de un contenedor (
contenedor.innerHTML = '';).
EJEMPLO de uso de innerHTML
Vamos a crear una tarjeta de bienvenida que necesita tanto texto como formato (negritas y un salto de línea).
// Paso 1: Crear el elemento padre (contenedor de la tarjeta)
const tarjetaBienvenida = document.createElement('div');
tarjetaBienvenida.classList.add('card'); // Añadimos una clase para el estilo
// Paso 2: Definir la cadena de HTML compleja
const contenidoHTML = `
<h2>Bienvenido, Usuario</h2>
<p>Tu cuenta ha sido activada <strong>exitosamente</strong>.<br>
¡Explora nuestro sitio!</p>
`;
// Paso 3: Usar innerHTML para inyectar la cadena
tarjetaBienvenida.innerHTML = contenidoHTML;
console.log(tarjetaBienvenida.outerHTML);
// Resultado en el DOM:
<div class="card">
<h2>Bienvenido, Usuario</h2>
<p>Tu cuenta ha sido activada <strong>exitosamente</strong>.<br>
¡Explora nuestro sitio!</p>
</div>Lenguaje del código: JavaScript (javascript)
Explicación:
- Creación: Creamos un elemento
divsimple llamadotarjetaBienveniday le asignamos una clase CSS. - Definición de contenido: Definimos una variable de JavaScript que contiene una cadena de texto larga. Esta cadena no es solo texto, sino que incluye etiquetas HTML como
<h2>,<p>,<strong>y<br>. - Inyección: Al asignar esta cadena a la propiedad
innerHTMLdeldiv, le decimos al navegador: «Toma esta cadena, analízala como si fuera HTML, y construye los nodos necesarios dentro de midiv«. - Resultado: El navegador genera un nodo
<h2>, un nodo<p>, un nodo<strong>y un nodo<br>dentro deldivprincipal. Todos estos elementos se mostrarán y funcionarán según las reglas de HTML y CSS.
🚨ADEVERTENCIA: El riesgo de XSS
La razón por la que este método es «arriesgado» es la vulnerabilidad conocida como Cross-Site Scripting (XSS).
El Problema: Imagina que estás mostrando un nombre de usuario o un comentario que un atacante ha introducido en una base de datos. Si usas innerHTML y el atacante ha escrito:
HTML
Mi comentario. <script>alert('¡Soy un hacker!')</script>Lenguaje del código: HTML, XML (xml)
…al usar elemento.innerHTML = 'contenido_atacante', el navegador interpreta y ejecuta la etiqueta <script>. Esto puede llevar a robo de cookies de sesión, redirección de usuarios o modificación de la página.
LA REGLA DE ORO: Nunca uses innerHTML con contenido que provenga de una fuente no confiable (como datos introducidos por el usuario o datos de una URL externa) sin antes sanitizarlo (limpiar) rigurosamente.
Por eso, la estrategia anterior, contenido de texto puro (textContent) es siempre la recomendada si no necesitas formateo HTML, ya que garantiza la seguridad por defecto.
2.3.3. Anidamiento de nodos (Contenido compleja)
¿A qué nos referimos con «Contenido complejo»?
Nos referimos a cualquier estructura que no pueda resolverse simplemente con texto (textContent) o con una única inyección de HTML sin procesar (innerHTML).
Un contenido es complejo cuando:
- Requiere jerarquía: El elemento padre debe contener varios elementos hijos que, a su vez, pueden tener sus propios hijos (ej. un
<nav>que contiene un<ul>, que contiene múltiples<li>). - Necesita lógica individual: Cada elemento hijo necesita su propia lógica, atributos, event listeners (escuchadores de eventos), o manipulación individual.
- Prioriza la seguridad: Se necesita construir la estructura usando métodos seguros (
createElement,appendChild/append) para evitar los riesgos de XSS asociados coninnerHTML.
Un ejemplo típico de contenido complejo es un item en una lista de tareas (<li>) que contiene un checkbox (<input>), el texto de la tarea (<span>), y un botón para eliminar (<button>).
📌EJEMPLO PRÁCTICO: Anidamiento de Nodos
Vamos a crear el item de lista de tareas complejo mencionado arriba. Para lograr el anidamiento, repetimos los Pasos 1, 2 y 3 para cada elemento que forma la jerarquía.
Código de anidamiento:
// 1. CREAR EL NODO PADRE (El <li>) - Paso 1 del principal
const listItem = document.createElement('li');
listItem.classList.add('task-item'); // Paso 2: Atributo/Clase
// --- A. CREAR HIJO 1: Checkbox ---
const checkbox = document.createElement('input'); // Paso 1 del hijo
checkbox.type = 'checkbox'; // Paso 2 del hijo
checkbox.setAttribute('data-action', 'complete'); // Paso 2 del hijo
// --- B. CREAR HIJO 2: Span de Texto ---
const taskText = document.createElement('span'); // Paso 1 del hijo
taskText.textContent = 'Pagar factura de internet';// Paso 3 del hijo (seguro)
// --- C. CREAR HIJO 3: Botón de Eliminar ---
const deleteBtn = document.createElement('button'); // Paso 1 del hijo
deleteBtn.textContent = 'Eliminar'; // Paso 3 del hijo (seguro)
deleteBtn.classList.add('btn-delete'); // Paso 2 del hijo
// 2. MONTAR (ANIDAR) los hijos en el padre usando append()
listItem.append(checkbox, taskText, deleteBtn);
// El listItem ahora tiene la estructura:
// <li><input type="checkbox"><span>Pagar factura...</span><button>Eliminar</button></li>
Lenguaje del código: JavaScript (javascript)
Explicación:
- Creación del padre (
listItem):- Comenzamos con
const listItem = document.createElement('li');. Este es el contenedor principal. Le aplicamos una clase (task-item).
- Comenzamos con
- Creación y preparación de los hijos (A, B, C):
- Para el checkbox, el span y el botón, repetimos los Pasos 1 y 2. Creamos cada nodo y le asignamos sus propiedades específicas (ej.,
checkbox.type = 'checkbox',deleteBtn.textContent = 'Eliminar'). - La clave de la complejidad: Cada uno de estos hijos es un objeto DOM independiente que podríamos manipular o al que podríamos añadir un listener (ej.,
deleteBtn.addEventListener('click', deleteTask)). Esto es imposible con una simple cadenainnerHTML.
- Para el checkbox, el span y el botón, repetimos los Pasos 1 y 2. Creamos cada nodo y le asignamos sus propiedades específicas (ej.,
- Montaje del anidamiento (
listItem.append()):- La línea
listItem.append(checkbox, taskText, deleteBtn);es el paso crucial. El método modernoappend()es usado para adjuntar múltiples nodos (o cadenas de texto) como hijos, en el orden especificado, dentro dellistItem. - Una vez ejecutado, el
listItemdeja de ser un «cascarón» y pasa a tener la estructura interna deseada, lista para ser insertada en el<ul>principal (que sería el Paso 4/5 de la guía general).
- La línea
Este método garantiza la máxima seguridad y la máxima capacidad de manipulación, ya que cada componente de la estructura es un objeto DOM manejable.
2.4. PASO 4. Seleccionar el contenedor padre
2.4.1. ¿Qué significa seleccionar el contenedor padre?
Significa obtener una referencia (un puntero o un objeto JavaScript) al elemento HTML ya existente en la página dentro del cual queremos insertar nuestro nuevo nodo.
NOTA! Aquí no seleccionamos el HTML que creamos en el paso 1, sino un elemento HTML de la página web sobre la cual estamos añadiendo este contenido.
En términos del árbol DOM, es encontrar el nodo «padre» que será el dueño inmediato del nodo «hijo» que acabamos de crear y preparar.
¿Por qué lo Tenemos que Hacer?
Debes seleccionar el contenedor padre por dos razones fundamentales:
- Montaje (Enganche): Los métodos de inserción de nodos (
appendChild(),append()) no pueden funcionar si no saben dónde «enganchar» el nuevo elemento. Necesitan una referencia activa a un elemento del DOM existente para poder modificar su estructura interna. - Ubicación (Contexto): Garantiza que el nuevo elemento aparecerá en la posición lógica y visual correcta dentro de la interfaz del usuario.
2.4.2. Métodos profesionales de selección
Los métodos más comunes y eficientes para obtener esta referencia son:
| Método | Propósito | Uso |
|---|---|---|
document.getElementById(id) |
Selecciona el primer elemento que coincida con el ID dado. Es el método más rápido si conoces el ID. | document.getElementById('miId') |
document.querySelector(selector) |
Selecciona el primer elemento que coincida con cualquier selector CSS (clase, etiqueta, ID, atributo). Es el más flexible. | document.querySelector('.miClase') |
2.4.3. Ejemplo de cómo seleccionar un elemento dentro del documento HTML
Supongamos que en nuestro HTML tenemos un contenedor principal vacío donde queremos que aparezca el formulario que estamos construyendo en JavaScript:
HTML Inicial:
<body>
<h1>Mi Aplicación</h1>
<section id="main-content">
</section>
</body>Lenguaje del código: HTML, XML (xml)
Código JavaScript (Paso 4):
// Suponiendo que ya creaste y preparaste un elemento llamado 'nuevoFormulario'
const nuevoFormulario = document.createElement('form');
nuevoFormulario.id = 'form-registro';
// ... más preparación ...
// PASO 4: Seleccionar el contenedor padre del HTML de arriba
const contenedorPadre = document.querySelector('#main-content');
// 5. Inserción (Paso siguiente)
// contenedorPadre.append(nuevoFormulario);
Lenguaje del código: JavaScript (javascript)
Explicación :
- Listo para montar: Al tener esta referencia, el JavaScript está preparado para ejecutar el Paso 5 (
contenedorPadre.append(nuevoFormulario)), insertando correctamente el formulario dentro de esa sección. Sin la referenciacontenedorPadre, la inserción sería imposible. - Nodo creado: La variable
nuevoFormularioexiste en memoria, representando el<form>que construimos en los Pasos 1, 2 y 3. - Selección: Usamos
document.querySelector('#main-content'). El selector#main-contentle indica a JavaScript que busque en el DOM un elemento cuyo atributoidsea igual a"main-content". - Referencia obtenida: El resultado de la búsqueda se almacena en la variable
contenedorPadre. Esta variable ahora contiene una referencia directa y viva al objeto<section id="main-content">de la página.
2.5. PASO 5. Insertar (Montar) el nodo en el DOM
Una vez que ya creamos el elemento con el Paso 1, le dimos el estilo y funcionalidades con el Paso 2, creamos el contenido y lo insertamos al elemento HTML con el Paso 3, y que ya hemos seleccionado el elemento HTML donde lo vamos a introducir con el Paso 4, ahora queda como último paso insertarlo para que se pueda visualizar dentro del navegador web.
Para dicho fin, aquí utilizamos los siguientes métodos, que se encargan de conectar nuestro nodo listo (en memoria) al árbol DOM activo de la página:
2.5.1. Métodos clave de inserción
| Método | Posición | Uso Profesional |
|---|---|---|
parentNode.append(newNode, ...) |
Al final del padre. | El método moderno preferido. Acepta múltiples nodos y cadenas de texto, garantizando seguridad y flexibilidad. |
parentNode.prepend(newNode, ...) |
Al principio del padre. | Ideal para elementos recientes o prioritarios (ej. añadir una notificación o un nuevo ítem a una lista). |
parentNode.insertBefore(newNode, referenceNode) |
Antes de un nodo hijo específico (referenceNode). |
Se utiliza para inserciones precisas en medio de una lista de elementos existentes. |
2.5.2. Ejemplo de montaje final, usamos append()
Este ejemplo demuestra la inserción del nuevo elemento completamente construido dentro de su contenedor padre seleccionado.
// 1. Crear el elemento completo (simulando los pasos 1, 2 y 3)
const nuevoMensaje = document.createElement('p');
nuevoMensaje.classList.add('alerta-exito');
nuevoMensaje.textContent = '¡Artículo añadido correctamente!';
// 2. Seleccionar el contenedor padre (Paso 4)
const contenedorAlertas = document.querySelector('.contenedor-principal');
// 3. PASO 5: Insertar el nodo final al final del contenedor
contenedorAlertas.append(nuevoMensaje);
Lenguaje del código: JavaScript (javascript)
Explicación:
nuevoMensaje:- Representa nuestro nodo hijo (el
<p>con su clase y contenido) que creamos y está listo, pero invisible.
- Representa nuestro nodo hijo (el
contenedorAlertas:- Es la variable que contiene la referencia al elemento HTML real ya cargado en el navegador (el padre, seleccionado con
querySelector).
- Es la variable que contiene la referencia al elemento HTML real ya cargado en el navegador (el padre, seleccionado con
contenedorAlertas.append(nuevoMensaje);:- Esta es la acción de montaje. JavaScript toma el objeto
nuevoMensajey lo inserta como el último elemento hijo delcontenedorAlertas. En este instante, el navegador lo renderiza, y el mensaje de éxito se vuelve visible para el usuario.
- Esta es la acción de montaje. JavaScript toma el objeto
3. Preguntas frecuentes y resumen sobre la creación de nodos
Se usa document.createElement('etiqueta') para crear un nuevo elemento. Por ejemplo, document.createElement('div') crea un nodo <div> vacío que luego puede configurarse y añadirse al DOM.
Se utiliza appendChild() o append() para añadir un nodo como hijo de otro. Ejemplo: document.body.appendChild(nuevoDiv) agrega el elemento creado al final del <body>.
appendChild() agrega un nodo al final de la lista de hijos, mientras que insertBefore(nuevo, referencia) permite insertarlo antes de un nodo específico. Ambos mueven el nodo si ya existe en el DOM.
Para eliminar un nodo, se usa parentNode.removeChild(nodo). Por ejemplo: elemento.parentNode.removeChild(elemento) elimina el nodo elemento de su contenedor en el DOM.
Se usa cloneNode(). Si se pasa true clona también los hijos: let copia = nodo.cloneNode(true). Si se usa false, solo se clona el elemento sin su contenido interno.
Se usa parentNode.replaceChild(nuevoNodo, nodoViejo). El nodo antiguo es eliminado y reemplazado por el nuevo dentro del mismo contenedor del DOM.
Se crea con document.createTextNode('texto') y se agrega con appendChild(). Ejemplo: div.appendChild(document.createTextNode('Hola')) inserta un texto dentro del elemento div.
Una forma es usar elemento.innerHTML = ''. También se puede eliminar iterativamente con un bucle: while(element.firstChild){element.removeChild(element.firstChild);} para vaciar completamente el nodo.
Se crea con document.createDocumentFragment(). Permite construir varios nodos temporalmente sin afectar el DOM hasta que se inserta todo el fragmento, mejorando el rendimiento y evitando repintados.
