The querySelectorAll()
method is used for selecting all elements of a specific type in JavaScript. It returns a list of DOM elements that match the specified selectors.
The returned list is not an array but a NodeList
object containing a collection of nodes:
// select all anchor tags
const anchors = document.querySelectorAll('a.open-article')
// TODO: iterate over `NodeList` elements and attach a click handler
There are many ways to loop through a NodeList
object in JavaScript. Let us look at them.
forEach()
Method
The simplest and easiest way to loop over the results returned by querySelectorAll()
is by using the forEach()
method. It executes the given function once for each node in the NodeList
.
Here is an example:
anchors.forEach(anchor => {
anchor.addEventListener('click', () => {
console.log('Link is clicked!')
})
})
The forEach()
method for NodeList
only works in modern browsers. If you want to support old browsers like Internet Explorer, use the following little hack instead:
;[].forEach.call(anchors, function (anchor) {
anchor.addEventListener('click', function () {
console.log('Link is clicked!')
})
})
You can also use the spread operator to convert the NodeList
to an Array
object. This will give you access to all the array methods, including forEach()
:
;[...anchors].forEach(anchor => {
anchor.addEventListener('click', () => {
console.log('Link is clicked!')
})
})
for...of
Loop
Another way to loop through a NodeList
object is using the ES6 for...of statement. It has a clean and concise syntax and is supported by all modern browsers:
for (const anchor of anchors) {
anchor.addEventListener('click', () => {
console.log('Link is clicked!')
})
}
Modern browsers also support entries()
, keys()
, and values()
methods on a NodeList
object. These methods return an iterator allowing you to loop through all key-value pairs. The values are always Node
objects:
// entries() can be replaced with keys() or values()
for (const anchor of anchors.entries()) {
anchor.addEventListener('click', () => {
console.log('Link is clicked!')
})
}
for
Loop
If you want to support the maximum number of browsers, including Internet Explorer (IE), the good old for
loop is the way to go:
for (let i = 0; i < anchors.length; i++) {
anchors[i].addEventListener('click', () => {
console.log('Link is clicked!')
})
}
3rd-Party Libraries
If you are already using jQuery, there is no need to use any of the above methods:
$('a.open-article').on('click', () => {
console.log('Link is clicked!')
})
In JavaScript frameworks like Angular, React, and Vue, use Lodash's _.forEach
method:
_.forEach(anchors, (anchor, key) => {
anchor.addEventListener('click', () => {
console.log('Link is clicked!')
})
})
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.