在querySelector中:如何获取第一个元素并获取最后一个元素?dom使用什么遍历顺序?


73

在div中,具有具有attribute的元素(不一定是第二代)move_id

首先,想要获取set的第一个和最后一个元素的最直接方法

尝试通过以下方式获得第一个和最后一个:

var first = div.querySelector('[move_id]:first');
var last  = div.querySelector('[move_id]:last');

之所以炸弹,是因为:first和:last是我的一厢情愿(?)

无法使用Array方法,querySelectorAll因为NodeList它不是Array:

var first = (div.querySelectorAll('[move_id]'))[0];
var last  = (div.querySelectorAll('[move_id'])).pop();

这个炸弹因为NodeList没有方法pop()

(是的,可以在NodeList顶部使用Array方法:

var first = div.querySelector('[move_id]');
var last = Array.prototype.pop.call(div.querySelectorAll('[move_id']));

这有效,并且是我现在正在使用的功能,但我认为我必须更直接地缺少一些东西)

其次,需要验证元素是否按照http://en.wikipedia.org/wiki/Tree_traversal按预售深度优先遍历列出

Answers:


96

要访问第一个和最后一个元素,请尝试。

var nodes = div.querySelectorAll('[move_id]');
var first = nodes[0];
var last = nodes[nodes.length- 1];

为了增强鲁棒性,请添加索引检查。

是的,节点的顺序是深度优先。DOM的document order定义为

在文档中的所有节点上都有一个顺序的文档顺序定义,该顺序与在通用实体扩展后每个节点的XML表示形式的第一个字符出现在文档的XML表示形式中的顺序相对应。因此,文档元素节点将是第一个节点。元素节点出现在其子节点之前。因此,文档顺序按照XML中开始标记的出现顺序(在实体扩展之后)对元素节点进行排序。元素的属性节点出现在元素之后及其子元素之前。属性节点的相对顺序取决于实现。


1
重新遍历-谢谢-我佩服那些可以记住并找到这些问题的支持文档的人
cc young

但是对于代码,出于我自己的审美观,更喜欢我的解决方案:例如,它不需要声明nodes变量,但这只是个人喜好。我希望的是,我缺少了一些:first和:last的正确用法。
cc年轻的

85

:last 不是CSS规范的一部分,这是jQuery特定的。

你应该在找 last-child

var first = div.querySelector('[move_id]:first-child');
var last  = div.querySelector('[move_id]:last-child');

很好,当我们需要最后一个div时,不再需要使用querySelectorAll。除了仅在最后一个子节点具有属性[move_id]的情况下才有效,否则它将返回null,并且您需要再次使用querySelectorAll。
2013年

29
:last-child并且:first-child与父元素相关,与列表无关!这意味着可能会有多个第一个孩子和几个最后一个孩子,这不是要求的。看到这里:jsfiddle.net/r61tcvc3
oriadam

4
:last和:last-child不一样。它可以给您相同的结果,但取决于html结构。
奥利弗·科特(OliverKötter),


0

获取上一篇文章或任何其他元素的示例:

document.querySelector("article:last-child")

2
完全相同的答案已经在这里通过@Guillaume贴过8年前
VSYNC

不赞成投票,在8年前发布了相同的答案,它比这个答案要好。
Tigerrrrr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.