Hoy · Hoja de ruta
- 1. Aprende: Cómo se cambia el texto, las clases, los atributos y el estilo de un elemento.
- 2. Haz: Cambia el estado visual de tu catálogo desde el código.
- 3. Comprueba: Cambias clases, no estilos en línea.
Antes de empezar · 5 minutos, sin apuntes
- Si un producto se agota, ¿qué debería cambiar en la página?
- ¿Dónde está escrito cómo se ve un producto agotado: en el CSS o en el JavaScript?
- ¿Qué riesgo ves en insertar texto escrito por un usuario dentro del HTML?
Contenido
const titulo = document.querySelector("h1");
titulo.textContent = "Catálogo de productos"; // texto plano: lo habitual
titulo.innerHTML = "Catálogo <strong>2026</strong>"; // interpreta etiquetas
Por defecto, textContent
Insertar con innerHTML un texto que venga de fuera —lo que alguien escribió en un campo, lo que devolvió una API— permite colar etiquetas y código en tu página. Es la vía de entrada de los ataques de inyección.
textContent escribe texto y solo texto: el contenido se muestra literalmente, sin interpretarse ni ejecutarse. Usa innerHTML únicamente con marcado que hayas escrito tú, y nunca con datos del usuario.
Clases: el puente con el CSS
const tarjeta = document.querySelector("[data-js='producto-1']");
tarjeta.classList.add("agotado");
tarjeta.classList.remove("agotado");
tarjeta.classList.toggle("destacado");
tarjeta.classList.contains("agotado"); // true / false
JavaScript pone clases; el CSS decide cómo se ven
Es la separación de capas de siempre, ahora en la tercera. Tu código dice qué está pasando —«esto está agotado», «esto está cargando»— y la hoja de estilos dice cómo se representa.
Si en lugar de eso escribes elemento.style.backgroundColor = "grey", has metido una decisión de diseño dentro del comportamiento: nadie la encontrará buscando en el CSS, y no responderá al modo oscuro ni al tema de la UD2.
Atributos y datos
const enlace = document.querySelector("a");
enlace.getAttribute("href");
enlace.setAttribute("href", "productos.html");
enlace.removeAttribute("target");
enlace.hasAttribute("download");
// Los atributos data- tienen su propio acceso
const tarjeta = document.querySelector("[data-id='7']");
tarjeta.dataset.id; // "7" ← siempre texto
Number(tarjeta.dataset.id); // 7
tarjeta.dataset.categoria = "teclados";
dataset será la forma de saber, en la semana 2, a qué producto corresponde el botón que se acaba de pulsar. Conviene observar de nuevo el mismo detalle: el valor llega como texto.
Estilos, y el caso en que sí valen
elemento.style.setProperty("--altura-imagen", "220px");
Cambiar una variable CSS de las que definiste en la UD2 sí es legítimo: el valor es un dato —una posición, una altura calculada, un porcentaje de progreso— y la regla que lo usa sigue viviendo en la hoja de estilos.
Tarea 3 · Estado visual desde el código
En tu página de productos, con el catálogo todavía escrito a mano en HTML:
- Marca con la clase
agotadolos productos sin stock, leyendo el dato dedataset. - Escribe en un párrafo cuántos productos hay disponibles.
- Añade un botón que alterne una clase de vista compacta en la lista.
- Cambia el
titlede la pestaña para incluir el número de resultados. - Prueba a hacer lo mismo con
styley explica por escrito por qué es peor.
textContent y observa qué se ve. Explica por qué eso es exactamente lo que quieres.Cierre de la semana 1
- Explicas qué es el DOM y por qué no es tu fichero.
- Seleccionas por anclajes pensados para el código.
- Cambias texto con
textContenty aspecto con clases. - Sabes por qué
innerHTMLcon datos ajenos es un riesgo.
Ver respuestas
1 · Porque permite insertar etiquetas y código que llegan desde fuera; textContent los muestra como texto.
2 · Añadiendo o quitando clases, para que el aspecto siga viviendo en el CSS.
3 · Como texto: dataset siempre devuelve cadenas y hay que convertir.
Microprueba semanal 1 · 5–10 minutos
Individual, sin IA y sin apuntes.
- Explica en dos líneas la diferencia entre tu fichero HTML y el DOM.
- Escribe la selección de un elemento por atributo
data-, y di qué devuelve si no lo encuentra. - ¿Por qué cambiamos una clase en lugar de un estilo en línea?