Este artigo é uma referência prática ao NodeList (JavaScript). As funções que acessam e selecionam elementos HTML em um página web retornam sempre um conjunto de elementos. Esse conjunto é denominado NodeList. Veja abaixo as funções:

  • document.getElementsByName()
  • document.getElementsByTagName()
  • document.getElementsByClassName()
  • document.querySelectorAll

A função document.getElementById() é a exceção, pois ela retorna um único elemento, logo, não temos um NodeList como resposta.

Ao criarmos um NodeList, podemos consultar o tamanho através da propriedade length e recuperar um elemento especifico através do método item(). Esse método recebe o index do elemento como parâmetro. Exemplos:

//
// Em um pagina contendo alguns parágrafos (tag `p`)...
//
var nodes = document.getElementsByTagName('p');

//
// O tamanho de NodeList
//
nodes.length

//
// Recuperando elementos - menos comum
//
var elem1 = nodes.item(0)
var elem2 = nodes.item(1)
var elem3 = nodes.item(2)

//
// Recuperando elementos de forma indexada - mais comum
//
var elem1 = nodes[0]
var elem2 = nodes[1]
var elem3 = nodes[2]

Percorrendo o NodeList

O objeto NodeList é semelhante a um array somente para leitura, portanto você iterar o objeto NodeList com um laço padrão:

var nodes = document.getElementsByTagName('p');

for (var i = 0; i < nodes.length; ++i) {
    console.log(nodes[i]);
}

Podemos utilizar forEach para iterar o NodeList? Não. O Nodelist é um objeto semelhante a um Array, apenas semelhante e, portanto, métodos específicos para arrays não funcionarão no NodeList. Na verdade, há uma forma indireta de se fazer isso utilizando Array.prototype.map.call().

Tipo

O NodeList é um tipo, porém não há um método nativo [ECMAScript 5] que faça essa verificação, por exemplo:

//
// Código imaginário
//
var nodes = document.getElementsByTagName('p');
nodes.isNodeList(); // Isto não existe

Por outro lado, pense: porque você precisaria confirmar se é ou não um NodeList?

O tipo de um nodelist é igual a "object", veja:

var nodes = document.getElementsByTagName('p');
typeof nodes === "object" // true

Seu conteúdo é dinâmico

Uma das características do NodeList é o fato dele ser dinâmico. Em outras palavras, sua lista pode variar à medida que o documento muda. Por exemplo, você recupera os parágrafos de uma página e descobre que possui 20 desses elementos. Após inserir um novo parágrafo, você consulta o tamanho de sua NodeList é percebe que agora possui 21 parágrafos.

//
// 20 parágrafos
//
var nodes = document.getElementsByTagName('p');
console.log(nodes.length);

//
// Inserindo um novo parágrafo
//
var elemBody = document.getElementsByTagName('body')[0];
elemBody.appendChild(document.createElement('p'));

//
// 21 parágrafos
//
console.log(nodes.length);

NodeList ou HTMLCollections ???

Se você conhece bem os console de navegadores e testou o retorno das funções que dissemos retornar um NodeList, verá que nem sempre temos um objeto NodeList mas sim um objeto HTMLCollection.

Outros métodos para acessarem elementos como por exemplo document.imagens e document.forms também retornam um objeto HTMLCollection.

São objetos distintos, porém tudo o que foi dito neste artigo para NodeList também se aplica ao HTMLCollection.