为什么document.getElementsBy__方法不返回HTMLCollection?

时间:2014-03-04 21:55:58

标签: javascript html dom nodelist

为什么不要getElementsByNamegetElementsByTagNamegetElementsByClassName返回HTMLCollectionW3CMDN)而不是NodeListW3CMDN)?

这三个都只返回一个只有元素的实时NodeList:

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

NodeLists很棒,但HTMLCollection更具体,因为它们只能包含HTML元素。看起来这对于那些方法来说是完美的。

  

创建集合时,会关联过滤器和根   集合。

     

例如,当document.images的HTMLCollection对象时   属性已创建,它与仅选择的过滤器相关联   img元素,并根植于文档的根目录。

     

然后,该集合代表以root为根的实时视图   集合的根,只包含与给定节点匹配的节点   过滤。视图是线性的。在没有具体要求的情况下   相反,集合中的节点必须在树中排序   顺序。

     

- W3C on collections

已经使用了几个地方HTMLCollection

document.images
element.children

NB: querySelectorAll返回非实时NodeList

2 个答案:

答案 0 :(得分:2)

HTMLCollection主要仅包含在DOM规范中,用于记录大多数浏览器在引入DOM之前的工作方式。它只在HTML的上下文中有意义,而DOM的构建是为了一致地为HTML和XML工作。允许DOM的实现省略HTMLCollection及其所有用途,并且仍然被认为是符合要求的;浏览器选择保持它以保持与旧网站的向后兼容性。

答案 1 :(得分:-2)

因为可以存在更多具有相同名称或类名的标签html元素,并且可以将其作为DOM对象操作,而不是作为html类型

从集合”返回ID或名称​​ name 的第一个项目。 W3C

如果您尝试捕获事件或修改它,就像在特定节点中添加属性一样,您可以通过Id或 name 集合

选择它