Unidad 2: Manipulación Avanzada del DOM
Objetivo: Aprender a interactuar con el DOM (Document Object Model) para modificar el contenido, manejar eventos y optimizar la manipulación de los elementos de una página web.
2.1 Introducción al DOM
¿Qué vamos a aprender?
El DOM (Document Object Model) es la representación estructurada de un documento HTML en JavaScript. Permite acceder y modificar el contenido y la estructura de la página web de manera dinámica.
Para trabajar con el DOM, usaremos diferentes métodos de selección de elementos, eventos y modificaciones en la estructura del documento.
Ejemplo base de HTML
A lo largo de este tema, utilizaremos el siguiente archivo HTML como base para nuestras prácticas.
Ejemplo de documento HTML base
2.2 Métodos de Selección de Elementos en el DOM
¿Qué vamos a aprender?
En esta sección veremos cómo seleccionar elementos del DOM utilizando los métodos más comunes: getElementById, getElementsByTagName, getElementsByClassName, querySelector y querySelectorAll.
getElementById
Selecciona un elemento por su id.
Ejemplo de getElementById
También podemos modificar el contenido de un elemento seleccionado con getElementById. para este tenemos dos opciones textContent y innerHTML. TextContent nos permite modificar el texto del elemento, mientras que innerHTML nos permite modificar el contenido HTML del elemento.
Ejemplos de cuando utilizar textContent o innerHTML:
textContent: Si solo necesitamos modificar el texto de un elemento, es recomendable usartextContentpara evitar problemas de seguridad.- element.textContent = "Nuevo texto";
innerHTML: Si necesitamos modificar el contenido HTML de un elemento, podemos usarinnerHTMLpara insertar etiquetas HTML. -element.innerHTML = "<strong>Nuevo texto</strong>";
También podemos acceder y modificar los atributos de un elemento con getAttribute y setAttribute. Vemos un ejemplo donde veremos modificaremos el valor de un atributo y añadiremos otro
Ejemplo de getAttribute y setAttribute
getElementsByTagName
Selecciona todos los elementos con una etiqueta específica y devuelve una colección HTML.
Ejemplo de getElementsByTagName modificando elementos
<p> y modificamos su contenido dinámicamente, agregando un número a cada uno.
getElementsByClassName
Selecciona todos los elementos con una clase específica y devuelve una colección HTML. EL resto de la funcionalidad es similar a getElementsByTagName. Nos devuelve un array con todos los elementos que tengan la clase especificada.
Ejercicios
Ejercicios de selección de elementos
- Selecciona el botón por su id y cambia su texto a "Haz clic aquí".
- Selecciona un párrafo y modifica su contenido por un link a Google.
Solución
En este ejemplo, seleccionamos el botón por su id y cambiamos su texto. Luego, seleccionamos un párrafo por su clase y modificamos su contenido por un link a Google.Ejercicios de selección de elementos
- Selecciona todos los párrafos y cambia su color de fondo a amarillo.
- Selecciona todos los elementos con la clase parrafo y cambia su contenido por "Párrafo modificado".
Solución
En este ejemplo, seleccionamos todos los párrafos con la clase parrafo y cambiamos su color de fondo a amarillo y su contenido por "Párrafo modificado".2.3 Delegación de eventos
¿Qué vamos a aprender?
La delegación de eventos es una técnica que nos permite manejar eventos de múltiples elementos utilizando un solo addEventListener. Es especialmente útil cuando trabajamos con elementos dinámicos que se agregan al DOM después de que la página ha cargado.
Concepto y utilidad para optimización del código
En lugar de agregar un event listener a cada elemento individualmente, podemos agregarlo a un elemento contenedor y capturar eventos de sus hijos.
Ejemplo de Delegación de Eventos
<p> dentro del body cambiará su color a rojo cuando se haga clic en él, sin necesidad de asignar un evento a cada párrafo de forma individual.
Ejercicios
Practica con delegación de eventos
- Crea una lista
<ul>con varios<li>y usa delegación de eventos para cambiar su color cuando se haga clic en un elemento. - Usa delegación de eventos para detectar cuándo se hace clic en el botón y cambiar su texto.
Solución
2.4 MutationObserver: Detección de cambios en el DOM
¿Qué vamos a aprender?
El MutationObserver es una API de JavaScript que nos permite detectar cambios en la estructura del DOM en tiempo real. Se usa para observar la modificación de elementos, la inserción o eliminación de nodos y la actualización de atributos.
Introducción al API MutationObserver
Este API nos permite observar cambios en un elemento específico y ejecutar una función cuando ocurran.
sintaxis:
let observer = new MutationObserver(callback);
let config = { childList: true, subtree: true };
let targetNode = document.getElementById("elemento");
observer.observe(targetNode, config);
Los métodos y propiedades más importantes de MutationObserver son:
observe(target, config): Comienza a observar los cambios en el DOM.disconnect(): Detiene la observación de cambios.takeRecords(): Devuelve una lista de mutaciones pendientes.
Note
Añadir un observador a un elemento es igual que addEventListener, si usted observa el elemento múltiples veces no hace ninguna diferencia. Si se observa dos veces un elemento, el observe callback no se ejecutará dos veces, ni tampoco tendrá que ejecutar disconnect() dos veces. En otras palabras, una vez el elemento es observado, observarlo de nuevo con la misma instancia del observador no hará nada. Sin embargo, si el callback es diferente por supuesto se le añadirá otro observador.
El objeto que se pasa a la función callback, e del tipo mutationRecord, que contiene información sobre el cambio detectado en el DOM. Tiene las siguiente propiedades:
type: Tipo de mutación (attributes,childList,characterData).target: Elemento que ha sido modificado.addedNodes: Lista de nodos añadidos.removedNodes: Lista de nodos eliminados.attributeName: Nombre del atributo modificado.oldValue: Valor anterior del atributo modificado.
callback: Función que se ejecuta cuando se detecta un cambio en el DOM.
La función que será llamada en cada mutación del DOM. El observer llamará a esta función con dos argumentos. El primero es un array de objetos, cada uno del tipo MutationRecord. El segundo es la propia instancia del MutationObserver.
Ejemplo de MutationObserver
MutationObserver detectará cualquier cambio en el contenido del elemento con id titulo y lo imprimirá en la consola.
Ejercicios
Práctica con MutationObserver
- Crea un
MutationObserverque detecte cuando se agregue un nuevo párrafo a la página. - Modifica el código para que, cuando detecte un cambio, agregue un mensaje en la consola indicando qué ha cambiado.
Solución
2.5 Uso de Plantillas HTML Dinámicas
¿Qué vamos a aprender?
El uso de plantillas HTML dinámicas nos permite generar contenido de manera eficiente sin necesidad de manipular directamente el DOM con múltiples innerHTML o createElement. Para ello, utilizamos la etiqueta <template> y el DocumentFragment.
Uso de <template> e innerHTML
La etiqueta <template> nos permite definir fragmentos de HTML que no se renderizan en el DOM hasta que los clonamos y los insertamos manualmente.
Ejemplo de uso de <template>
<template> define una tarjeta con un título y un párrafo, pero no se renderiza en el DOM hasta que JavaScript la clona y la inserta.
Uso de DocumentFragment
DocumentFragment nos permite manipular grandes fragmentos de contenido antes de agregarlos al DOM, optimizando el rendimiento.
Ejemplo de DocumentFragment
DocumentFragment para mejorar el rendimiento.
Ejercicios
Práctica con Plantillas HTML Dinámicas
- Modifica el ejemplo para agregar una imagen dentro de cada tarjeta.
- Crea un botón que, al hacer clic, agregue una nueva tarjeta con contenido dinámico.
Solución
2.6 Proyecto Final: Catálogo de Cursos Dinámico
Objetivo
Construir una aplicación web que muestre una lista de cursos de informática cargados dinámicamente desde un archivo JSON. Cada curso se mostrará como una tarjeta interactiva y permitirá ordenación y selección.
Requisitos
✅ Cargar los cursos desde un JSON y mostrarlos en el DOM usando una plantilla HTML (<template>).
✅ Cada tarjeta debe contener: nombre del curso, tecnología, duración, precio, imagen y descripción.
✅ Al hacer clic en una tarjeta, se aplicará o quitará la clase selected.
✅ Agregar un selector (<select>) para ordenar las tarjetas por nombre, tecnología o duración.
Estructura del JSON (cursos.json)
El fichero completo lo puedes descargar aquí.
Estructura base del HTML
Estructura base del HTML
Pasos para la Implementación
1 Cargar el JSON y recorrer los cursos.
2 Clonar el template y completar la información con los datos del JSON.
3 Insertar las tarjetas en el contenedor usando DocumentFragment.
4 Implementar la selección de tarjetas al hacer clic.
5 Añadir funcionalidad para ordenar las tarjetas según la opción elegida.