Manipulación HTML
En la lección anterior aprendimos a utilizar JavaScript para seleccionar y crear elementos HTML.
Ahora vamos a aprender a modificar esos elementos de una forma mucho más completa, no solo utilizando textContent.
Con JavaScript podemos cambiar:
- El contenido de un elemento.
- El HTML que contiene.
- Sus clases CSS.
- Sus estilos.
- Sus atributos.
textContent
Ya hemos utilizado textContent anteriormente.
Sirve para consultar o modificar el texto que contiene un elemento.
Por ejemplo:
<h1 id="titulo">
Hola
</h1>
Podemos modificarlo:
let titulo = document.querySelector("#titulo");
titulo.textContent = "Bienvenido";
Ahora veremos:
Bienvenido
textContent no interpreta HTML
Esto es importante.
Si hacemos:
titulo.textContent = "<strong>Bienvenido</strong>";
La página mostrará literalmente:
<strong>Bienvenido</strong>
No interpretará <strong> como una etiqueta HTML.
Esto ocurre porque textContent trabaja únicamente con texto.
innerHTML
innerHTML permite consultar o modificar el HTML que hay dentro de un elemento. Sigue la misma sintaxis que el textContent:
mensaje.innerHTML = "HTML de dentro";
Por ejemplo:
<div id="mensaje">
Hola
</div>
Podemos hacer:
// 1. Recuperar el elemento que queremos modificar, en este caso el <div>
let mensaje = document.querySelector("#mensaje");
// 2. Añadir contenido HTML usando innerHTML
mensaje.innerHTML = "<strong>Hola</strong>";
Ahora el navegador interpretará la etiqueta <strong>.
El resultado será:
<div id="mensaje">
<strong>Hola</strong>
</div>
Y veremos el mensaje en negrita (que es lo que significa <strong>):
Hola
Diferencia entre textContent e innerHTML
Esta es una diferencia muy importante:
elemento.textContent = "<strong>Hola</strong>";
Muestra el texto literal:
<strong>Hola</strong>
Mientras que:
elemento.innerHTML = "<strong>Hola</strong>";
muestra el texto Hola en negrita, puesto que sabe interpretar etiquetas HTML:
Hola
Añadir varios elementos con innerHTML
innerHTML también nos permite crear varios elementos de una sola vez.
Por ejemplo, tenemos nuestro <div> vacío:
<div id = "contenedor">
</div>
Y queremos conseguir:
<div id = "contenedor">
<h2>Productos</h2>
<p>Teclado</p>
<p>Ratón</p>
<p>Monitor</p>
</div>
Una manera de hacerlo es con la combinación anterior de createElement + appendChild. Pero también podemos utilizar innerHTML:
// 1. Recupero el div
let contenedor = document.querySelector("#contenedor");
// 2. Añado su contenido html con innerHTML escribiendo etiquetas html literalmente
contenedor.innerHTML = `
<h2>Productos</h2>
<p>Teclado</p>
<p>Ratón</p>
<p>Monitor</p>
`;
El HTML generado será:
<div id="contenedor">
<h2>Productos</h2>
<p>Teclado</p>
<p>Ratón</p>
<p>Monitor</p>
</div>
Esto puede resultar muy cómodo cuando necesitamos insertar una estructura HTML completa.
innerHTML y variables
Podemos combinar innerHTML con template literals (${variable}).
Por ejemplo:
// 0. Tenemos la información guardada en variables
let nombre = "Maria";
let edad = 25;
// 1. Recuperamos el div
let contenedor = document.querySelector("#contenedor");
// 2. Añadimos contenido html usando las variables anteriores
contenedor.innerHTML = `
<h2>${nombre}</h2>
<p>Edad: ${edad}</p>
`;
El resultado será:
<div id="contenedor">
<h2>Maria</h2>
<p>Edad: 25</p>
</div>
Esto resulta especialmente útil cuando tenemos datos almacenados en variables, arrays u objetos y queremos mostrarlos en una página.
classList
Las clases CSS permiten definir cómo se muestra un elemento (su estilo, color, tamaño...). Con classList podemos modificar el CSS.
Por ejemplo:
<p class="importante">
Este mensaje es importante
</p>
Desde JavaScript podemos añadir, eliminar o comprobar clases utilizando:
elemento.classList
Imagina que las clases son como pegatinas que colocamos sobre los elementos.
Podemos poner una pegatina, quitársela o comprobar si la tiene:
.importante
classList.add()
Con el .add() podemos añadir una clase CSS al elemento.
Por ejemplo, imaginemos que tenemos un archivo .css con la siguiente clase:
.alerta {
color: orange;
}
Y queremos que nuestro <p> tenga esa clase alerta:
<p id="mensaje">Hola</p>
A través de elemento.classList.add(clase) podemos añadir la clase que queramos al elemento que queramos:
// 1. Recuperamos el <p>
let mensaje = document.querySelector("#mensaje");
// 2. Añadimos la clase "alerta" a nuestro <p>
mensaje.classList.add("alerta");
Ahora el elemento será:
<p id="mensaje" class="alerta">
Hola
</p>
classList.remove()
remove() elimina una clase:
mensaje.classList.remove("alerta");
Ahora volveríamos a tener:
<p id="mensaje">
Hola
</p>
classList.toggle()
toggle() es especialmente útil cuando queremos activar y desactivar algo.
Si la clase no existe, la añade.
Si ya existe, la elimina.
mensaje.classList.toggle("importante");
Podemos imaginarlo como un interruptor:
No tiene la clase
↓
toggle()
↓
Tiene la clase
Tiene la clase
↓
toggle()
↓
No tiene la clase
Es muy habitual utilizarlo para cosas como:
- Mostrar/ocultar elementos.
- Activar un menú.
- Cambiar un botón.
- Marcar elementos como seleccionados.
- Cambiar entre modo claro y oscuro.
classList.contains()
Permite comprobar si un elemento tiene una determinada clase. Es muy útil combinado con los if().
if (mensaje.classList.contains("alerta")) {
console.log("El mensaje es importante");
}
Devuelve:
true
si tiene la clase, o:
false
si no la tiene.
style
También podemos modificar directamente los estilos CSS de un elemento utilizando:
elemento.style
Por ejemplo, imaginemos que tenemos el siguiente párrafo:
<p id="mensaje">
Hola
</p>
Y no tenemos ninguna clase css ya preparada para colorearlo de rojo. Con style podemos añadir css directamente.
La sintaxis siempre será:
elemento.style.propiedadCSS = valor;
Por ejemplo, podemos cambiar el color:
// 1. Recuperamos el elemento
let mensaje = document.querySelector("#mensaje");
// 2. Establecemos la propiedad CSS color a rojo
mensaje.style.color = "red";
Ahora el texto aparecerá en rojo.
Modificar varios estilos
Podemos modificar diferentes propiedades siempre con el style.propiedad:
mensaje.style.color = "blue";
mensaje.style.backgroundColor = "yellow";
mensaje.style.fontSize = "24px";
El resultado será un elemento con:
Texto azul
Fondo amarillo
Tamaño de 24px
Nombres de propiedades CSS
Hay que tener en cuenta que algunas propiedades CSS utilizan guiones:
background-color
font-size
border-radius
En JavaScript escribiremos esas propiedades utilizando camelCase:
elemento.style.backgroundColor = "yellow";
elemento.style.fontSize = "24px";
elemento.style.borderRadius = "10px";
Por ejemplo:
CSS JavaScript
background-color → backgroundColor
font-size → fontSize
border-radius → borderRadius
margin-top → marginTop
Modificar atributos
Los elementos HTML pueden tener atributos.
Por ejemplo:
<img id="foto" src="imagen1.jpg" alt="Una imagen">
En este caso:
id
src
alt
son atributos.
JavaScript permite consultar, modificar, añadir y eliminar estos atributos.
getAttribute()
Podemos consultar el valor de un atributo utilizando la sintaxis:
elemento.getAttribute("atributo")
Por ejemplo, imaginemos que tenemos una imagen y queremos consultar el valor que hay en el atributo src:
// 1. Recuperamos el elemento de la imagen
let imagen = document.querySelector("#foto");
// 2. Mostramos el atributo src
console.log(imagen.getAttribute("src"));
Si tenemos:
<img id="foto" src="imagen1.jpg">
obtendremos:
imagen1.jpg
setAttribute()
Con getAttribute() simplemente consultamos el valor del atributo. Pero también podemos modificar el atributo utilizando:
elemento.setAttribute("atributo", "nuevo valor")
Por ejemplo, el siguiente código cambiaría el src de la imagen a "imagen2.jpg":
imagen.setAttribute("src", "imagen2.jpg");
Ahora el HTML será:
<img id="foto" src="imagen2.jpg">
Esto puede ser útil, por ejemplo, para cambiar una imagen dinámicamente.
removeAttribute()
También podemos eliminar un atributo.
Por ejemplo:
imagen.removeAttribute("alt");
Esto eliminará el atributo alt del elemento.
Atributos comunes
Algunos de los atributos que encontraremos con frecuencia son:
id
class
src
alt
href
value
disabled
title
Por ejemplo, un enlace:
<a id="enlace" href="https://ejemplo.com">
Visitar página
</a>
Podemos cambiar su destino:
let enlace = document.querySelector("#enlace");
enlace.setAttribute("href", "https://google.com");
Atributos como propiedades
Algunos atributos comunes también pueden modificarse directamente como propiedades.
Por ejemplo, en una imagen, no es necesario modificar el src utilizando:
imagen.setAttribute("src", "nueva-imagen.jpg");
Existe un "atajo" para acceder directamente:
imagen.src = "nueva-imagen.jpg";
En un enlace:
enlace.href = "https://google.com";
En un campo de texto:
input.value = "Hola";
En un botón:
boton.disabled = true;
Por ejemplo:
<button id="boton">
Enviar
</button>
Podemos desactivarlo:
let boton = document.querySelector("#boton");
boton.disabled = true;
Ahora el usuario no podrá pulsarlo.
Todos estos atributos son tan comunes que JavaScript tiene una propiedad para acceder a ellos sin necesidad de utilizar getAttribute() o setAttribute() etc. Todos los "atajos" siguen la misma estructura que vimos con el textContent:
elemento.propiedad = nuevo valor;
imagen.src = "nueva.jpg";
enlace.href = "hola.es";
parrafo.textContent = "Nuevo contenido";
Ejemplo completo
Vamos a combinar todo lo aprendido.
Tenemos una tarjeta de producto, donde:
- Todo se engloba dentro de un
div. - Hay un
h2que pone "Teclado". - Hay un
pque pone "40 €". - Hau una imagen.
<div id="producto">
<h2 id="nombre">Teclado</h2>
<p id="precio">40 €</p>
<img
id="imagen"
src="teclado.jpg"
alt="Teclado"
>
</div>
Ten en cuenta que vamos a utilizar indistintamente
querySelector()ogetElementById().
a. Modificar el nombre del producto a "Teclado mecánico":
// 1. Recuperamos el elemento que guarda el nombre
let nombre = document.querySelector("#nombre");
// 2. Cambiamos su contenido a "Teclado mecánico"
nombre.textContent = "Teclado mecánico";
b. Cambiar el precio a 50 €:
// 1. Recuperamos el elemento que guarda el precio
let precio = document.getElementById("precio");
// 2. Cambiamos su contenido a "50 €"
precio.textContent = "50 €";
c. Cambiar la imagen por teclado-mecanico.jpg:
// 1. Recuperamos el elemento de la imagen
let imagen = document.querySelector("img");
// 2. Cambiamos al atributo src
imagen.setAttribute("src", "teclado-mecanico.jpg");
// o así:
imagen.src = "teclado-mecanico.jpg";
d. Añadir al nombre la clase CSS "destacado"
nombre.classList.add("destacado");
e. Modificar el estilo del precio para que aparezca en rojo:
precio.style.color = "red";
Hemos utilizado diferentes herramientas para modificar diferentes partes del elemento.
Resumen
Es importante no utilizar siempre la misma herramienta.
textContent
Cuando queremos trabajar únicamente con texto.
elemento.textContent = "Hola";
innerHTML
Cuando queremos insertar HTML.
elemento.innerHTML = "<strong>Hola</strong>";
classList
Cuando queremos añadir, eliminar o comprobar clases CSS.
elemento.classList.add("activo");
style
Cuando queremos modificar directamente un estilo.
elemento.style.color = "red";
getAttribute()
Para consultar un atributo.
elemento.getAttribute("src");
setAttribute()
Para modificar o añadir un atributo.
elemento.setAttribute("src", "foto.jpg");
removeAttribute()
Para eliminar un atributo.
elemento.removeAttribute("disabled");
JavaScript permite modificar prácticamente cualquier parte de un elemento HTML.
Elemento HTML
│
┌────────────┼────────────┐
↓ ↓ ↓
Contenido Clases Atributos
│ │ │
↓ ↓ ↓
textContent classList getAttribute
innerHTML setAttribute
removeAttribute
│
↓
style
La idea principal es que primero seleccionamos un elemento y después decidimos qué queremos modificar.
Seleccionar
↓
Modificar contenido, clases, estilos o atributos
↓
La página cambia
Ejemplos resueltos
Ejercicio resuelto 1 - Cambiar un mensaje
Enunciado
Tenemos:
<p id="mensaje">
Cargando...
</p>
Cambia el mensaje por:
Datos cargados correctamente.
Solución
let mensaje = document.querySelector("#mensaje");
mensaje.textContent = "Datos cargados correctamente.";
Ejercicio resuelto 2 - Cambiar HTML
Enunciado
Tenemos:
<div id="resultado"></div>
Utiliza innerHTML para mostrar un título y un párrafo.
Solución
let resultado = document.querySelector("#resultado");
resultado.innerHTML = `
<h2>Resultado</h2>
<p>La operación se ha realizado correctamente.</p>
`;
Ejercicio resuelto 3 - Activar una clase
Enunciado
Tenemos:
<p id="mensaje">
Mensaje importante
</p>
Añade mediante JavaScript la clase importante.
Solución
let mensaje = document.querySelector("#mensaje");
mensaje.classList.add("importante");
Ejercicio resuelto 4 - Cambiar un atributo
Enunciado
Tenemos:
<img id="imagen" src="foto1.jpg">
Cambia la imagen para que utilice foto2.jpg.
Solución
let imagen = document.querySelector("#imagen");
imagen.setAttribute("src", "foto2.jpg");
Ejercicio resuelto 5 - Modificar un producto
Enunciado
Tenemos:
<div id="producto">
<h2 id="nombre">Teclado</h2>
<p id="precio">30 €</p>
</div>
Utiliza JavaScript para:
- Cambiar el nombre a
"Teclado mecánico". - Cambiar el precio a
"50 €". - Cambiar el color del precio a rojo.
Solución
let nombre = document.querySelector("#nombre");
let precio = document.querySelector("#precio");
nombre.textContent = "Teclado mecánico";
precio.textContent = "50 €";
precio.style.color = "red";