Módulo 3 · Interacción web

JavaScript: darle vida a la web

JavaScript es el lenguaje que permite crear lógica, interacción y comportamiento dinámico. Con él, una página puede responder a clics, mostrar mensajes, validar formularios y modificar contenido en tiempo real.

Ver conceptos Actividades

¿Qué es JavaScript?

JavaScript es un lenguaje de programación que permite ejecutar instrucciones, procesar datos y cambiar el comportamiento de una página.

A diferencia de HTML y CSS, JavaScript sí permite crear lógica y decisiones automáticas.

Variables y funciones

let nombre = "Ana";
function saludar() {
  console.log("Hola " + nombre);
}

Variables, tipos de datos y operadores

Variables

JavaScript permite declarar variables con var, let y const.

let edad = 18;
const nombre = "Luis";
var activo = true;

Tipos de datos

  • String: textos
  • Number: números
  • Boolean: verdadero o falso
  • Null: valor vacío intencional
  • Undefined: sin valor
  • Object: estructuras complejas
  • Array: listas de datos

Operadores

let suma = 2 + 3;
let resta = 10 - 4;
let comparacion = 5 === 5;

Funciones y tipos de funciones

Funciones declaradas

function saludar() {
  console.log('Hola');
}

Funciones anónimas y flecha

const sumar = (a, b) => a + b;
const mensaje = function() { return 'Hola'; };

Funciones de orden superior

Son funciones que reciben otras funciones como parámetros o devuelven funciones.

const numeros = [1, 2, 3];
const duplicados = numeros.map(n => n * 2);

JavaScript y el DOM

Modificar contenido

document.querySelector("h1").textContent = "Nuevo título";

Agregar interacción

document.querySelector("button").addEventListener("click", () => {
  alert("¡Hola!");
});

¿Cómo reconoce el DOM a JavaScript?

El navegador analiza el HTML, construye el DOM y ejecuta los scripts. Cuando encuentra un archivo JavaScript, lo interpreta y luego puede modificar nodos del árbol.

Insertar imágenes y videos con JavaScript

Agregar una imagen dinámica

JavaScript puede crear un elemento img y agregarlo al DOM.

const imagen = document.createElement('img');
imagen.src = 'foto-webp.webp';
imagen.alt = 'Paisaje en formato WebP';
imagen.width = 600;
document.querySelector('#galeria').appendChild(imagen);

Esto es útil cuando la imagen depende de una selección del usuario o de datos recibidos por API.

Agregar un video dinámico

También se puede crear un elemento video y añadir varias fuentes de video.

const video = document.createElement('video');
video.controls = true;
video.width = 640;
const sourceMp4 = document.createElement('source');
sourceMp4.src = 'video.mp4';
sourceMp4.type = 'video/mp4';
const sourceWebm = document.createElement('source');
sourceWebm.src = 'video.webm';
sourceWebm.type = 'video/webm';
video.appendChild(sourceMp4);
video.appendChild(sourceWebm);
document.querySelector('#videos').appendChild(video);

El navegador selecciona la primera fuente compatible que pueda reproducir.

Insertar con innerHTML

Si necesitas añadir varios elementos a la vez, puedes usar innerHTML con código HTML.

const contenedor = document.querySelector('#media');
contenedor.innerHTML = `
  <img src="avatar.png" alt="Avatar">
  <video controls width="320">
    <source src="clip.mp4" type="video/mp4">
  </video>
`;

Usa esta técnica con cuidado si el contenido viene de usuarios para evitar riesgos de seguridad.

Eventos y flujo de ejecución

Eventos comunes

  • click
  • submit
  • input
  • change
  • mouseover

Cómo funciona el flujo

Un evento ocurre cuando el usuario interactúa. JavaScript escucha ese evento y ejecuta una función.

document.addEventListener('click', () => {
  console.log('Se hizo clic');
});

Renderización

HTML crea la estructura, CSS define la apariencia y JavaScript agrega el comportamiento. El navegador renderiza todo como una interfaz visual.

Objetos, arreglos y JSON

Los objetos agrupan datos relacionados. Los arreglos almacenan listas. JSON es un formato de intercambio de datos muy usado en APIs.

