Unidad 4.2: Introducción al DOM (Document Object Model)
4.2.1 El Objeto window en JavaScript
El objeto window representa la ventana del navegador y es el objeto global en el que se ejecuta JavaScript en el cliente.
📌 Propiedades principales:
window.innerWidth,window.innerHeight: Dimensiones de la ventana.window.location: Información sobre la URL actual.window.history: Acceso al historial de navegación.
📌 Métodos útiles:
alert(mensaje)
Muestra un cuadro de alerta con un mensaje.
- Parámetros:
- mensaje (string): Texto a mostrar en la alerta.
- Valor de retorno: undefined (no devuelve ningún valor).
Ejemplo práctico: alert()
| Ejemplo de alert() | |
|---|---|
prompt(mensaje, valorPorDefecto)
Solicita una entrada de texto al usuario.
- Parámetros:
mensaje(string): Texto de la solicitud.valorPorDefecto(string, opcional): Texto inicial en el campo de entrada.
- Valor de retorno: La cadena ingresada por el usuario o
nullsi se cancela.
Ejemplo práctico: prompt()
confirm(mensaje)
Muestra un cuadro de diálogo con opciones "Aceptar" o "Cancelar".
- Parámetros:
mensaje(string): Texto del cuadro de confirmación.
- Valor de retorno:
truesi el usuario presiona "Aceptar",falsesi presiona "Cancelar".
Ejemplo práctico: confirm()
setTimeout(función, tiempo)
Ejecuta una función después de un tiempo específico.
- Parámetros:
función(function): Función a ejecutar después del tiempo.tiempo(número): Tiempo en milisegundos.
- Valor de retorno: Un identificador del temporizador que puede usarse con
clearTimeout().
Ejemplo práctico: setTimeout()
setInterval(función, tiempo)
Ejecuta repetidamente una función a intervalos regulares.
- Parámetros:
función(function): Función a ejecutar.tiempo(número): Intervalo en milisegundos.
- Valor de retorno: Un identificador del temporizador que puede usarse con
clearInterval().
Ejemplo práctico: setInterval()
4.2.3 Cómo accede JavaScript al DOM
JavaScript puede acceder y modificar el contenido de una página web mediante el Document Object Model (DOM). Para ello, es importante entender cómo se integran los scripts en una página HTML.
📌 Métodos para incluir JavaScript en HTML:
-
<script>en<head>: Se ejecuta antes de que se cargue el cuerpo del documento, lo que puede generar errores si intentamos acceder a elementos aún no cargados. -
<script>antes del cierre de<body>: Se recomienda en la mayoría de los casos, ya que garantiza que el DOM esté completamente cargado antes de ejecutar el script. -
Atributos
deferyasyncen<script>:defer: El script se descarga en segundo plano y se ejecuta cuando el documento HTML ha sido completamente analizado.async: El script se descarga y ejecuta de inmediato, sin esperar a que termine de cargarse el HTML, lo que puede causar problemas de sincronización.
Ejemplo de inclusión de JavaScript
Ejercicio práctico
- Crea un documento HTML
- Pon un
alert()en el<head>, otro al final del<body>y otro en un fichero externo. - Comprueba el orden en que se muestran los mensajes.
4.2.4 Ejemplo base de HTML para manipulación del DOM
A lo largo de esta unidad, trabajaremos con una página de ejemplo que contendrá información sobre un empleado. Usaremos esta estructura para practicar la manipulación del DOM.
Código base de HTML
Este documento HTML servirá como base para los ejemplos de los siguientes puntos. Nos permitirá practicar cómo localizar, modificar, agregar y eliminar contenido dinámicamente, además de manejar eventos en el DOM.
4.2.5 Modificación del contenido de elementos
Para modificar el contenido de los elementos en el DOM, JavaScript proporciona tres propiedades principales: innerText, textContent y innerHTML. A continuación, se explica cada una y cuándo utilizarlas.
innerText
Devuelve o establece el texto visible dentro de un elemento. No incluye elementos HTML ni el contenido oculto con CSS (display: none).
📌 Uso recomendado: Cuando solo queremos obtener o modificar el texto visible del usuario.
Ejemplo de innerText
textContent
Similar a innerText, pero devuelve todo el texto dentro del nodo, incluyendo texto oculto con CSS.
📌 Uso recomendado: Cuando se necesita obtener el contenido completo, sin importar la visibilidad del elemento.
Ejemplo de textContent
innerHTML
Permite acceder o modificar el contenido HTML dentro de un elemento. A diferencia de innerText y textContent, interpreta y procesa etiquetas HTML.
📌 Uso recomendado: Cuando es necesario agregar o modificar contenido con etiquetas HTML.
Ejemplo de innerHTML
📢 Precaución con innerHTML: Si el contenido proviene de fuentes externas o de usuarios, usar innerHTML sin validación puede generar problemas de seguridad (inyección de código).
4.2.6 Ejercicio: Modificar contenido con innerText, textContent e innerHTML
Ejercicio: Aplicar diferentes métodos para modificar contenido
- Crea un documento HTML que contenga tres elementos:
- Un encabezado
<h1>con el idtitulo. - Un párrafo
<p>con el iddescripcion. - Un
divcon el idcontenido.
- Un encabezado
- Usa las siguientes propiedades para modificar cada uno:
innerTextpara cambiar el título a "Bienvenido al curso de JavaScript".textContentpara cambiar el texto del párrafo a "Aprenderás a modificar el DOM con JavaScript".innerHTMLpara agregar contenido con etiquetas HTML dentro deldiv.
- Agrega una función en un script que realice los cambios mencionados. Es script debe estar en un fichero externo.
Solución del ejercicio
4.2.7 Modificación de atributos y estilos
JavaScript permite modificar los atributos y estilos de los elementos del DOM de diversas maneras.
Modificar atributos
Estos métodos permiten cambiar o eliminar atributos de los elementos HTML.
setAttribute(atributo, valor): Establece un atributo con el valor especificado.getAttribute(atributo): Obtiene el valor de un atributo.removeAttribute(atributo): Elimina un atributo de un elemento.
Ejemplo de modificación de atributos
Modificar estilos con JavaScript
Podemos cambiar los estilos de los elementos con dos métodos:
.style.property: Modifica un estilo individual..classList: Añade, quita o alterna clases CSS.
Ejemplo de modificación de estilos
| Cambiar color de fondo | |
|---|---|
Ejemplo de modificación de clases
Hay un método adicional, classList.toggle(), que agrega o quita una clase según su presencia en el elemento. Se utiliza para alternar estilos. Por ejemplo, si una clase activo cambia el color de fondo, classList.toggle("activo") cambiará el color al hacer clic.
Ejemplo de classList.toggle()
Ejercicio: Modificar atributos y estilos
- Cambia el
srcde una imagen, al cargar la página. - Modifica el color de un botón al cargar la página.
- Agrega y quita clases CSS dinámicamente. Para ello crea un par de clases, para las imagenes y los botones y alterna entre ellas.
4.2.8 Creación y eliminación de elementos en el DOM
Crear elementos dinámicamente
document.createElement(etiqueta): Crea un nuevo elemento.appendChild(nodo): Añade un elemento al final de otro.insertBefore(nuevoNodo, nodoExistente): Inserta un elemento antes de otro existente.
Ejemplo práctico
Eliminar elementos
removeChild(nodo): Elimina un nodo hijo de otro nodo padre.remove(): Elimina un nodo directamente.
Ejemplo de eliminación de elementos
Ejercicio: Crear y eliminar elementos
Ejercicio: Crear y eliminar elementos
- Crea una página con una lista de elementos (
<ul>). - Agrega un botón para añadir nuevos elementos a la lista.
- Agrega otro botón para eliminar el último elemento de la lista.
- Usa
appendChild()yremoveChild().
Solución en JavaScript
Este ejercicio permite practicar la creación y eliminación de elementos dinámicos en el DOM.
4.2.9 Manejo de eventos en el DOM
Los eventos permiten interactuar con los usuarios y reaccionar a acciones como clics o movimientos del ratón, y del teclado. JavaScript proporciona una forma sencilla de asignar eventos a los elementos del DOM.
Formas de asignar eventos
Existen varias maneras de asignar eventos en JavaScript. A continuación, veremos dos métodos principales:
1️⃣ Asignación de eventos en el HTML (método clásico)
Este método define el evento directamente en el HTML, estableciendo la función a ejecutar en el atributo correspondiente.
Ejemplo de evento en el HTML
📌 Desventajas: - Difícil de mantener en proyectos grandes. - No permite asignar múltiples eventos al mismo elemento fácilmente.
2️⃣ Uso de addEventListener() (método recomendado)
Este método permite asignar eventos directamente desde JavaScript, manteniendo el código HTML más limpio y estructurado.
Ejemplo de addEventListener()
📌 Ventajas:
- Permite asignar múltiples eventos al mismo elemento.
- Separa la estructura HTML de la lógica en JavaScript.
Para eliminar un evento asignado con addEventListener(), se utiliza el método removeEventListener(). Este método requiere que la función de evento sea nombrada, lo que puede ser un inconveniente en algunos casos. En el ejemplo anterior:
| Eliminar evento con removeEventListener() | |
|---|---|
Esta función devuelve true si se eliminó correctamente, y false si el evento no estaba asignado.
Eventos más utilizados
| Evento | Elemento típico | Descripción |
|---|---|---|
click |
Botones, enlaces | Se dispara cuando se hace clic en un elemento. |
mouseover |
Imágenes, enlaces | Se activa cuando el ratón pasa sobre un elemento. |
change |
Formularios | Se activa cuando cambia el valor de un campo de entrada. |
load |
body, imágenes |
Se ejecuta cuando la página o un recurso ha cargado completamente. |
KeyDown |
document |
Se activa cuando se presiona una tecla en cualquier parte del documento. |
KeyUp |
document |
Se dispara cuando se suelta una tecla en cualquier parte del documento. |
keyPress |
document |
Se activa cuando se presiona una tecla que produce un carácter. |
focus |
Campos de entrada | Se activa cuando un elemento recibe el foco. |
blur |
Campos de entrada | Se dispara cuando un elemento pierde el foco. |
submit |
Formularios | Se activa cuando se envía un formulario. |
Podemos encontrar más información sobre eventos en W3Schools.
Ahora explicamos algunos eventos comunes y su uso en JavaScript, sobre el resto profundizaremos en el siguiente módulo.
El evento onload y su uso en JavaScript
El evento onload se ejecuta cuando el documento HTML ha sido completamente cargado. Se usa comúnmente para inicializar scripts y asegurarse de que todos los elementos del DOM están disponibles antes de interactuar con ellos.
Ejemplo de onload
Uso recomendado de DOMContentLoaded en lugar de onload
El evento DOMContentLoaded se dispara cuando el navegador ha terminado de analizar completamente el documento HTML, antes de que se carguen imágenes y otros recursos externos.
📌 ¿Por qué es mejor DOMContentLoaded?
onloadespera a que todos los recursos de la página (imágenes, scripts, estilos) se hayan cargado.DOMContentLoadedse activa antes, justo después de que el HTML esté listo, lo que mejora el tiempo de respuesta de los scripts.- En aplicaciones dinámicas, muchas veces no es necesario esperar a la carga de imágenes o estilos para ejecutar código JavaScript.
📌 Recomendación: En lugar de usar onload en el HTML, es mejor utilizar DOMContentLoaded en JavaScript:
Ejemplo de DOMContentLoaded
Ejercicio: Manejo de eventos
Ejercicio: Manejo de eventos
- Crea una página con un campo de entrada de texto y un botón.
- Al presionar el botón, muestra en un
divel contenido del campo de entrada. - Implementa un evento
mouseoveren undivpara cambiar su color al pasar el cursor. - Agrega un evento
keydownpara detectar cuando el usuario escribe.
📌 Código base HTML:
HTML Base para el ejercicio
Solución en JavaScript
Solución clásica sin addEventListener()
Este ejercicio permite practicar la interacción con eventos en el DOM, incluyendo clics, movimiento del ratón y pulsaciones de teclado.
4.2.11 Ejercicio guiado: Selección de Comunidad y Ciudad
En este ejercicio, construiremos un formulario dinámico en el que los usuarios seleccionarán una Comunidad Autónoma y, en función de su selección, podrán elegir una ciudad dentro de esa comunidad. Además, el botón de envío solo estará habilitado cuando ambas selecciones sean válidas.
📌 Objetivos del ejercicio
- Al cargar la página, los selectores estarán vacíos con la opción
Seleccione una comunidadySeleccione una ciudad. - El selector de ciudad estará deshabilitado hasta que el usuario seleccione una comunidad.
- Al elegir una comunidad, el selector de ciudad se llenará con las capitales de provincia correspondientes.
- Si se cambia la comunidad seleccionada, la lista de ciudades se actualizará y se deseleccionará la opción anterior.
- El botón "Enviar" solo se activará cuando haya una comunidad y ciudad seleccionada.
- Al presionar el botón "Enviar", se mostrará un mensaje con la comunidad y la ciudad seleccionada y el formulario se reiniciará.
Código base del HTML
HTML Base para el ejercicio
Código en JavaScript (formulario.js)
Solución en JavaScript
📌 Ejercicio adicional
Ejercicio adicional: Agregar y eliminar ciudades
- Ampliación del ejercicio:
- Añadir un formulario donde el usuario pueda agregar nuevas ciudades a una comunidad existente.
- Implementar un botón "Eliminar" que permita quitar una ciudad seleccionada.
- Al eliminar una ciudad, actualizar la lista de manera dinámica.
Con este ejercicio, los alumnos practicarán el uso de eventos, manipulación dinámica del DOM, deshabilitación de elementos y gestión de selectores en JavaScript.
4.2.11 Integración con el servicio REST de ciudades
En la Unidad 3.4 creamos un pequeño servicio REST que permitía recuperar una lista de ciudades o los datos de una ciudad en particular. Ahora vamos a integrarlo en una página web utilizando JavaScript y el DOM.
📌 Objetivo del ejercicio:
1. Crear una página web que cargue la lista de ciudades desde el servicio REST y la muestre en una tabla.
2. Cada ciudad tendrá un botón en su código que, al hacer clic, mostrará los detalles de la ciudad en una ventana emergente (prompt).
3. Como mejora opcional, el alumno deberá permitir añadir y eliminar ciudades mediante un formulario dinámico.
📌 Código base HTML:
HTML Base para el ejercicio
📌 Solución en JavaScript:
Solución en JavaScript
Ejercicio propuesto:
Ejercicio: Añadir y eliminar ciudades
- Añadir ciudad: Modifica el código para incluir un formulario con
inputpara ingresar una nueva ciudad y un botón "Agregar". - Eliminar ciudad: Agrega un botón "Eliminar" en cada fila de la tabla, que permita eliminar una ciudad de la lista y de la base de datos utilizando
fetch()conDELETE.
Con este ejercicio, los alumnos aprenderán a cargar datos desde una API REST, modificar dinámicamente el DOM, y agregar funcionalidades interactivas a una página web. 🚀
4.2.12 Ejercicios prácticos
A continuación, se presentan una serie de ejercicios para reforzar los conocimientos adquiridos sobre HTML, manipulación del DOM y eventos.
Ejercicios de HTML
Ejercicio 1: Crear una lista ordenada
- Crea un documento HTML con una lista ordenada de 5 elementos.
- Agrega una etiqueta
<h2>con un título descriptivo.
Ejercicio 2: Crear una tabla básica
- Construye una tabla HTML con 3 columnas (
Nombre,Edad,Ciudad) y 4 filas. - Añade un encabezado (
<thead>) y un cuerpo (<tbody>).
Solución
| Tabla básica | |
|---|---|
Ejercicio 3: Crear un formulario de contacto
- Diseña un formulario HTML con los siguientes campos:
- Nombre (campo de texto)
- Correo electrónico (campo de email)
- Mensaje (área de texto)
- Botón de envío
- Usa etiquetas
<label>para cada campo.
Solución
Ejercicio 4: Crear un formulario de registro
- Crea un formulario con:
- Nombre de usuario (campo de texto)
- Contraseña (campo de password)
- Selector de país (
<select>) con al menos 5 opciones - Botón de registro
Solución
```html linenums="1" title="Formulario de registro"
```
Ejercicio 5: Crear un formulario con radio buttons y checkboxes
- Diseña un formulario con:
- Selección de género (
Masculino,Femenino,Otro) usando radio buttons. - Una lista de intereses con checkboxes (
Música,Deportes,Cine). - Un botón de envío.
Solución
Ejercicios con JavaScript y DOM
Ejercicio 6: Añadir elementos dinámicamente a una lista
- Modifica el Ejercicio 1 agregando un campo de entrada y un botón.
- Al hacer clic en el botón, el nuevo elemento se añadirá a la lista.
Solución
| Añadir elementos dinámicamente | |
|---|---|
Ejercicio 7: Modificar dinámicamente una tabla
- Basado en el Ejercicio 2, crea un formulario con los mismos campos.
- Al completar el formulario y presionar el botón "Agregar", se añadirá una nueva fila a la tabla.
Solución
Ejercicio 8: Validación de un formulario
- Modifica el Ejercicio 3 para validar que:
- El campo de nombre no esté vacío.
- El correo sea válido.
- El mensaje tenga al menos 10 caracteres.
- Si hay errores, mostrar un mensaje en pantalla.
Solución
Ejercicio 9: Manejo de eventos del teclado y ratón
- Modifica el Ejercicio 4:
- Cuando el usuario presione una tecla en el campo de contraseña, se mostrará la cantidad de caracteres ingresados.
- Al pasar el ratón sobre el botón de registro, cambiará de color.
Solución
Ejercicio 10: Modificación de atributos y clases dinámicamente
- Agrega estilos CSS al formulario del Ejercicio 5.
- Crea un botón "Activar Modo Oscuro" que, al hacer clic, cambie la apariencia de la página usando
classList.toggle().
Estos ejercicios ayudarán a los alumnos a practicar la estructura HTML, la manipulación del DOM y el uso de eventos en JavaScript.