Command Palette

Search for a command to run...

getElementsBy... y querySelectorAll: Selección Múltiple de Elementos

Aprende a seleccionar múltiples elementos del DOM usando getElementsByClassName, getElementsByTagName y querySelectorAll, entendiendo sus diferencias y cuándo usar cada uno.

Lectura: 13 min
Nivel: Principiante

TL;DR - Resumen rápido

  • getElementsByClassName selecciona elementos por su atributo class
  • getElementsByTagName selecciona elementos por su etiqueta HTML
  • querySelectorAll acepta cualquier selector CSS y retorna todos los elementos coincidentes
  • getElementsBy... retornan HTMLCollection (viva), querySelectorAll retorna NodeList (estática)
  • Convierte las colecciones a Array para usar métodos como map y filter

Introducción a Selección Múltiple

A veces necesitas seleccionar múltiples elementos del DOM en lugar de solo uno. JavaScript proporciona varios métodos para esto, siendo los más importantes getElementsByClassName,getElementsByTagName y querySelectorAll. Cada uno tiene sus propias características y casos de uso específicos.

La selección múltiple es fundamental para manipular listas, tablas, formularios con múltiples campos, o cualquier grupo de elementos relacionados. Entender las diferencias entre estos métodos te ayudará a elegir el correcto para cada situación.

¿Por qué hay múltiples métodos de selección múltiple?

Los diferentes métodos de selección múltiple existen porque cada uno tiene sus propias ventajas. getElementsByClassName y getElementsByTagNameson más rápidos pero menos flexibles, mientras que querySelectorAllacepta cualquier selector CSS pero puede ser más lento.

getElementsByClassName

El método getElementsByClassName selecciona todos los elementos que tienen una clase específica. Es importante notar que busca elementos que contengan la clase, no necesariamente que tengan solo esa clase. Un elemento puede tener múltiples clases.

Sintaxis Básica

La sintaxis de getElementsByClassName es simple: pasas el nombre de la clase como un string. El método retorna una HTMLCollectionque contiene todos los elementos coincidentes.

getelementsbyclassname-basico.js
Loading code...

Este ejemplo muestra el uso básico de getElementsByClassName. Observa que la búsqueda es por clase, no por ID u otros atributos. El método retorna una colección viva que se actualiza automáticamente cuando el DOM cambia.

Clases múltiples

Un elemento puede tener múltiples clases. getElementsByClassName('clase1')encontrará elementos que tengan class="clase1", class="clase1 clase2", o class="otra clase1". La búsqueda encuentra elementos que contengan la clase especificada.

Rendimiento de getElementsByClassName

getElementsByClassName es generalmente más rápido quequerySelectorAll('.clase') porque los navegadores optimizan la búsqueda por clases. Sin embargo, la diferencia suele ser pequeña en documentos de tamaño moderado.

rendimiento-getelementsbyclassname.js
Loading code...

Este ejemplo muestra que getElementsByClassName puede ser más rápido que querySelectorAll cuando buscas por clase. En aplicaciones con muchos elementos, esta diferencia puede ser notable.

getElementsByTagName

El método getElementsByTagName selecciona todos los elementos de un tipo específico, como todos los párrafos, todas las imágenes o todos los enlaces. Es extremadamente útil cuando necesitas trabajar con todos los elementos de un mismo tipo.

Sintaxis Básica

La sintaxis de getElementsByTagName requiere el nombre de la etiqueta HTML como un string. Puedes usar '*' para seleccionar todos los elementos del documento.

getelementsbytagname-basico.js
Loading code...

Este ejemplo muestra el uso básico de getElementsByTagName. Observa que el nombre de la etiqueta es case-insensitive en HTML, pero es buena práctica usar minúsculas para consistencia.

  • <strong>'p'</strong>: Selecciona todos los elementos <p>
  • <strong>'div'</strong>: Selecciona todos los elementos <div>
  • <strong>'img'</strong>: Selecciona todas las imágenes
  • <strong>'a'</strong>: Selecciona todos los enlaces
  • <strong>'*'</strong>: Selecciona todos los elementos del documento

getElementsByTagName con Contexto

Al igual que querySelector, getElementsByTagName puede usarse en cualquier elemento del DOM para limitar la búsqueda a sus descendientes. Esto es más eficiente que buscar en todo el documento.

