Мне было интересно, 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
. Im основывая это предположение на ссылке MDN:
childNode
является ссылкой на первый дочерний элемент элемента node илиnull
, если его нет.
Я предполагаю, что с точки зрения скорости разница, если она есть, будет почти ничего, поскольку firstElementChild
является фактически ссылкой на children[0]
, и объект children
уже в любом случае уже находится в памяти.
Что меня бросает, это объект childNodes
. Ive использовал его, чтобы взглянуть на форму в элементе таблицы. Пока children
перечисляет все элементы формы, childNodes
также, похоже, содержит пробелы из кода HTML:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Оба log <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Все журналы <input type="text"
... >
. Как так? Id понимает, что один объект позволит мне работать с "сырым" HTML-кодом, а другой - с DOM, но элемент childNodes
, похоже, работает на обоих уровнях.
Чтобы вернуться к моему первоначальному вопросу, я бы предположил, что если я хочу наиболее полный объект, childNodes
- это путь, но из-за его полноты он может быть не самым предсказуемым с точки зрения его возвращая элемент, который я хочу/ожидаю в любой момент. Кросс-браузерная поддержка также может оказаться проблемой в этом случае, хотя я могу ошибаться.
Может ли кто-нибудь прояснить различие между объектами? Если есть разница в скорости, как бы ни была незначительна, Id тоже хотел бы знать. Если я вижу, что все это неправильно, не стесняйтесь обучать меня.
PS: Пожалуйста, мне нравится JavaScript, так что да, я хочу иметь дело с такими вещами. Ответы, подобные "jQuery" с этим для вас, не являются тем, что я ищу, следовательно, jquery.