Zastanawiałem się, JavaScript oferuje wiele metod uzyskania pierwszego elementu potomnego z dowolnego elementu, ale który jest najlepszy? Mówiąc najlepiej, mam na myśli: najbardziej zgodny 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:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Działa to w obu przypadkach:
var child = elem.childNodes[0]; // or childNodes[1], see below
Tak jest w przypadku formularzy lub <div>
iteracji. Jeśli mogę napotkać elementy tekstowe:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
O ile mogę wypracować, firstChild
używa NodeList childNodes
i firstElementChild
używa children
. Opieram to założenie na referencji MDN:
childNode
jest odniesieniem do pierwszego elementu potomnego węzła elementu lubnull
jeśli go nie ma.
Zgaduję, że pod względem prędkości różnica, jeśli w ogóle, będzie prawie zerowa, ponieważ firstElementChild
jest to faktycznie odniesienie children[0]
, a children
obiekt i tak jest już w pamięci.
To, co mnie rzuca, to childNodes
przedmiot. Użyłem go, aby spojrzeć na formularz w elemencie tabeli. Chociaż children
wyświetla listę wszystkich elementów formularza, childNodes
wydaje się, że zawiera również spacje z kodu HTML:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Oba dzienniki <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Wszystko dziennika <input type="text"
... >
. Dlaczego? Zrozumiałbym, że jeden obiekt pozwoliłby mi pracować z „surowym” kodem HTML, podczas gdy drugi przykleja się do DOM, ale childNodes
element wydaje się działać na obu poziomach.
Wracając do mojego początkowego pytania, domyślam się: jeśli chcę najbardziej kompleksowy obiekt, childNodes
jest to droga, ale ze względu na jego kompleksowość może nie być najbardziej przewidywalny pod względem zwrotu elementu, który chcę / oczekuj w dowolnym momencie. Wsparcie w różnych przeglądarkach może również okazać się wyzwaniem, chociaż mogę się mylić.
Czy ktoś mógłby wyjaśnić różnicę między przedmiotami? Jeśli jest różnica prędkości, choć nieznaczna, też chciałbym wiedzieć. Jeśli widzę, że to wszystko źle, nie krępuj się mnie uczyć.
PS: Proszę, lubię JavaScript, więc tak, chcę poradzić sobie z tego rodzaju sprawami. Odpowiedzi typu „jQuery zajmuje się tym dla Ciebie” nie są tym, czego szukam, dlatego niejquery etykietka.