在 querySelector 中如何获得第一个和最后一个元素?DOM 遍历顺序是什么?

在前端开发过程中,我们经常需要使用 DOM 操作来获取或者修改网页元素。其中,querySelector 是一个非常有用的 API,它可以通过 CSS 选择器来获取匹配的元素。但是,如果我们想要获取匹配结果中的第一个或最后一个元素,应该如何操作呢?另外,DOM 遍历的顺序又是怎么样的呢?下面就让我们一起来深入了解。

获取第一个和最后一个元素

在使用 querySelector 查询元素时,可以使用类似于数组下标的方式获取匹配结果中的某个元素。例如,下面的代码会返回匹配结果中的第一个元素:

----- ------------ - --------------------------------------

注意,在这里使用 [0] 来访问第一个元素,而不是 .example:first-child 或者其他类似的 CSS 选择器。原因是,虽然 querySelector 返回的是一个 NodeList 对象,看起来很像一个数组,但实际上它并不是一个数组,而是一个类数组对象。因此,我们不能直接使用数组的相关方法,比如 slicepush 等等。但是,我们可以像上面那样使用下标来获取某个元素。

同样的,我们也可以使用 -1 来获取匹配结果中的最后一个元素:

----- ----------- - ---------------------------------------

这里同样要注意,我们不能使用 .example:last-child 等 CSS 选择器来获取最后一个元素。因为 querySelector 返回的不是一个数组,所以它没有类似于 last-child 的概念。

DOM 遍历顺序

在了解如何获取第一个和最后一个元素之前,我们需要先了解一下 DOM 树的遍历顺序。DOM 树的遍历方式有两种:深度优先遍历和广度优先遍历。

深度优先遍历

深度优先遍历是指从根节点开始,沿着每个分支尽可能深入到达叶子节点,然后再回溯到前一个分支点,直到遍历完整棵树为止。在实现上,通常采用递归的方式进行深度优先遍历,可以使用 Node.childNodes 或者 Node.firstChildNode.lastChild 等属性来访问子节点。

------
  ---- ---------------
    ---- ----------------------
    ---- ----------------
      ---- ---------------------------
      ---- ---------------------------
    ------
    ---- ----------------------
  ------
-------

在上面的代码中,如果我们使用深度优先遍历来访问所有的节点,那么访问的顺序将是:parent -> child-1 -> child-2 -> grandchild-1 -> grandchild-2 -> child-3

广度优先遍历

广度优先遍历是指从根节点开始,按照层级顺序逐层遍历,也就是先访问距离根节点最近的节点,再访问它的兄弟节点。在实现上,通常采用队列的方式进行广度优先遍历,可以使用 Node.childNodes 或者 Node.firstChildNode.lastChildNode.nextSibling 等属性来访问子节点和兄弟节点。

------
  ---- ---------------
    ---- ----------------------

- ----------------------------------------------------------- --------
---------------------------------------------------------------------------------------