const producto = {
  nombre: 'Laptop',
  precio: 1200,
  disponible: true
};

const colores = ['rojo', 'azul', 'verde'];
Para una explicación más detallada entra a Objetos, JSON y datos.

Propiedades y métodos esenciales de JavaScript

Cadenas de texto

  • toLowerCase(): convierte a minúsculas. Ejemplo: "Hola".toLowerCase().
  • toUpperCase(): convierte a mayúsculas. Ejemplo: "hola".toUpperCase().
  • trim(): elimina espacios al inicio y final. Ejemplo: " hola ".trim().
  • includes(): verifica si una cadena contiene un valor. Ejemplo: "JavaScript".includes("Script").
  • slice(): extrae una parte de la cadena. Ejemplo: "programar".slice(0, 4).

Arreglos

  • push(): añade un elemento al final. Ejemplo: frutas.push("mango").
  • pop(): elimina el último elemento. Ejemplo: frutas.pop().
  • shift(): elimina el primer elemento. Ejemplo: frutas.shift().
  • unshift(): añade un elemento al inicio. Ejemplo: frutas.unshift("pera").
  • map(): transforma cada elemento. Ejemplo: numeros.map(n => n * 2).
  • filter(): filtra elementos según una condición. Ejemplo: numeros.filter(n => n > 2).
  • find(): devuelve el primer elemento que cumple la condición. Ejemplo: numeros.find(n => n > 2).
  • length: devuelve la cantidad de elementos. Ejemplo: frutas.length.

Objetos y eventos

  • Object.keys(): devuelve las propiedades del objeto. Ejemplo: Object.keys(producto).
  • Object.values(): devuelve los valores del objeto. Ejemplo: Object.values(producto).
  • addEventListener(): escucha eventos del usuario. Ejemplo: boton.addEventListener('click', hacerAlgo).
  • classList.add(): agrega clases CSS a un elemento. Ejemplo: elemento.classList.add('activo').
  • classList.remove(): elimina clases CSS. Ejemplo: elemento.classList.remove('activo').

Operadores lógicos, consola, texto en HTML, clases y ids

Operadores lógicos

Los operadores lógicos permiten combinar condiciones y tomar decisiones.

  • && (AND): se usa cuando deben cumplirse dos o más condiciones. Ejemplo: edad >= 18 && tieneDni.
  • || (OR): se usa cuando basta con que una condición sea verdadera. Ejemplo: esEstudiante || esDocente.
  • ! (NOT): niega una condición. Ejemplo: !estaActivo.
if (edad >= 18 && tieneDni) {
  console.log('Puede entrar');
}

Tipos de console.log

La consola sirve para depurar y mostrar información mientras el programa se ejecuta.

  • console.log(): muestra información general.
  • console.warn(): muestra advertencias.
  • console.error(): muestra errores.
  • console.info(): muestra información importante.
  • console.table(): muestra datos en forma de tabla.
console.log('Mensaje normal');
console.warn('Advertencia');
console.error('Error');

Mostrar texto directo en HTML desde JavaScript

Para mostrar texto dentro de una página, se puede modificar un elemento del DOM.

document.getElementById('mensaje').textContent = 'Hola desde JavaScript';

También se puede usar innerHTML, aunque debe usarse con cuidado si el contenido viene de usuarios.

document.getElementById('mensaje').innerHTML = 'Texto en negrita';

Modificar clases CSS

JavaScript puede agregar o quitar clases para cambiar la apariencia de un elemento.

document.querySelector('button').classList.add('activo');
document.querySelector('button').classList.remove('activo');
document.querySelector('button').classList.toggle('activo');

Esto es muy útil para mostrar estados como activo, oculto o destacado.

Qué es un id y para qué sirve

Un id es un nombre único que se asigna a un solo elemento HTML.

<h2 id="titulo-principal">Hola</h2>

Se usa para identificar un elemento de forma específica con JavaScript o CSS.

document.getElementById('titulo-principal');
#titulo-principal { color: blue; }
Un id debe ser único en la página, mientras que una class puede aplicarse a varios elementos.

