在查询的NodeLists中"订单"的可靠性如何

And*_*old 8 html javascript w3c dom specifications

我很想知道这个话题已经有一段时间了.有问题的方法如下:

  • getElementsByTagName
  • getElementsByClassName
  • getElementsByName
  • querySelectorAll

据我所知,这些DOM方法是唯一能够返回冻结或实时的方法NodeLists.对于其中一些方法,订单由W3C规范定义.例如,http://www.w3.orgNodeLists返回的内容写下以下内容querySelectorAll

Document,DocumentFragment和Element接口上的querySelectorAll()方法必须按文档顺序返回包含上下文节点子树中所有匹配的Element节点的NodeList.如果没有匹配的节点,则该方法必须返回空的NodeList.

但是,我找不到与我提到的其他方法类似的明确规范.我的问题是:

  • 是否有结果的定义顺序(最可能是文档顺序)
  • 这些规格是如何可靠和跨浏览器实现的

要绝对清楚:

<div>this</div>
<div>is</div>
<div>a demo</div>

// is this always guaranteed to be "<div>is</div>"
document.querySelectorAll('div')[1]
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 6

是的。所有这些都按文档顺序/树顺序排列。

  • getElementsByName( DOM Level-2-HTML ) 返回一个NodeList
  • querySelectorAll( Selectors API ) 返回NodeList“按文档顺序”
  • getElementsByTagName( DOM ) 返回一个HTMLCollection
  • getElementsByClassName( DOM ) 返回一个HTMLCollection

HTMLCollectionsNodeLists都被指定为具有

元素按树序排序

当通过 indizes 访问它们时。

我认为所有浏览器都可靠地实现了这些规范(即使链接版本可能比某些实现更新),主要是因为树顺序是最合乎逻辑且易于编码的顺序。但是,您可能需要注意某些浏览器可能会返回由不同元素组成的列表,因为它们的节点匹配不同。在确定name元素的时,我可以想到一些怪癖。