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ć, firstChildużywa NodeList childNodesi firstElementChildużywa children. Opieram to założenie na referencji MDN:
childNodejest odniesieniem do pierwszego elementu potomnego węzła elementu lubnulljeśli go nie ma.
Zgaduję, że pod względem prędkości różnica, jeśli w ogóle, będzie prawie zerowa, ponieważ firstElementChildjest to faktycznie odniesienie children[0], a childrenobiekt i tak jest już w pamięci.
To, co mnie rzuca, to childNodesprzedmiot. Użyłem go, aby spojrzeć na formularz w elemencie tabeli. Chociaż childrenwyświetla listę wszystkich elementów formularza, childNodeswydaje 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 childNodeselement wydaje się działać na obu poziomach.
Wracając do mojego początkowego pytania, domyślam się: jeśli chcę najbardziej kompleksowy obiekt, childNodesjest 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.