Conceptos extra que conviene recordar

  • let: permite cambiar el valor de una variable.
  • const: no permite reasignar el valor.
  • ===: compara valores y tipos de forma estricta.
  • template literals: permiten insertar variables dentro de cadenas con ${}.
const nombre = 'Ana';
console.log(`Hola, ${nombre}`);

Protocolos HTTP, URL y métodos de petición

¿Qué es una URL?

Una URL es la dirección que indica dónde está un recurso en la web. Por ejemplo:

https://example.com/products?id=1
  • Protocolo: https://
  • Dominio: example.com
  • Ruta: /products
  • Parámetros: ?id=1

La URL sirve para localizar y pedir información a un servidor.

Tipos de protocolos HTTP

Los protocolos definen cómo viajan los datos entre navegador y servidor.

  • HTTP: protocolo básico, sin cifrado.
  • HTTPS: igual que HTTP, pero con cifrado para mayor seguridad.
En la práctica, se prefiere HTTPS porque protege la información que viaja entre el usuario y el servidor.

Cómo funcionan las peticiones

Una petición HTTP viaja desde el navegador hacia un servidor con una línea de solicitud, cabeceras y, a veces, un cuerpo.

GET /productos HTTP/1.1
Host: ejemplo.com

El servidor devuelve una respuesta con un código de estado, cabeceras y un cuerpo con datos.

Métodos HTTP más usados

  • GET: leer datos. Se usa para consultar información.
  • POST: enviar datos para crear algo nuevo.
  • PUT: reemplazar por completo un recurso.
  • PATCH: actualizar solo parte de un recurso.
  • OPTIONS: preguntar qué acciones soporta el servidor.
  • DELETE: borrar un recurso.
fetch('https://api.ejemplo.com/usuarios', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ nombre: 'Ana' })
});

Diferencia entre variables en JavaScript

var

Es la forma antigua de declarar variables. Tiene un alcance más amplio y puede causar problemas en scripts más grandes.

var edad = 20;

let

Se usa cuando la variable puede cambiar de valor. Tiene alcance de bloque.

let contador = 0;
contador = 1;

const

Se usa para valores que no deben cambiar. También tiene alcance de bloque.

const nombre = 'María';
Usa const por defecto, let cuando necesites reasignar y evita var en código moderno.

Tipos de eventos en JavaScript

Eventos de interacción

  • click: ocurre al hacer clic.
  • dblclick: ocurre al hacer doble clic.
  • mouseover: al pasar el mouse sobre un elemento.
  • mouseout: al salir del elemento.

Eventos de formulario

  • input: cuando el usuario escribe.
  • change: cuando cambia el valor.
  • submit: al enviar el formulario.
  • blur: cuando un elemento pierde el foco.
  • focus: cuando un elemento obtiene el foco.

Ejemplo básico

boton.addEventListener('click', () => {
  console.log('Se hizo clic');
});

Manipulación avanzada del DOM

Métodos para agregar elementos

  • appendChild(): agrega un nodo hijo al final.
  • append(): agrega uno o varios nodos al final.
  • prepend(): agrega uno o varios nodos al inicio.
const item = document.createElement('li');
item.textContent = 'Nuevo item';
document.querySelector('ul').appendChild(item);

Métodos para eliminar o reemplazar

  • remove(): elimina un elemento del DOM.
  • removeChild(): elimina un hijo específico.
  • replaceWith(): reemplaza un elemento por otro.
document.querySelector('#mensaje').remove();

Propiedades relacionadas

  • textContent: cambia el texto visible.
  • innerHTML: inserta HTML.
  • classList: agrega, quita o alterna clases CSS.
  • setAttribute(): agrega atributos.
  • getAttribute(): obtiene el valor de un atributo.

Template strings o plantillas literales

Los template strings permiten crear cadenas de texto de forma más clara y flexible usando comillas invertidas ` `.

const nombre = 'Ana';
const saludo = `Hola, ${nombre}`;
console.log(saludo);

Se usan para:

  • insertar variables dentro de textos
  • crear mensajes más legibles
  • escribir HTML dinámico con interpolación
const producto = 'Laptop';
const mensaje = `El producto seleccionado es ${producto}`;

