Me preguntaba, JavaScript ofrece una variedad de métodos para obtener el primer elemento hijo de cualquier elemento, pero ¿cuál es el mejor? Por mejor, quiero decir: la mayoría de los navegadores compatibles, más rápido, más completo y predecible cuando se trata de comportamiento. Una lista de métodos / propiedades que uso como alias:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Esto funciona para ambos casos:
var child = elem.childNodes[0]; // or childNodes[1], see below
Eso es en caso de formas o <div>
iteración. Si pudiera encontrar elementos de texto:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Hasta donde puedo trabajar, firstChild
usa la NodeList de childNodes
, y firstElementChild
usa children
. Estoy basando esta suposición en la referencia de MDN:
childNode
es una referencia al primer elemento hijo del nodo del elemento, onull
si no hay uno.
Supongo que, en términos de velocidad, la diferencia, si la hay, será casi nula, ya firstElementChild
que efectivamente es una referencia children[0]
y el children
objeto ya está en la memoria de todos modos.
Lo que me arroja es el childNodes
objeto. Lo he usado para echar un vistazo a un formulario, en un elemento de tabla. Si bien children
enumera todos los elementos del formulario, childNodes
también parece incluir espacios en blanco del 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);
Todo registro <input type="text"
... >
. ¿Cómo? Entiendo que un objeto me permitiría trabajar con el código HTML "en bruto", mientras que el otro se adhiere al DOM, pero el childNodes
elemento parece funcionar en ambos niveles.
Para volver a mi pregunta inicial, mi suposición sería: si quiero el objeto más completo, childNodes
es el camino a seguir, pero debido a su exhaustividad, puede que no sea el más predecible en términos de que devuelva el elemento que quiero / esperar en cualquier momento dado. La compatibilidad entre navegadores también podría ser un desafío en ese caso, aunque podría estar equivocado.
¿Alguien podría aclarar la distinción entre los objetos en cuestión? Si hay una diferencia de velocidad, por insignificante que sea, también me gustaría saberlo. Si veo todo esto mal, no dudes en educarme.
PD: Por favor, por favor, me gusta JavaScript, así que sí, quiero lidiar con este tipo de cosas. Respuestas como "jQuery trata esto para usted" no son lo que estoy buscando, por lo tanto, nojquery etiqueta.