Подтвердить что ты не робот

Почему методы document.getElementsBy__ не возвращают HTMLCollection?

Почему бы не getElementsByName, getElementsByTagName и getElementsByClassName вернуть HTMLCollection (W3C, MDN) вместо NodeList (W3C, MDN)?

Все три возвращают живой NodeList только элементов:

document.getElementsByName('nameAttrVal');
document.getElementsByTagName('div');
document.getElementsByClassName('space separated classes');

NodeLists велики, но HTMLCollection более конкретны, поскольку они могут содержать только HTML-элементы. Похоже, это было бы идеально для этих методов.

Когда создается коллекция, фильтр и корень связаны с коллекции.

Например, когда объект HTMLCollection для document.images создается атрибут, он связан с фильтром, который выбирает только img и внедрены в корень документа.

Затем коллекция представляет собой представление live поддерева, внедренного в корень коллекции, содержащий только узлы, которые соответствуют данному фильтр. Вид является линейным. В отсутствие конкретных требований к напротив, узлы внутри коллекции должны быть отсортированы в дереве порядок.

- W3C в коллекциях

Пара мест HTMLCollection уже используется:

document.images
element.children

NB: querySelectorAll возвращает неживой NodeList.

4b9b3361

Ответ 1

HTMLCollection был в основном включен только в спецификацию DOM для документирования того, как большинство браузеров работало до внедрения DOM. Это имеет смысл только в контексте HTML, тогда как DOM был построен для постоянной работы как для HTML, так и для XML. Реализации DOM позволяют опускать HTMLCollection и все его применения и по-прежнему считаться соответствующими; браузеры решили сохранить его для обратной совместимости со старыми веб-сайтами.

Ответ 2

Потому что может существовать больше тегов html-элементов с тем же именем или именем класса, и вы можете манипулировать им как объект DOM, а не как html-тип

" Возвращает первый элемент с идентификатором или именем из коллекции. W3C

Если вы попытаетесь поймать событие или изменить его как добавление атрибутов в определенном node, вы можете сделать это, выбрав идентификатор или коллекцию имен