Najlepszy sposób na uzyskanie węzłów potomnych

Zastanawiałem się, czy JavaScript oferuje wiele metod, aby uzyskać pierwszy element potomny z dowolnego elementu, ale który jest najlepszy? Mam na myśli: najbardziej kompatybilny z wieloma przeglądarkami, najszybszy, najbardziej wszechstronny i przewidywalny, jeśli chodzi o zachowanie. Lista metod / właściwości, których używam jako aliasów:

<code>var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
</code>

Działa to w obu przypadkach:

<code>var child = elem.childNodes[0]; // or childNodes[1], see below
</code>

Tak jest w przypadku formularzy lub<div> iteracja. Jeśli mogę napotkać elementy tekstowe:

<code>var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
</code>

O ile mogę to wypracować,firstChild używa listy węzłów zchildNodes, ifirstElementChild używachildren. Opieram to założenie na referencji MDN:

childNode jest odwołaniem do pierwszego elementu potomnego węzła elementu lubnull jeśli nie ma.

Zgaduję, że jeśli chodzi o szybkość, różnica, jeśli w ogóle, będzie prawie zerowa, ponieważfirstElementChild jest w rzeczywistości odniesieniem dochildren[0]ichildren obiekt i tak jest już w pamięci.

To, co mnie rzuca, tochildNodes obiekt. Użyłem go, aby przyjrzeć się formie w elemencie tabeli. Podczaschildren wyświetla wszystkie elementy formularza,childNodes wydaje się również zawierać białe znaki z kodu HTML:

<code>console.log(elem.childNodes[0]);
console.log(elem.firstChild);
</code>

Oba dzienniki<TextNode textContent="\n ">

<code>console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
</code>

Wszystkie dzienniki<input type="text">. Dlaczego? Rozumiem, że jeden obiekt pozwoliłby mi pracować z „surowym” kodem HTML, podczas gdy drugi trzyma się DOM, alechildNodes element wydaje się działać na obu poziomach.

Aby wrócić do mojego początkowego pytania, zgaduję, że jeśli chcę najbardziej wszechstronnego obiektu,childNodes jest droga, ale ze względu na jej wszechstronność, może nie być najbardziej przewidywalna pod względem zwrotu elementu, który chcę / oczekuję w danym momencie. Obsługa wielu przeglądarek może również okazać się wyzwaniem w tym przypadku, chociaż mogę się mylić.

Czy ktoś mógłby wyjaśnić różnicę między przedmiotami? Jeśli istnieje różnica prędkości, choćby nieistotna, chciałbym również wiedzieć. Jeśli widzę to wszystko źle, nie krępuj się mnie edukować.

PS: Proszę, proszę, lubię JavaScript, więc tak, chcę zajmować się tego rodzaju sprawami. Odpowiedzi takie jak „jQuery zajmuje się tym dla ciebie” nie są tym, czego szukam, stąd niejquery etykietka.

questionAnswers(5)

yourAnswerToTheQuestion