Мне было интересно, 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 тег.