Matemáticas en JavaScript

JavaScript usa operadores matemáticos básicos y el objeto global Math para operaciones más avanzadas.

Operadores básicos

const suma = 2 + 3;
const resta = 10 - 4;
const multiplicacion = 5 * 6;
const division = 12 / 3;
const modulo = 10 % 3; // resto de la división
const exponente = 2 ** 3; // 8

Prioridad de operaciones

JavaScript respeta el orden matemático: paréntesis, exponentes, multiplicación/división, suma/resta.

const resultado = 2 + 3 * 4;      // 14
const correcto = (2 + 3) * 4;      // 20

Incremento y decremento

let contador = 1;
contador++; // 2
contador--; // 1
let doble = contador * 2;

El objeto Math

Math incluye funciones y constantes útiles para cálculos.

  • Math.PI: valor de pi.
  • Math.abs(x): valor absoluto.
  • Math.round(x): redondea al entero más cercano.
  • Math.floor(x): redondea hacia abajo.
  • Math.ceil(x): redondea hacia arriba.
  • Math.sqrt(x): raíz cuadrada.
  • Math.pow(x, y): potencia.
  • Math.max(...valores): mayor valor.
  • Math.min(...valores): menor valor.
  • Math.random(): número aleatorio entre 0 y 1.
  • Math.trunc(x): elimina decimales.
  • Math.sign(x): indica si es negativo, positivo o cero.
const pi = Math.PI;
const valorAbsoluto = Math.abs(-5);
const redondeo = Math.round(3.2);
const mayor = Math.max(1, 5, 3);
const aleatorio = Math.random();

Usos comunes

Se usa Math para calcular distancias, generar valores aleatorios, animaciones, validaciones numéricas y gráficos.

También sirve para obtener valores exactos y trabajar con porcentajes y valores de interfaz.

Peticiones con fetch: cómo funcionan las solicitudes y respuestas

fetch permite pedir datos a un servidor desde JavaScript. Esto es fundamental para trabajar con APIs, cargar información dinámica y actualizar una página sin recargarla por completo.

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(res => res.json())
  .then(data => console.log(data));
Una petición web tiene dos partes importantes: la solicitud que envía el cliente y la respuesta que devuelve el servidor.

1. Qué ocurre al hacer una petición

  • El navegador crea una solicitud HTTP.
  • El servidor recibe esa solicitud.
  • El servidor prepara una respuesta.
  • JavaScript recibe la respuesta y la convierte en datos útiles.

2. Ejemplo de una respuesta en JSON

{
  "userId": 1,
  "id": 1,
  "title": "Ejemplo de título",
  "body": "Este es el contenido que llega desde el servidor"
}

El JSON es un formato de texto muy usado para enviar información entre un navegador y un servidor. JavaScript puede leerlo y transformarlo en objetos reales.

3. Tipos de códigos de estado HTTP

  • 200 OK: la solicitud fue exitosa y el servidor devolvió los datos.
  • 201 Created: se creó un recurso nuevo correctamente.
  • 204 No Content: la operación fue exitosa, pero no hay contenido para mostrar.
  • 400 Bad Request: la solicitud tiene un error de formato o datos incorrectos.
  • 401 Unauthorized: falta autenticación o permisos.
  • 403 Forbidden: el usuario no tiene permiso para acceder al recurso.
  • 404 Not Found: no se encontró el recurso solicitado.
  • 500 Internal Server Error: ocurrió un error interno en el servidor.

4. Cómo se leen las respuestas en JavaScript

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(respuesta => {
    if (!respuesta.ok) {
      throw new Error('Hubo un problema con la petición');
    }
    return respuesta.json();
  })
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });

En este ejemplo, respuesta.ok indica si la petición fue exitosa. Si no lo fue, se muestra un error. Luego se convierte la respuesta en JSON con respuesta.json().

5. ¿Por qué son importantes?

Las peticiones y respuestas permiten que una web se conecte con servicios reales, recupere datos, envíe formularios, consulte productos, usuarios, noticias o información en tiempo real. Sin este proceso, una página sería estática y no podría interactuar con el resto del mundo.

Almacenamiento en el navegador: localStorage, sessionStorage y cookies

