Мені було цікаво, JavaScript пропонує різноманітні методи отримання першого дочірнього елемента з будь-якого елемента, але який найкращий? Я в кращому випадку маю на увазі: більшість сумісних веб-браузерів, найшвидший, найповніший і передбачуваний, що стосується поведінки. Перелік методів / властивостей, які я використовую як псевдоніми:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Це працює в обох випадках:
var child = elem.childNodes[0]; // or childNodes[1], see below
Це у випадку форм чи <div>
ітерацій. Якщо я можу зіткнутися з текстовими елементами:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Наскільки я можу працювати, firstChild
використовує NodeList від childNodes
і firstElementChild
використання children
. Я будувати це припущення на посиланні MDN:
childNode
є посиланням на перший дочірній елемент вузла елемента абоnull
якщо його немає.
Я здогадуюсь, що за швидкістю різниця, якщо така є, буде майже нічим, оскільки firstElementChild
це фактично посилання на children[0]
, і children
об'єкт вже в пам'яті.
Те, що мене кидає, - це childNodes
предмет. Я використовував його для розгляду форми, в елементі таблиці. Хоча children
списки всіх елементів форми childNodes
також, здається, містять пробіли з HTML-коду:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Обидва журнали <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Весь журнал <input type="text"
… >
. Як це? Я розумію, що один об'єкт дозволив би мені працювати з "необробленим" HTML-кодом, а інший дотримується DOM, але childNodes
елемент, здається, працює на обох рівнях.
Щоб повернутися до мого початкового питання, я здогадуюсь: якщо я хочу, щоб найбільш повний об'єкт childNodes
- це шлях, але через його всебічності він може бути не найбільш передбачуваним з точки зору повернення елемента, який я хочу / очікуйте в будь-який момент. Підтримка крос-браузера також може виявитися викликом у цьому випадку, хоча я можу помилятися.
Чи може хтось уточнити відмінність між об'єктами, які є під рукою? Якщо різниця швидкостей є, однак незначною, я також хотів би знати. Якщо я бачу це все неправильно, сміливо навчайте мене.
PS: Будь ласка, будь ласка, мені подобається JavaScript, так що так, я хочу займатися подібними справами. Відповіді на кшталт "jQuery займається цим для вас" - це не те, що я шукаю, отже, ніjquery тег.