Eu queria saber, o JavaScript oferece uma variedade de métodos para obter o primeiro elemento filho de qualquer elemento, mas qual é o melhor? Pelo melhor, quero dizer: mais compatível com vários navegadores, mais rápido, mais abrangente e previsível quando se trata de comportamento. Uma lista de métodos / propriedades que eu uso como alias:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Isso funciona para os dois casos:
var child = elem.childNodes[0]; // or childNodes[1], see below
Isso é no caso de formulários ou <div>
iteração. Se eu encontrar elementos de texto:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Tanto quanto eu posso trabalhar, firstChild
usa o NodeList de childNodes
, e firstElementChild
usa children
. Estou baseando essa suposição na referência MDN:
childNode
é uma referência ao primeiro elemento filho do nó do elemento ounull
se não houver um.
Eu estou supondo que, em termos de velocidade, a diferença, se houver, será quase nula, já que firstElementChild
é efetivamente uma referência children[0]
e o children
objeto já está na memória de qualquer maneira.
O que me joga, é o childNodes
objeto. Eu usei para dar uma olhada em um formulário, em um elemento de tabela. Enquanto children
lista todos os elementos do formulário, childNodes
também parece incluir espaço em branco no código HTML:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Ambos log <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Todos os log <input type="text"
... >
. Por quê? Eu entenderia que um objeto me permitiria trabalhar com o código HTML "bruto", enquanto o outro adere ao DOM, mas o childNodes
elemento parece funcionar nos dois níveis.
Para voltar à minha pergunta inicial, meu palpite seria: se eu quero o objeto mais abrangente, childNodes
é o caminho a percorrer, mas, devido à sua abrangência, pode não ser o mais previsível em termos de retorno do elemento que eu quero / esperar a qualquer momento. O suporte a vários navegadores também pode ser um desafio nesse caso, embora eu possa estar errado.
Alguém poderia esclarecer a distinção entre os objetos em questão? Se houver uma diferença de velocidade, ainda que insignificante, eu também gostaria de saber. Se eu estiver vendo tudo errado, sinta-se à vontade para me educar.
PS: Por favor, por favor, eu gosto de JavaScript, então sim, quero lidar com esse tipo de coisa. Respostas como "o jQuery lida com isso para você" não são o que estou procurando, portanto, nãojquery tag.