Saltar al contenido
Curso de JavaScript
Todos los cursos Ir al ejercicio →

El DOM: leer y cambiar la página

  • ⏱ 45 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Seleccionar elementos con querySelector y querySelectorAll.
  • Cambiar texto, clases, estilos y atributos de forma segura.
  • Crear, añadir y eliminar elementos desde JavaScript.
  • Evitar los errores más comunes con el DOM y el riesgo de innerHTML.

1.Qué es el DOM

Cuando el navegador lee tu HTML, construye un árbol de objetos que representa la página: el DOM (*Document Object Model*). Cada etiqueta es un nodo de ese árbol, y JavaScript puede leerlo y modificarlo; cada cambio se refleja al instante en pantalla.

El HTML y su árbol
<body>
  <h1 id="titulo">Hola</h1>
  <ul>
    <li>Uno</li>
    <li>Dos</li>
  </ul>
</body>

document
└── body
    ├── h1#titulo  →  "Hola"
    └── ul
        ├── li  →  "Uno"
        └── li  →  "Dos"

El objeto document es la puerta de entrada al DOM. Con él buscas elementos, y cada elemento es un objeto con propiedades (textContent, className…) y métodos (append(), remove()…).

📌 Nota · Los editores del curso

En esta lección cada editor tiene una Página (resultado) a la derecha. Tu script modifica esa página. Pulsa Ejecutar para volver a empezar con el HTML original.

2.Seleccionar elementos

MétodoDevuelveEjemplo
document.getElementById("id")Un elemento (o null)getElementById("titulo")
document.querySelector("css")El primer elemento que coincidequerySelector(".caja"), querySelector("ul li")
document.querySelectorAll("css")Una lista de todos los que coincidenquerySelectorAll("li")
elemento.closest("css")El ancestro más cercano que coincideboton.closest(".tarjeta")
elemento.childrenLos hijos directos

Los selectores son los mismos del curso de CSS: #id, .clase, etiqueta, ul > li, [type="email"]… Si ya dominas CSS, ya sabes seleccionar.

▶ Buscar elementos
Consola

⚠️ Importante · null si no existe

Si el selector no encuentra nada, getElementById y querySelector devuelven null, y usar null.textContent da el error *«Cannot read properties of null»*. Casi siempre es una errata en el selector o un script que se ejecuta antes de que el elemento exista (usa defer o pon el script al final).

3.Leer y cambiar el contenido

PropiedadQué haceCuándo
textContentLee o cambia el texto (sin interpretar HTML)Casi siempre. Es seguro
innerHTMLLee o cambia el HTML internoSolo con HTML propio y de confianza
valueEl valor de un input, select o textareaFormularios
outerHTMLEl HTML del elemento incluido él mismoPoco habitual
▶ textContent frente a innerHTML
Consola

⚠️ Importante · Seguridad: nunca innerHTML con datos de usuarios

Si insertas con innerHTML un texto que escribió alguien (un comentario, un nombre), esa persona puede colar código malicioso (ataque XSS). Con textContent el texto se muestra siempre como texto, sin riesgo. Regla: usa textContent por defecto, y innerHTML solo con HTML que tú escribiste.

4.Clases, estilos y atributos

▶ Modificar el aspecto
Consola
Quiero…Uso
Añadir / quitar / alternar una claseel.classList.add(), .remove(), .toggle()
Saber si tiene una claseel.classList.contains()
Un estilo concretoel.style.color = "red"
Leer / cambiar un atributogetAttribute() / setAttribute() / removeAttribute()
Guardar datos en el HTMLel.dataset.nombre (atributos data-nombre)

💡 Consejo · Cambia clases, no estilos

Mantén el aspecto en el CSS y desde JavaScript solo añade o quita clases: tarjeta.classList.toggle("activa"). Así separas las responsabilidades y tu CSS sigue mandando.

5.Crear, añadir y eliminar elementos

  1. Crea el elemento: document.createElement("li").
  2. Dale contenido y atributos: li.textContent = "…".
  3. Añádelo a la página: lista.append(li).
▶ Construir una lista
Consola
Un script que construye una lista: cada vuelta del bucle crea un <li> y lo añade a la página.
MétodoQué hace
padre.append(hijo) / prepend(hijo)Añade al final / al principio
elemento.before(x) / after(x)Inserta antes / después del elemento
elemento.remove()Elimina el elemento
elemento.replaceWith(x)Lo sustituye por otro
elemento.cloneNode(true)Crea una copia (con sus hijos)
padre.replaceChildren()Vacía el contenedor (o lo reemplaza con lo que pases)

6.Plantillas con HTML: cuándo sí usar innerHTML

Para estructuras con mucho HTML, crear cada elemento a mano es tedioso. Si los datos son tuyos (no de usuarios), puedes generar HTML con plantillas de texto:

▶ Tarjetas desde datos
Consola

⚠️ Importante · Datos propios

Esto es seguro solo porque los datos los escribimos nosotros. Si nombre viniera de un formulario o de internet, tendrías que escapar el texto o crear los elementos con createElement y textContent.

7.NodeList: una lista que no es un array

querySelectorAll devuelve una NodeList: se parece a un array (tiene length, se puede recorrer con for…of y forEach) pero no tiene map, filter ni reduce. Para usarlos, conviértela con Array.from() o el spread:

▶ De NodeList a array
Consola

8.Errores frecuentes

📒 Apuntes para llevar

  • El DOM es el árbol de objetos que representa la página; document es su punto de entrada.
  • Selecciona con getElementById, querySelector (uno) y querySelectorAll (todos), con los mismos selectores de CSS; devuelven null si no encuentran.
  • textContent cambia el texto de forma segura; innerHTML interpreta HTML y solo se usa con datos propios; value lee los campos.
  • classList.add/remove/toggle/contains cambia el aspecto sin mezclar estilos; style, setAttribute y dataset cubren los demás casos.
  • Crea con createElement, añade con append/prepend/before/after y elimina con remove().
  • querySelectorAll devuelve una NodeList: usa Array.from() o [...] para tener map y filter.
  • Ejecuta tu script cuando la página esté lista (defer).
  • Nunca insertes datos de usuarios con innerHTML.

9.Glosario

TérminoSignificado
DOMRepresentación en forma de árbol de objetos de la página.
NodoCada elemento, texto o comentario del árbol.
SelectorTexto (como en CSS) que identifica uno o varios elementos.
textContentPropiedad que lee o cambia el texto de un elemento.
innerHTMLPropiedad que lee o cambia el HTML interno; peligrosa con datos de usuarios.
classListObjeto para añadir, quitar o alternar clases.
NodeListLista de nodos que devuelve querySelectorAll.
XSSAtaque que inyecta código malicioso en una página.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué devuelve document.querySelector(".no-existe")?

Quieres mostrar un comentario que escribió un usuario. ¿Qué usas?

¿Cuál es la forma recomendada de resaltar un elemento?

document.querySelectorAll("li").map(...) da un error porque…

¿Qué hace document.createElement("li") por sí solo?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio