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, firstChildusa o NodeList de childNodes, e firstElementChildusa children. Estou baseando essa suposição na referência MDN:
childNodeé uma referência ao primeiro elemento filho do nó do elemento ounullse 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 childrenobjeto já está na memória de qualquer maneira.
O que me joga, é o childNodesobjeto. Eu usei para dar uma olhada em um formulário, em um elemento de tabela. Enquanto childrenlista todos os elementos do formulário, childNodestambé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 childNodeselemento 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.