Seleccionar elementos
Un estante de panadería guarda un título y tres fichas. El título dice Rye. Las fichas nombran el turno: Morning, Noon y Evening. La última ficha lleva también la clase sold. El estante es un main con id shelf. Dentro hay un h2 con id loaf y luego tres elementos p con clase tag. Seleccionar es pedirle al documento vivo esos nodos por un nombre que tú eliges. document.getElementById("loaf") devuelve el título, y su texto es Rye. document.getElementsByClassName("tag") devuelve una lista viva de longitud 3. document.querySelector(".tag") devuelve Morning, la primera ficha. document.querySelectorAll(".tag") devuelve una lista fija, y el índice 1 es Noon. Un nombre que el estante nunca escribe es null desde querySelector, y una lista de longitud 0 desde querySelectorAll.
Cinco llamadas, no un paseo por el árbol
La página del DOM nombraba el padre de un título y contaba hijos elemento frente a todos los nodos. Esta página no lee parentElement, ni nextElementSibling, ni children, y no llama a Math. El árbol ya está. Aquí distingues qué llamada devuelve un nodo, cuál devuelve una lista y qué resultado significa que nada coincidió.
Qué devuelve cada llamada
Cuenta en el estante que solo tiene el título y las tres fichas. El archivo de lectura, más abajo, añade otro párrafo, así que allí cambia el recuento de elementos p.
📊 Qué devuelve cada llamada
| Llamada | Qué vuelve | En este estante | Fácil de confundir |
|---|---|---|---|
getElementById("loaf") |
un elemento, o null |
texto del título Rye | una lista que hay que indexar |
getElementsByClassName("tag") |
HTMLCollection viva |
longitud 3 | escribir el punto, como en .tag |
getElementsByTagName("p") |
HTMLCollection viva |
longitud 3 | el título, que es un h2 |
querySelector(".tag") |
primer acierto, o null |
la ficha Morning | todas las fichas |
querySelectorAll(".tag") |
NodeList estática |
longitud 3; el índice 1 es Noon | una colección viva |
querySelectorAll(".oven") |
NodeList vacía |
longitud 0 | null |
El método de clase y un selector CSS no escriben el punto igual. getElementsByClassName("tag") quiere el nombre pelado tag. getElementsByClassName(".tag") busca una clase que se llame literalmente .tag y devuelve longitud 0. querySelector quiere CSS, así que el punto se queda en .tag. querySelector("tag") busca un elemento cuyo nombre de etiqueta sea tag, no encuentra ninguno y devuelve null. El índice 0 es la primera ficha. El índice 1 es Noon. La lista de getElementsByClassName está viva: si una página posterior añade otra ficha tag, la longitud crece. querySelectorAll conserva la longitud del momento de la llamada. Evening lleva dos clases, tag y sold, así que entra en la lista de longitud 3 y es también el único acierto de sold.
Un id, un elemento
Un id debe ser único en la página. getElementById devuelve ese único elemento, o null si el id no está. No devuelve una lista, y solo existe en document, no en un elemento.
let loaf = document.getElementById("loaf");
console.log(loaf.textContent);
console.log(loaf === null);
La primera línea es Rye. La segunda es false, porque el título está en el estante. Si dos elementos compartieran el id loaf, la llamada seguiría devolviendo solo el primero del documento.
Nombre de clase y nombre de etiqueta
Las dos llamadas devuelven una HTMLCollection viva. Lee length antes de tomar una ficha. Cuenta en el estante de cuatro elementos, no en el archivo de lectura.
console.log(document.getElementsByClassName("tag").length);
console.log(document.getElementsByTagName("p").length);
console.log(document.getElementsByClassName("sold").length);
Las líneas son 3, 3 y 1. Tres fichas comparten tag. Las tres son elementos p y el título es un h2, así que en este estante el recuento de etiqueta coincide con el de clase. Solo Evening tiene sold. getElementsByClassName(".tag") es otra llamada: el punto no forma parte del nombre de clase, así que esa longitud es 0.
El primer acierto CSS
querySelector devuelve un elemento, el primero en el orden del documento, o null.
console.log(document.querySelector(".tag").textContent);
console.log(document.querySelector("#shelf .sold").textContent);
La primera línea es Morning. La segunda es Evening. #shelf .sold significa un elemento con clase sold dentro del estante, no el estante mismo. document.getElementById("shelf").querySelector(".sold") empieza en el estante y cae en esa misma ficha Evening.
Todos los aciertos y luego un índice
querySelectorAll devuelve cada acierto en una NodeList estática. La lista puede estar vacía. No es null.
let tags = document.querySelectorAll(".tag");
console.log(tags.length);
console.log(tags[1].textContent);
La longitud es 3. El índice 1 es Noon. El índice 0 es Morning y el índice 2 es Evening. Esta lista no crece si un script posterior añade una ficha. La HTMLCollection de getElementsByClassName("tag") sí crecería. Una es una foto del momento. La otra sigue viva.
Un nombre que el estante no escribió
Pide un id y una clase que no están en el archivo.
console.log(document.getElementById("oven"));
console.log(document.querySelector(".oven"));
console.log(document.querySelectorAll(".oven").length);
La primera línea es null. La segunda es null. La tercera es 0. querySelectorAll sigue devolviendo una lista cuando nada coincide, así que lees longitud 0, y la lista en sí no es null. getElementById no tiene lista que devolver, así que un fallo es null, no 0.
Una línea en la página
Un párrafo dice cuántas fichas tag hay, cuál es la primera y cuál es la ficha sold. El script va al final de body, cuando esos elementos ya existen. La línea no tiene clase tag, así que no es una de las tres.
<!DOCTYPE html>
<html>
<head>
<title>selecting — page</title>
</head>
<body>
<main id="shelf">
<h2 id="loaf">Rye</h2>
<p class="tag">Morning</p>
<p class="tag">Noon</p>
<p class="tag sold">Evening</p>
<p id="line">…</p>
</main>
<script>
let tags = document.querySelectorAll(".tag");
let line = document.getElementById("line");
line.textContent = tags.length + " / " + tags[0].textContent + " / " + document.querySelector(".sold").textContent;
</script>
</body>
</html>
El párrafo muestra 3 / Morning / Evening. En este archivo, getElementsByTagName("p") cuenta 4, porque la línea es otro p. querySelectorAll(".tag") sigue contando 3. La página siguiente cambia el HTML de elementos que estas llamadas ya encontraron.
Revisa el estante
- Anota el texto del título y espera Rye; luego la comprobación de null y espera false
- Anota la longitud de clase, la de
py la de sold: 3, 3 y 1 - Anota el texto del primer
.tagy espera Morning; luego#shelf .soldy espera Evening - Anota la longitud de
querySelectorAlly espera 3; el índice 1 debe ser Noon - Anota el id ausente y el
querySelectorausente y espera null las dos veces - Anota
querySelectorAll(".oven").lengthy espera 0 - Lee el párrafo y espera 3 / Morning / Evening
Llamada equivocada
La página sigue abierta. La llamada que escribiste pidió otra cosa.
- Pasar
.tagagetElementsByClassName; el punto solo cabe en un selector CSS - Pasar
tagsin punto aquerySelectory esperar las fichas - Leer el índice 1 como la primera ficha
- Tomar un fallo de
querySelectorAllcomonullen lugar de longitud 0 - Tomar un fallo de
getElementByIdcomo una lista de longitud 0 - Contar
getElementsByTagName("p")en el archivo de lectura y esperar 3 - Llamar a
.mapsobre laHTMLCollection; no es un array - Leer
parentElementen esta página; eso era la página del árbol
Qué te llevas
getElementByIddevuelve un elemento, onullgetElementsByClassNameygetElementsByTagNamedevuelven unaHTMLCollectionviva- El método de clase quiere
tag, no.tag querySelectordevuelve el primer acierto CSS, onullquerySelectorAlldevuelve unaNodeListestática; un fallo tiene longitud 0- El índice 0 es Morning y el índice 1 es Noon
- La página siguiente cambia el HTML de elementos que ya seleccionaste
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior