getElementsByTagName
renvoie une HTMLCollection
, qui n'a pas de méthode forEach
. Mais il existe une astuce simple qui vous permettra d'itérer avec forEach
sans créer un tableau intermédiaire : utilisez plutôt querySelectorAll
. querySelectorAll
renvoie une NodeList
, et les navigateurs modernes ont une méthode NodeList.prototype.forEach
:
document.querySelectorAll('input')
.forEach((input) => {
console.log(input.value);
});
Un autre avantage d'utiliser querySelectorAll
est qu'il accepte des sélecteurs CSS séparés par des virgules, beaucoup plus flexibles et précis que les simples noms de balises. Par exemple, le sélecteur
.container1 > span, .container2 > span
ne correspondra qu'aux span
qui sont des enfants d'éléments avec une classe container1
ou container2
:
document.querySelectorAll('.container1 > span, .container2 > span')
.forEach((span) => {
span.classList.add('highlight');
});
.highlight {
background-color: yellow;
}
foo
bar
baz
buzz
Si vous souhaitez utiliser NodeList.prototype.forEach
sur des navigateurs anciens qui n'ont pas cette méthode intégrée, il suffit d'ajouter un polyfill. Le code suivant fonctionnera sur IE11 :
// Polyfill:
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = function(callback, thisArg) {
thisArg = thisArg || window;
for (var i = 0; i < this.length; i++) {
callback.call(thisArg, this[i], i, this);
}
};
}
// Main code:
document.querySelectorAll('.container1 > span, .container2 > span')
.forEach(function(span) {
span.classList.add('highlight');
});
.highlight {
background-color: yellow;
}
foo
bar
baz
buzz