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