Guía Interactiva

El DOM
en JavaScript

Edita el código, ejecuta y ve el resultado — aprende haciendo

SENA - Centro de La innovación la Agroindustria y la Aviación

Instructor Alexander Patiño Londoño

// Lección 01

¿Qué es el DOM?

El DOM (Document Object Model) es la representación viva de tu página HTML en memoria. Cuando el navegador carga un archivo HTML, lo convierte en un árbol de objetos JavaScript que podemos leer y modificar en tiempo real.

Sin el DOM, JavaScript no podría tocar nada visual. Con el DOM, tienes control total sobre cada elemento, atributo, texto y estilo de la página.

Concepto clave: El DOM no es JavaScript ni HTML — es una API del navegador que conecta ambos. Está disponible a través del objeto global document.
Flujo del navegador: HTML texto → Parser → DOM Tree → JavaScript lo lee/modifica → Re-render visual.

Práctica: Tu primer contacto con el DOM

Modifica el HTML y el JS. Prueba cambiar el texto del <h1> desde JavaScript.
Ejemplo 01 — Acceder al DOM
Vista previa — haz clic en "Ejecutar" y luego en el botón
// Lección 02

La Estructura de Árbol

Cada elemento HTML se convierte en un nodo del árbol DOM. Los nodos tienen relaciones: padre, hijos y hermanos. Entender el árbol es fundamental para navegar y manipular la página.

document
└── html
    ├── head
    │   └── title
    │       └── "Mi Página"        ← Nodo de texto
    └── body
        ├── section  class="hero"
        │   ├── h1  id="titulo"
        │   │   └── "Hola Mundo"
        │   └── p   class="lead"
        │       └── "Texto aquí"
        └── ul  id="lista"
            ├── li  "Item 1"   ← children[0]
            ├── li  "Item 2"   ← children[1]
            └── li  "Item 3"   ← children[2]

Navegar por el árbol

Haz clic en cada botón para ver cómo JavaScript navega el árbol DOM en tiempo real.
Ejemplo 02 — Navegación de nodos
Vista previa — interactúa con los botones
// Lección 03

Seleccionar Elementos

Antes de modificar algo del DOM hay que encontrarlo. JavaScript ofrece varios métodos de selección, cada uno con propósito distinto:

getElementById(id)
Busca por ID. El más rápido. Devuelve 1 elemento o null.
getElementsByClassName()
Busca por clase CSS. Devuelve una HTMLCollection viva.
querySelector(selector)
Acepta cualquier selector CSS. Devuelve el primero que coincida.
querySelectorAll(selector)
Acepta cualquier selector CSS. Devuelve todos como NodeList.
Regla práctica: Usa querySelector y querySelectorAll para la mayoría de los casos. Son los más flexibles y se comportan igual que CSS.
Haz clic en cada botón para ver qué selecciona cada método. Intenta agregar más elementos en el HTML.
Ejemplo 03 — Métodos de selección
Vista previa — observa qué resalta cada selector
// Lección 04

Leer y Modificar Contenido

Una vez seleccionado un elemento, podemos leer y cambiar su contenido de texto, su HTML interno, sus atributos y el valor de formularios.

Importante: Usa textContent siempre que puedas. Si necesitas insertar HTML real, usa innerHTML — pero nunca pongas ahí datos del usuario sin sanitizar (riesgo de XSS).
Modifica el JS para que cada botón cambie algo diferente. Experimenta con innerHTML y getAttribute.
Ejemplo 04 — textContent, innerHTML, atributos
Vista previa — observa cómo cambia el DOM al ejecutar
// Lección 05

Clases CSS y Estilos

La manera más limpia de cambiar la apariencia de un elemento es agregando o quitando clases CSS. Usa style solo para valores dinámicos que no puedes definir en CSS de antemano.

classList tiene 4 métodos esenciales: add(), remove(), toggle() (agrega si no existe, quita si existe), y contains() (devuelve true/false).
Experimenta con el botón de tema oscuro/claro y los efectos. Intenta agregar tu propia clase CSS y activarla con JS.
Ejemplo 05 — classList y estilos dinámicos
Vista previa — toggle de clases en acción
// Lección 06

Crear e Insertar Nodos

Una de las capacidades más poderosas del DOM es crear elementos desde cero con JavaScript y colocarlos exactamente donde necesitamos en el árbol.

createElement(tag)
Crea un nuevo elemento HTML. Aún no está en el DOM.
appendChild(nodo)
Inserta el nodo al final de los hijos del padre.
prepend(nodo)
Inserta el nodo al inicio de los hijos del padre.
element.remove()
Elimina el elemento del DOM. Directo y sin rodeos.
cloneNode(deep)
Copia un nodo. true = copia también sus hijos.
insertBefore(nuevo, ref)
Inserta antes de un nodo de referencia específico.
Agrega y elimina tarjetas. Intenta cambiar el color y el emoji antes de insertar. Usa "Clonar" para duplicar.
Ejemplo 06 — crear, insertar y eliminar nodos
Vista previa — crea y elimina nodos en tiempo real
// Lección 07a

Eventos de Mouse

Los eventos de mouse cubren toda interacción del cursor: clics, movimiento, entrada y salida de elementos. El objeto MouseEvent trae propiedades como clientX/Y, offsetX/Y, button y buttons.

click
Clic principal (botón izquierdo). El más usado.
dblclick
Doble clic. Si también hay click, se disparan ambos.
contextmenu
Clic derecho. Usa preventDefault() para evitar el menú del navegador.
mouseenter / mouseleave
El cursor entra o sale del elemento. NO se propagan (no bubble).
mouseover / mouseout
Igual que enter/leave pero SÍ se propagan a los hijos.
mousemove
Se dispara continuamente mientras el cursor se mueve. Atención al rendimiento.
Haz clic, doble clic, clic derecho y mueve el mouse por las zonas. Observa cómo cada evento responde diferente.
Ejemplo 07a — Eventos de Mouse
Vista previa — interactúa con cada zona
// Lección 07b