getelementsbytagname-contexto.js
Loading code...

Este ejemplo muestra cómo usar getElementsByTagName con contexto. Buscar dentro de un elemento específico es más eficiente porque limita el alcance de la búsqueda.

Eficiencia con contexto

Usar getElementsByTagName con contexto es una excelente práctica de rendimiento. En lugar de buscar en todo el documento, limita la búsqueda al contenedor más pequeño posible donde esperas encontrar los elementos.

querySelectorAll

El método querySelectorAll es el más flexible de todos los métodos de selección múltiple. Acepta cualquier selector CSS válido y retorna unaNodeList estática con todos los elementos coincidentes.

Sintaxis Básica

La sintaxis de querySelectorAll es idéntica a la dequerySelector, pero retorna todos los elementos coincidentes en lugar de solo el primero. Puedes usar cualquier selector CSS válido.

queryselectorall-basico.js
Loading code...

Este ejemplo muestra la flexibilidad de querySelectorAll. Puedes usar cualquier selector CSS, lo que lo hace extremadamente versátil para encontrar grupos de elementos de forma precisa.

Iterando con forEach

La NodeList retornada por querySelectorAll tiene un método forEach integrado en navegadores modernos, lo que facilita la iteración sobre los elementos seleccionados.

queryselectorall-foreach.js
Loading code...

Este ejemplo muestra cómo iterar sobre una NodeList usandoforEach. Esta es la forma más moderna y legible de iterar sobre elementos seleccionados con querySelectorAll.

NodeList vs HTMLCollection

Una diferencia crucial entre los métodos de selección es el tipo de colección que retornan.getElementsByClassName y getElementsByTagName retornanHTMLCollection, mientras que querySelectorAll retornaNodeList. Entender esta diferencia es esencial.

nodelist-vs-htmlcollection.js
Loading code...

Este ejemplo muestra las diferencias clave entre HTMLCollection yNodeList. La HTMLCollection es viva (se actualiza automáticamente), mientras que la NodeList de querySelectorAlles estática.

Colecciones vivas vs estáticas

Una HTMLCollection es viva: si añades o eliminas elementos del DOM, la colección se actualiza automáticamente. Una NodeList dequerySelectorAll es estática: no cambia después de creada. Esto puede causar bugs inesperados si no tienes cuidado.

Errores Comunes

Al trabajar con selección múltiple de elementos, hay varios errores que los desarrolladores cometen frecuentemente. Conocer estos errores te ayudará a evitarlos y escribir código más robusto.

No Convertir a Array

Un error común es intentar usar métodos de Array como map, filtero reduce directamente en una HTMLCollection oNodeList. Estos métodos no existen en estas colecciones.

error-no-convertir-array.js
Loading code...

Este ejemplo muestra el error de no convertir a Array y cómo solucionarlo. Convierte la colección a Array usando Array.from() o el spread operator para acceder a todos los métodos de Array.

Modificar Colección Viva

Otro error común es modificar una HTMLCollection mientras iteras sobre ella. Como la colección es viva, los cambios afectan la iteración actual, lo cual puede causar comportamiento inesperado.

error-coleccion-viva.js
Loading code...

Este ejemplo muestra el error de modificar una colección viva durante la iteración. Convierte la colección a Array antes de iterar si planeas modificar el DOM.

Iteración segura

Si necesitas modificar el DOM mientras iteras sobre elementos seleccionados congetElementsByClassName o getElementsByTagName, convierte la colección a Array primero: Array.from(coleccion).forEach(...). Esto evita problemas con colecciones vivas.

Resumen: Selección Múltiple de Elementos

Conceptos principales:

  • getElementsByClassName selecciona elementos por su atributo class
  • getElementsByTagName selecciona elementos por su etiqueta HTML
  • querySelectorAll acepta cualquier selector CSS y retorna todos los elementos
  • HTMLCollection es viva, NodeList de querySelectorAll es estática
  • Convierte colecciones a Array para usar métodos como map y filter

Mejores prácticas:

  • Usa getElementsByClassName/TagName para mejor rendimiento en búsquedas simples
  • Usa querySelectorAll para selectores complejos o cuando necesitas NodeList
  • Convierte a Array antes de iterar si planeas modificar el DOM
  • Usa forEach en NodeList de querySelectorAll en navegadores modernos
  • Usa contexto para limitar el alcance de la búsqueda