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