Почему методы 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
.
Ответы
Ответ 1
HTMLCollection был в основном включен только в спецификацию DOM для документирования того, как большинство браузеров работало до внедрения DOM. Это имеет смысл только в контексте HTML, тогда как DOM был построен для постоянной работы как для HTML, так и для XML. Реализации DOM позволяют опускать HTMLCollection и все его применения и по-прежнему считаться соответствующими; браузеры решили сохранить его для обратной совместимости со старыми веб-сайтами.
Ответ 2
Потому что может существовать больше тегов html-элементов с тем же именем или именем класса, и вы можете манипулировать им как объект DOM, а не как html-тип
" Возвращает первый элемент с идентификатором или именем из коллекции. W3C
Если вы попытаетесь поймать событие или изменить его как добавление атрибутов в определенном node, вы можете сделать это, выбрав идентификатор или коллекцию имен