En esta publicación vamos a ver cómo podemos agregar nodos nuevos y cómo eliminarlos también.
El ejemplo se verá como esto:
Primero vamos a ingresar el siguiente código HTML:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ejemplo de DOM</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h1>Ejemplo de DOM agregar y eliminar elementos</h1>
<form action="">
<input type="text" id="input_nombre" class="form-control mb-3" placeholder="Ingresar nombre del ítem" />
<button type="submit" id="btn_agregar" class="btn btn-primary mb-3"> Agregar </button>
</form>
<ul id="ul_lista">
<!-- Acá van los ítems -->
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
crossorigin="anonymous"></script>
<script src="js/scripts.js"></script>
</body>
</html>
En resumen, tendremos algo muy parecido a la publicación pasada:
- Un campo para ingresar texto
- Un botón
- Una lista <ul> en donde al pulsar en dicho botón se agregará un elemento <li> con lo que haya ingresado el usuario
Para eso primero vamos a agregar la referencia a estos tres elementos:
const input_nombre = document.querySelector("#input_nombre");
const btn_agregar = document.querySelector("#btn_agregar");
const ul_lista = document.querySelector("#ul_lista");
preventDefault()
Antes de continuar tenemos que tener en cuenta una cosa, nosotros tenemos un formulario con un botón type submit:
<form action="">
<input type="text" id="input_nombre" class="form-control mb-3" placeholder="Ingresar nombre del ítem" />
<button type="submit" id="btn_agregar" class="btn btn-primary mb-3"> Agregar </button>
</form>
Por más que nosotros le agregásemos funcionalidad con Javascript ese formulario se enviará en el momento que el usuario pulse en el botón, recargando la página y perdiendo todo lo que había hasta ese momento.
Por tanto, para eso debemos anular el comportamiento que tiene por defecto ese elemento mediante el método preventDefault():
const agregarItem = (e) => {
e.preventDefault();
}
btn_agregar.addEventListener("click", agregarItem);
createElement() y appendChild()
El objeto document cuenta en su lista de métodos con createElement, el cual nos permite crear un elemento html de forma dinámica:
let li = document.createElement("li");
Pero para que ese elemento esté disponible dentro de nuestra página tendremos que agregarlo dentro de otro elemento:
ul_lista.appendChild(li);
Es sintesis, que vamos a crear un elemento de tipo <li> y vamos a agregarlo dentro de la lista <ul>, la que definimos con la referencia con el id ul_lista.
Vamos cambiar la función agregarItem por el siguiente código:
const agregarItem = (e) => {
//Anulamos el envío del formulario
e.preventDefault();
//Guardamos lo que ingresó el usuario por teclado.
let nombre = input_nombre.value;
//Creamos un elemento de tipo <li>
let li = document.createElement("li");
//Le insertamos texto HTML
li.innerHTML = `
${nombre}
<a href="" class="text text-danger btn_eliminar"> Eliminar </a>
`;
//Agregamos el <li> dentro del <ul>
ul_lista.appendChild(li);
}
removeChild
El proceso para eliminar un elemento de la página es similar a appendChild().
Primero debemos saber cuál es el elemento, y luego desde éste llamar a removeChild():
ul_lista.removeChild(li);
Para ejecutar esto podemos ver que al insertar el código HTML dentro del <li>, había una etiqueta <a>:
li.innerHTML = `
${nombre}
<a href="" class="text text-danger btn_eliminar"> Eliminar </a>
`;
A esa etiqueta <a> tendremos que agregarle el evento click:
//Recuperamos el elemento por su clase, es decir mediante el caracter punto (.)
li.querySelector(".btn_eliminar").addEventListener("click", (e) => {
//Anulamos el enlace.
e.preventDefault();
//Eliminamos el ítem de la lista.
ul_lista.removeChild(li);
});
Como podemos ver en el ejemplo la etiqueta <a>, no tiene id, por tanto para acceder a la misma podemos hacerlo mediante la etiqueta padre y recuperándola por su nombre de clase:
li.querySelector(".btn_eliminar")
(El punto adelante es para clases)
Otra cosa que hay que tener en cuenta es que la etiqueta <a>, también tiene un comportamiento propio que al hacer click se irá a otra página, en nuestro caso recargará la misma y perderemos todo. Por eso también debemos anular el comportamiento mediante preventDefault()
El código finalmente quedará:
const input_nombre = document.querySelector("#input_nombre");
const btn_agregar = document.querySelector("#btn_agregar");
const ul_lista = document.querySelector("#ul_lista");
const agregarItem = (e) => {
//Anulamos el envío del formulario
e.preventDefault();
//Guardamos lo que ingresó el usuario por teclado.
let nombre = input_nombre.value;
//Creamos un elemento de tipo <li>
let li = document.createElement("li");
//Le insertamos texto HTML
li.innerHTML = `
${nombre}
<a href="" class="text text-danger btn_eliminar"> Eliminar </a>
`;
//Agregamos el <li> dentro del <ul>
ul_lista.appendChild(li);
//Recuperamos el elemento por su clase, es decir mediante el caracter punto (.)
li.querySelector(".btn_eliminar").addEventListener("click", (e) => {
//Anulamos el enlace.
e.preventDefault();
//Eliminamos el ítem de la lista.
ul_lista.removeChild(li);
});
}
btn_agregar.addEventListener("click", agregarItem);