Aprende a controlar el DOM con JavaScript paso a paso. Desde la consola del navegador hasta selectores modernos y métodos clásicos, verás cómo leer, recorrer y preparar la manipulación de una landing de productos. Conoce qué es Document Object Model, cómo funciona su estructura en árbol y qué devuelve cada método al seleccionar elementos.
¿Qué es el DOM y cómo se conecta con JavaScript?
El DOM (Document Object Model) es la representación estructurada del documento HTML en forma de árbol. Cada etiqueta es un nodo con propiedades y relaciones. JavaScript puede leer, modificar, crear y eliminar estos nodos para cambiar contenido, estructura y estilos de una página.
Estructura en árbol: nodos padre e hijo que representan el HTML.
Acciones clave: leer, recorrer, modificar dinámicamente y estilizar.
Objetivo práctico: preparar una landing de productos para futuras inserciones dinámicas.
Además, se sugiere usar la extensión Live Server para correr un servidor local con recargas en tiempo real. Esto permite ver cambios inmediatos en el navegador basado en Chromium como Chrome.
¿Cómo inspeccionar y acceder al documento con la consola?
Abre las herramientas de desarrollador e ingresa a la consola. Desde ahí puedes obtener el documento completo o secciones específicas como head y body. También puedes inspeccionar visualmente elementos y su jerarquía.
Identificar etiquetas clave: en body verás elementos como header, main y footer, además de un script inyectado por Live Server para la recarga en tiempo real.
¿Cómo validar visualmente elementos en el inspector?
Usa inspeccionar para resaltar cada nodo en la página.
Confirma la estructura y las clases que vas a consultar.
Observa propiedades disponibles como innerHTML o draggable según el tipo de nodo.
¿Qué selectores y métodos usar para leer elementos del DOM?
Primero, practica con selectores modernos. Luego, refuerza con métodos clásicos que devuelven colecciones. Entiende qué retorna cada uno: un único nodo, una NodeList o una HTMLCollection.
¿Cómo usar querySelector y querySelectorAll?
Seleccionar por etiqueta, clase o id. Devuelve el primer match.
// Por etiquetadocument.querySelector('header')// Por clasedocument.querySelector('.producto')// Por iddocument.querySelector('#btnComprar')// Por etiqueta específicadocument.querySelector('h1')// "Productos útiles, entrega rápida"
Seleccionar todos los elementos que coinciden con la clase. Devuelve una NodeList indexable.
getElementById() → por id → devuelve 1 elemento
getElementsByClassName() → por clase → devuelve HTMLCollectiongetElementsByTagName() → por etiqueta → devuelve HTMLCollectionquerySelector()→ selector CSS → devuelve 1 elemento
querySelectorAll() → selector CSS → devuelve NodeList
Tip: querySelector() y querySelectorAll() son muy usados hoy en día porque permiten usar selectores CSS como .clase, #id, div p, etc.
Comparto los retos que vi en 21-seleccionar-elementos-dom
// ============================================// Reto: Seleccionar elementos del DOM con JavaScript// ============================================// Completa cada función según las instrucciones.// Ejecuta los tests con: npx vitest src/21-seleccionar-elementos-dom// ============================================// --- Reto 1: Seleccionar elemento por ID ---// Usa getElementById para seleccionar el elemento con id "titulo-principal"// y retorna su contenido de texto (textContent).functionobtenerTextoPorId(Id){// Tu código aquíreturndocument.getElementById(Id).textContent;}// --- Reto 2: Seleccionar elemento por clase con querySelector ---// Usa querySelector para seleccionar el primer elemento con clase "producto"// y retorna su contenido HTML (innerHTML).functionobtenerHTMLPorClase(className){// El ?. evita que el código explote si el elemento no existe (devuelve undefined) returndocument.querySelector(`.${className}`)?.innerHTML ||'';}// --- Reto 3: Seleccionar todos los elementos por etiqueta ---// Usa getElementsByTagName para seleccionar todos los elementos <button>// y retorna la cantidad de elementos encontrados.functioncontarBotones(element){// Tu código aquí//getElementByTagName devuelve una listareturndocument.getElementsByTagName(element).length}// --- Reto 4: Seleccionar múltiples elementos por clase ---// Usa querySelectorAll para seleccionar todos los elementos con clase "nav-link"// y retorna un array con los textContent de cada elemento.functionobtenerTextosNavegacion(){// Tu código aquí//capturar elementos: // querySelectorAll devuelve un NodeList (no un Array)const elementos =document.querySelectorAll('.nav-link');//transformar los elementos. Necesito Array.from() para poder usar .map() y extraer datosreturnArray.from(elementos).map(el=> el.textContent);}// --- Reto 5: Seleccionar elementos por clase clásica ---// Usa getElementsByClassName para seleccionar todos los elementos con clase "producto"// y retorna la cantidad de elementos encontrados.functioncontarProductosClase(){// Tu código aquíreturndocument.getElementsByClassName('producto').length;}// --- Reto 6: Selector combinado ---// Usa querySelector para seleccionar el primer elemento que tenga// clase "producto" y sea descendiente de un elemento con clase "destacados"// y retorna su atributo id si existe, o null si no tiene.functionobtenerIdProductoDestacado(){// Tu código aquíreturndocument.querySelector('.destacados .producto').id?.id||null;}// --- Reto 7: Selector de atributo ---// Usa querySelectorAll para seleccionar todos los elementos que tengan// el atributo "data-categoria" y retorna un array con los valores de dicho atributo.functionobtenerCategoriasPorAtributo(){// Tu código aquí//se usa [] porque es el valor del atributoconst elements=document.querySelectorAll('[data-categoria]');//Los corchetes deben ir dentro de las comillas para que el navegador los interprete como una búsqueda de atributo.//getAttribute se usa aquí porque data-categoria es un atributo personalizado.//getAttribute es la forma universal y explícita de pedirle al navegador: "dame el valor que está escrito en esta etiqueta".returnArray.from(elements).map(el=> el.getAttribute('data-categoria'));}// --- Reto 8: Selector de pseudo-clase ---// Usa querySelectorAll para seleccionar el primer elemento <li> de cada lista <ul>// usando la pseudo-clase :first-child y retorna un array con sus textos.functionobtenerPrimerosElementosLista(){// Tu código aquí//La Regla del Selector: ¿Es un string? ¿Usa la sintaxis correcta (. para clase, # para ID, [] para atributo, espacio para descendiente)?const firstElement=document.querySelectorAll('ul li:first-child');//como es una lista, no puedo aplicar .textContent directo; necesito .map().returnArray.from(firstElement).map(element=> element.textContent);}// --- Reto 9: Selector jerárquico ---// Usa querySelector para seleccionar el elemento <h1> dentro del <header>// y retorna su texto. Si no existe, retorna "No encontrado".functionobtenerTituloHeader(){// Tu código aquíreturndocument.querySelector('header h1')?.textContent||'No encontrado';}// --- Reto 10: Selector múltiple ---// Usa querySelectorAll para seleccionar todos los elementos que sean// <h2>, <h3> o tengan clase "subtitulo" y retorna la cantidad total.functioncontarTitulosYSubtitulos(){// Tu código aquí//la , simboliza 'esto O esto O esto'returndocument.querySelectorAll('h2, h3, .subtitulo')?.length;}module.exports={ obtenerTextoPorId, obtenerHTMLPorClase, contarBotones, obtenerTextosNavegacion, contarProductosClase, obtenerIdProductoDestacado, obtenerCategoriasPorAtributo, obtenerPrimerosElementosLista, obtenerTituloHeader, contarTitulosYSubtitulos,};
donde esta la sección de recursos? @Profe
Si te refieres a que no encontraste el HTML, lo puedes encontrar en