El navegador ofrece varias formas de guardar datos en el cliente. Las más importantes son localStorage, sessionStorage y cookies.

Qué es localStorage

localStorage es un espacio de almacenamiento que permanece incluso después de cerrar el navegador. Los datos se guardan en el navegador y solo se pueden leer desde el mismo origen (protocolo, dominio y puerto).

Se usa para guardar configuraciones, preferencias de usuario y datos que deben mantenerse entre sesiones.

// Guardar datos en localStorage
localStorage.setItem('tema', 'oscuro');
localStorage.setItem('usuario', JSON.stringify({ nombre: 'Ana', email: 'ana@example.com' }));

// Leer datos
const tema = localStorage.getItem('tema');
const usuario = JSON.parse(localStorage.getItem('usuario'));

// Eliminar datos
localStorage.removeItem('tema');

// Limpiar todo el almacenamiento local
localStorage.clear();

Qué es sessionStorage

sessionStorage guarda datos solo mientras la pestaña o ventana está abierta. Cuando se cierra, esos datos se eliminan automáticamente. Es útil para datos temporales como borradores de formularios, pasos de un flujo o información que no debe persistir al cerrar la pestaña.

// Guardar datos en sessionStorage
sessionStorage.setItem('pasoActual', '2');

// Leer datos
const paso = sessionStorage.getItem('pasoActual');

// Eliminar datos
sessionStorage.removeItem('pasoActual');

Qué son las cookies

Las cookies son pequeños archivos de texto que el navegador guarda y envía automáticamente al servidor en cada petición al mismo dominio. Por eso se usan mucho para mantener sesiones de usuario, recordar preferencias en el servidor y manejar autenticación.

Las cookies pueden tener una fecha de caducidad, un alcance de ruta o dominio, y opciones de seguridad como Secure y SameSite.

// Crear o actualizar una cookie
const valor = 'oscuro';
document.cookie = `tema=${valor}; path=/; max-age=${60 * 60 * 24 * 7}; secure; samesite=strict`;

// Leer una cookie
function obtenerCookie(nombre) {
  return document.cookie
    .split('; ')
    .find(fila => fila.startsWith(nombre + '='))
    ?.split('=')[1];
}

const temaCookie = obtenerCookie('tema');

// Eliminar una cookie
document.cookie = 'tema=; path=/; max-age=0';

Diferencias clave

  • Alcance: localStorage y sessionStorage solo en el cliente; cookies se envían al servidor con cada petición.
  • Duración: localStorage persiste hasta que se borre; sessionStorage dura solo mientras la pestaña está abierta; cookies duran según su caducidad.
  • Tamaño: localStorage/sessionStorage suelen permitir varios megabytes; cookies están limitadas a unos pocos kilobytes.
  • Acceso desde JavaScript: localStorage y sessionStorage son accesibles libremente desde JS; cookies también, excepto cuando son HttpOnly.
  • Uso típico: localStorage para preferencias y datos persistentes de cliente; sessionStorage para datos temporales de sesión; cookies para sesión de servidor, autenticación y datos que el servidor necesita en cada petición.

Cuándo usar cada uno

  • localStorage: temas de usuario, idioma, última página visitada, configuraciones que deben persistir.
  • sessionStorage: formularios de un solo flujo, páginas de compra, datos temporales que no deben persistir tras cerrar la pestaña.
  • cookies: identificación de sesión en el servidor, preferencias compartidas con el servidor, datos de seguimiento y opciones de seguridad.
No almacenes contraseñas ni tokens sensibles en localStorage o cookies accesibles desde JavaScript. Para datos de autenticación se recomienda usar cookies seguras con HttpOnly y Secure en el servidor.

Actividades del módulo

En clase

  • Mostrar un mensaje al cargar la página.
  • Responder a un clic en un botón.
  • Modificar texto con JavaScript.

Para la casa

  • Crear una función que sume dos números.
  • Validar un formulario simple.
  • Ocultar y mostrar contenido con un botón.

Proyecto

  • Agregar interactividad a una página HTML y CSS previamente creada.
  • Usar eventos, funciones y manipulación del DOM.