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

Почему getElementsByName, getElementsByTagName и getElementsByClassName не возвращают HTMLCollection (W3C, MDN) вместо NodeList (W3C, MDN)?

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

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

NodeList — это прекрасно, но HTMLCollection более конкретны, так как могут содержать только элементы HTML. Кажется, что это было бы идеально для этих методов.

При создании коллекции с ней связываются фильтр и корень.

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

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

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

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

document.images
element.children

Примечание: querySelectorAll возвращает неактивное NodeList.


person Web_Designer    schedule 04.03.2014    source источник
comment
Что ж, qSA был определен через несколько лет после этих трех API, поэтому я думаю, что разработчики спецификаций с вами согласны. Но вы не можете вернуться назад и изменить что-то сейчас.   -  person Dave Methvin    schedule 05.03.2014
comment
Возможный повторяющийся вопрос — ССЫЛКА   -  person Quinn    schedule 05.03.2014
comment
@ Куинн, я не уверен, что это точная копия, но это, безусловно, актуально.   -  person zzzzBov    schedule 05.03.2014
comment
Попробуйте stackoverflow.com/a/7754729/2246362   -  person Ryan    schedule 18.03.2014
comment
Ознакомьтесь с NodeList.js.   -  person Edwin Reynoso    schedule 08.08.2015


Ответы (2)


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

person Telic    schedule 24.03.2014

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

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

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

person Adrian Romero    schedule 05.03.2014
comment
Я не уверен, что ты имеешь в виду? Не могли бы вы уточнить? - person Web_Designer; 05.03.2014