CodeForge

JavaScript de Cero a Experto / DOM a fondo

Atributos, classList y data-*

Teoría20 min20 XP

Un elemento es más que su texto: tiene atributos que lo configuran, clases que lo visten y — esto es oro — bolsillos data-* donde puedes guardarle TUS datos. Hoy aprendes a manejar los tres desde JavaScript, con la herramienta correcta para cada uno.

Atributos: casi siempre, propiedad directa

Los atributos estándar del HTML (href, src, value, disabled…) existen como PROPIEDADES del objeto — y así se usan el 90% de las veces:

Regla práctica: propiedad directa para los atributos estándar; getAttribute/setAttribute cuando el atributo no existe como propiedad o necesitas el valor tal cual está escrito en el HTML.

classList: el interruptor de estilos

Las clases ya saben verse bonitas — eso lo resolviste en CSS. Desde JS solo decides CUÁLES lleva puestas cada elemento:

¿Notaste el destructuring de la primera línea? El del módulo 5, aplicado a una NodeList. Y una advertencia de veterano: existe className (el string completo de clases), pero concatenarle strings para "agregar" una clase es frágil y borra lo que había. classList existe para no sufrir eso.

data-*: el bolsillo de datos del elemento

A veces el elemento necesita cargar información que no es contenido ni estilo: el id del gasto, su valor crudo, su categoría. Para eso el HTML permite atributos data-loquesea, y JavaScript los lee en el objeto dataset:

Dos trampas para tatuarse: todo lo que sale de dataset es string (¿sumar valores? Number() primero, como viste en el reduce), y los guiones del HTML se vuelven camelCase en JS: data-fecha-pago se lee dataset.fechaPago.

Cada li de tu lista lleva data-valor con el precio del gasto. Haces li.dataset.valor + li2.dataset.valor esperando la suma y obtienes '1800025000'. ¿Qué pasó?

Mini-reto

Combina las tres herramientas: en el último playground, agrega al CSS la clase .caro (color ámbar, negrilla) y desde JS pónsela con classList.add a los items cuyo dataset.valor supere 20000. Márcalos también con dataset.revisado = "si", y cierra contando en consola cuántos quedaron con classList.contains("caro"). Datos, clases y atributos trabajando juntos.

Qué sigue

classList cambia estilos indirectamente — la clase ya existía en CSS. Pero ¿y si el valor es dinámico, como el ancho de una barra de presupuesto que depende de cuánto has gastado? La próxima lección: estilos desde JavaScript, y cuál es la línea entre lo que se decide en JS y lo que SIEMPRE debe quedarse en CSS.