Eventos de Teclado

Hay tres eventos de teclado principales. keydown y keyup funcionan con cualquier tecla. input es el más confiable para capturar cambios en campos de texto.

keydown
Se dispara al presionar la tecla. Se repite si la mantienes. Detecta teclas especiales (Ctrl, Alt, Escape...).
keyup
Se dispara al soltar la tecla. Solo una vez por pulsación.
input
Se dispara cuando el valor del campo cambia. El más útil para formularios en tiempo real.
change
Se dispara al perder el foco si el valor cambió. Para selects y checkboxes es el evento correcto.
e.key
La tecla presionada: "a", "Enter", "ArrowLeft", "Escape", " " (espacio)...
e.ctrlKey / e.shiftKey / e.altKey
Booleanos que indican si esa tecla modificadora estaba presionada al mismo tiempo.
Escribe en el campo, presiona atajos de teclado (Ctrl+S, Escape, flechas) y observa cómo cada evento se comporta distinto.
Ejemplo 07b — Eventos de Teclado
Vista previa — escribe, presiona atajos y cambia el select
// Lección 07c

Eventos de Formulario

Los formularios tienen su propio set de eventos. El más importante es submit, que se dispara al enviar. focus y blur controlan cuándo un campo gana o pierde el foco.

submit
El form fue enviado. Siempre usa e.preventDefault() para manejarlo con JS.
focus
El campo ganó el foco (el usuario hizo clic o llegó con Tab). No hace bubble.
blur
El campo perdió el foco. Ideal para validar cuando el usuario sale del campo.
focusin / focusout
Como focus/blur pero SÍ hacen bubble. Útiles con delegación.
reset
El formulario fue reiniciado (botón reset o llamada a form.reset()).
invalid
Un campo falló la validación HTML5. Permite personalizar el mensaje de error.
Completa el formulario, intenta enviarlo vacío, llena los campos y observa la validación en tiempo real con blur.
Ejemplo 07c — Eventos de Formulario
Vista previa — completa el formulario y observa cada evento
// Lección 07d

Eventos de Scroll y Resize

scroll se dispara cada vez que el usuario desplaza la página o un elemento. resize se dispara cuando cambia el tamaño de la ventana. Ambos pueden dispararse cientos de veces por segundo — usa throttle para controlar el rendimiento.

scroll
Desplazamiento en window o en cualquier elemento con overflow: auto/scroll. Usa scrollY para la posición.
scrollend
Se dispara cuando el scroll termina. Más eficiente que throttle en casos simples (Chrome 114+).
resize
Solo en window. Usa window.innerWidth/innerHeight para las dimensiones.
IntersectionObserver
API moderna para detectar si un elemento es visible en pantalla. Más eficiente que scroll + getBoundingClientRect.
Desplázate dentro del contenedor, observa el throttle y el IntersectionObserver. Cambia el tamaño de la ventana del preview.
Ejemplo 07d — Scroll, Resize e IntersectionObserver
Vista previa — desplázate dentro del contenedor y redimensiona
// Lección 07e

Drag & Drop

La API de Drag & Drop nativa del DOM permite arrastrar y soltar elementos entre zonas. El atributo HTML draggable="true" activa el comportamiento, y el objeto DataTransfer transfiere datos entre el elemento arrastrado y la zona de destino.

dragstart
Se dispara en el elemento que empieza a arrastrarse. Aquí guardas los datos en dataTransfer.
dragend
Se dispara cuando el arrastre termina, independientemente de si fue exitoso.
dragover
Se dispara constantemente sobre la zona de destino. Debes llamar preventDefault() para permitir el drop.
dragenter / dragleave
El elemento arrastrado entró o salió de una zona de destino.
drop
El elemento fue soltado en la zona. Aquí lees los datos con dataTransfer.getData().
dataTransfer
Objeto que transfiere datos. setData(tipo, valor) guarda, getData(tipo) recupera.
Arrastra las tarjetas de "Disponibles" a "En Progreso" o "Completado". Observa cada evento en el log.
Ejemplo 07e — Drag & Drop API
Vista previa — arrastra las tarjetas entre columnas
// Lección 08

Delegación de Eventos

La delegación es una técnica que aprovecha el event bubbling: los eventos suben del hijo al padre. En vez de poner un listener en cada elemento, pones uno solo en el padre y usas event.target para saber quién disparó el evento.

Por qué es crucial: Si agregas elementos dinámicamente al DOM, los listeners directos no funcionan en ellos. La delegación sí, porque el listener está en el padre que ya existía.
Usa event.target.closest(selector) para encontrar el elemento contenedor correcto aunque el usuario haya hecho clic en un elemento hijo anidado.
Agrega ítems y elimínalos. Nota que todos funcionan con UN solo listener en el padre. Intenta comentar el listener y ver qué pasa.
Ejemplo 08 — event delegation
Vista previa — un listener, control total
// Lección 09 — Proyecto Final

Proyecto: Gestor de Tareas Completo

Este ejemplo integra todos los conceptos: selección, creación de nodos, manipulación de clases, atributos personalizados, eventos, delegación, y formularios. Lee cada parte del JS con calma — está comentado para que entiendas cada operación del DOM.

Tu reto: Modifica el proyecto. Agrega una fecha de vencimiento a cada tarea, o un campo de búsqueda que filtre las tarjetas usando querySelectorAll y classList.toggle.
Proyecto Final — Todo App con DOM puro
Vista previa — proyecto final completo y funcional