在前端开发过程中,我们经常需要使用 DOM 操作来获取或者修改网页元素。其中,querySelector
是一个非常有用的 API,它可以通过 CSS 选择器来获取匹配的元素。但是,如果我们想要获取匹配结果中的第一个或最后一个元素,应该如何操作呢?另外,DOM 遍历的顺序又是怎么样的呢?下面就让我们一起来深入了解。
获取第一个和最后一个元素
在使用 querySelector
查询元素时,可以使用类似于数组下标的方式获取匹配结果中的某个元素。例如,下面的代码会返回匹配结果中的第一个元素:
----- ------------ - --------------------------------------
注意,在这里使用 [0]
来访问第一个元素,而不是 .example:first-child
或者其他类似的 CSS 选择器。原因是,虽然 querySelector
返回的是一个 NodeList 对象,看起来很像一个数组,但实际上它并不是一个数组,而是一个类数组对象。因此,我们不能直接使用数组的相关方法,比如 slice
、push
等等。但是,我们可以像上面那样使用下标来获取某个元素。
同样的,我们也可以使用 -1
来获取匹配结果中的最后一个元素:
----- ----------- - ---------------------------------------
这里同样要注意,我们不能使用 .example:last-child
等 CSS 选择器来获取最后一个元素。因为 querySelector
返回的不是一个数组,所以它没有类似于 last-child
的概念。
DOM 遍历顺序
在了解如何获取第一个和最后一个元素之前,我们需要先了解一下 DOM 树的遍历顺序。DOM 树的遍历方式有两种:深度优先遍历和广度优先遍历。
深度优先遍历
深度优先遍历是指从根节点开始,沿着每个分支尽可能深入到达叶子节点,然后再回溯到前一个分支点,直到遍历完整棵树为止。在实现上,通常采用递归的方式进行深度优先遍历,可以使用 Node.childNodes
或者 Node.firstChild
、Node.lastChild
等属性来访问子节点。
------ ---- --------------- ---- ---------------------- ---- ---------------- ---- --------------------------- ---- --------------------------- ------ ---- ---------------------- ------ -------
在上面的代码中,如果我们使用深度优先遍历来访问所有的节点,那么访问的顺序将是:parent
-> child-1
-> child-2
-> grandchild-1
-> grandchild-2
-> child-3
。
广度优先遍历
广度优先遍历是指从根节点开始,按照层级顺序逐层遍历,也就是先访问距离根节点最近的节点,再访问它的兄弟节点。在实现上,通常采用队列的方式进行广度优先遍历,可以使用 Node.childNodes
或者 Node.firstChild
、Node.lastChild
、Node.nextSibling
等属性来访问子节点和兄弟节点。
------ ---- --------------- ---- ---------------------- - ----------------------------------------------------------- -------- ---------------------------------------------------------------------------------------