Introduction
When working with the Document Object Model (DOM) in web development, you often need to manipulate or iterate over a set of elements. These can be child elements within an element’s parent node. While it might seem straightforward to use array methods like forEach
on these collections, they are not arrays but rather HTMLCollection
objects. This tutorial explains what HTMLCollections
are, why direct application of array methods is problematic, and how you can iterate over them effectively using various techniques.
What is an HTMLCollection?
An HTMLCollection
is a live collection of DOM elements, often retrieved via properties like parentElement.children
, document.getElementsByTagName()
, or document.getElementsByClassName()
. It behaves similarly to an array in that it holds multiple items and has a length
property. However, it lacks many array methods such as forEach
, making direct iteration tricky.
Why Can’t We Use Array Methods Directly?
The primary reason we cannot use array methods directly on an HTMLCollection
is because these collections are not arrays; they’re objects that simulate arrays by having a length and index-based access to its elements. As a result, you can’t apply methods like forEach
, map
, or filter
out of the box.
Techniques for Iterating Over HTMLCollections
Let’s explore several techniques to iterate over an HTMLCollection
. Each method has its advantages, so choosing one depends on your specific use case and environment support.
1. Using Array.prototype.forEach
You can borrow array methods like forEach
using Array.prototype.call
or apply
, enabling you to iterate over the elements:
const parent = document.querySelector('.parent');
Array.prototype.forEach.call(parent.children, child => {
console.log(child);
});
This approach leverages the flexibility of JavaScript functions by explicitly setting their this
context.
2. Using Spread Operator
The spread operator (...
) converts an iterable or array-like object into a real array:
const parent = document.querySelector('.parent');
[...parent.children].forEach(child => {
console.log(child);
});
This method is clean and concise, ideal for modern environments supporting ES6.
3. Using for..of Loop
The for..of
loop provides a straightforward way to iterate over iterable objects, including HTMLCollection
:
const parent = document.querySelector('.parent');
for (const child of parent.children) {
console.log(child);
}
This is often the most readable and recommended method for environments supporting ES6.
4. Using Array.from
Array.from()
transforms an array-like object into a true array:
const parent = document.querySelector('.parent');
Array.from(parent.children).forEach(child => {
console.log(child);
});
This is particularly useful when you want to perform additional array operations after conversion.
5. Using Classic for Loop
For environments without ES6 support, the classic for
loop remains a reliable choice:
const parent = document.querySelector('.parent');
const children = parent.children;
for (let i = 0; i < children.length; i++) {
console.log(children[i]);
}
This method is universally compatible and straightforward.
Best Practices
- Choose the Right Method: Depending on browser support, choose a method that works best for your project. For modern browsers, ES6 methods like
for..of
and spread operator are preferred. - Understand Performance Implications: Converting an
HTMLCollection
to an array can have performance implications if done repeatedly in large loops. Consider caching the result if needed multiple times.
Conclusion
Iterating over HTMLCollections
requires understanding their nature as non-array objects. By using techniques like Array.prototype.forEach
, spread operator, or for..of
loops, you can effectively navigate and manipulate these collections. Choose the method that best fits your project requirements and browser compatibility needs to ensure efficient DOM manipulation.