Un HTMLCollection
es un objeto similar a una matriz que representa una colección de elementos HTML extraídos del documento. Siempre es en vivo y pedido , lo que significa que las modificaciones al DOM se aplican automáticamente a los elementos de la colección.
En este artículo, veremos HTMLCollection
en detalle, qué es y cómo usarlo en JavaScript. También tocaremos brevemente la diferencia entre un HTMLCollection
y un NodeList que es otro objeto similar a HTMLCollection
.
Creando un HTMLCollection
El getElementsByTagName()
devuelve un HTMLCollection
objeto. El siguiente ejemplo selecciona todos <p>
elementos en el documento:
const elems = document.getElementsByTagName('p');
Se puede acceder a los elementos de la colección mediante un índice numérico, nombre o ID. Para acceder al tercer <p>
en la colección, puedes escribir:
const p = document.getElementsByTagName('p')[2];
Para acceder al elemento por nombre o ID, HTMLCollection
proporciona el namedItem()
método. El siguiente ejemplo obtiene el <p>
etiqueta con el ID notify
de la colección:
const elems = document.getElementsByTagName('p');
// select <p> with ID `notify`
const p = elems.namedItem('notify');
Longitud del HTMLCollection
Igual que NodeList
, el HTMLCollection
también es compatible con length
propiedad que devuelve el número total de elementos dentro de la colección:
const elems = document.getElementsByTagName('p');
// print total elements
console.log(elems.length);
El length
La propiedad es extremadamente útil cuando desea recorrer los elementos HTML de la colección:
const elems = document.getElementsByTagName('p');
// loop all collection elements
for (let i = 0; i < elems.length; i++) {
elems[i].style.color = 'red';
}
Iterando sobre un HTMLCollection
Además del bucle for simple, que discutimos anteriormente, la instrucción for...of también se puede usar para iterar un HTMLCollection
:
const elems = document.getElementsByTagName('p');
// iterate using for...of loop
for (const p of elems) {
console.log(p.innerText);
}
A diferencia de NodeList
, HTMLCollection
no es compatible con el método forEach(). Sin embargo, puedes usar el Array.from()
método para convertir HTMLCollection
a una matriz normal y luego use forEach()
iterar sobre él:
const elems = document.getElementsByTagName('p');
// itereate using forEach()
Array.from(elems).forEach((p, index) => {
console.log(p.innerText);
});
Eche un vistazo a esta guía para obtener más información sobre las diferentes formas de iterar sobre elementos DOM.
HTMLCollection
frente a matrices
Un HTMLCollection
El objeto puede parecer una matriz, pero no es una matriz. Ambos son dos cosas completamente diferentes. Al igual que una matriz, puede iterar a través de la colección y hacer referencia a sus elementos mediante un número de índice.
Sin embargo, no puede usar los métodos de matriz comunes como push()
, pop()
, join()
y valueOf()
en un HTMLCollecton
.
HTMLCollection
contra NodeList
Ambos HTMLCollection
y NodeList
son colecciones de elementos DOM. La única diferencia está en los métodos que proporcionan y en el tipo de nodos que pueden almacenar.
Un HTMLCollection
puede solo contener los elementos HTML, mientras que un NodeList
puede contener cualquier cosa, elementos HTML, comentarios, atributos, textos, etc.
Un HTMLCollection
proporciona los mismos métodos que un NodeList
y adicionalmente un método llamado nameItem()
para acceder a los elementos de la colección por nombre o DNI. El NodeList
solo se puede acceder a los elementos mediante un índice numérico.
Ambos NodeList
y HTMLCollection
son no matrices, por lo que no puede usar los métodos de matriz como push()
, pop()
, join()
y valueOf()
para los dos.
Resumen
En este artículo, aprendimos sobre el HTMLCollection
objeto y cómo usarlo en JavaScript. En pocas palabras:
- Un
HTMLCollection
es una colección similar a una matriz de elementos HTML . - Un
HTMLCollection
siempre está en vivo , lo que significa que puede modificar los elementos de la colección y los cambios se aplicarán automáticamente. - El
document.getElementsByTagName()
El método se puede utilizar para extraer unHTMLCollection
del DOM. - El
length
propiedad devuelve el número total de elementos dentro de unHTMLCollection
objeto. - Puede usar el bucle for simple (para navegadores antiguos) o la instrucción for...of para iterar sobre los elementos de la colección.
- Un
HTMLCollection
es no una matriz, por lo que no se pueden usar métodos de matriz comunes en ella. - Un
HTMLCollection
es similar a NodeList, pero solo almacena elementos HTML y proporciona un método adicional para acceder a elementos por nombre o ID.