为什么最后一个类型选择了嵌套元素?

时间:2017-07-14 14:13:25

标签: javascript html dom css-selectors

我有一个非常简单的HTML结构,如下所示:

<div>
    <div>a<div>a1</div></div>
    <div>b</div>
    <p>c</p>
    <div>d</div>
</div>

document.body.querySelector('div > div:last-of-type')返回<div>a1</div>,而不是<div>d</div>

我认为document.body.querySelector('div > div:last-of-type')应与document.body.querySelector('div > div:nth-of-type(3)')相同,后者返回<div>d</div>

总结一下我的问题:

  1. 为什么document.body.querySelector('div > div:last-of-type')会返回<div>a1</div>,而不是<div>d</div>?这是一个错误吗?

  2. 选择<div>d</div>的正确方法是什么?

4 个答案:

答案 0 :(得分:0)

如果要从初始容器div的div子项中选择,请为div指定一个类或ID,例如.container,然后将其选为document.body.querySelector('div.container > div:last-of-type');

您当前的代码是从div中选择的div是任何其他div的最后一个div子项,您没有指定您只想查看容器div的子项

答案 1 :(得分:0)

根据document#querySelector spec

  

Document,DocumentFragment和上的querySelector()方法   元素接口必须返回其中的第一个匹配的Element节点   上下文对象的子树。

第一个匹配元素是什么?

我们可以将document#uerySelectorAll与相同的选择器一起使用,您可以看到数组中的第一个结果是<div>a1</div>

const result = Array.from(document.body.querySelectorAll('div > div:last-of-type'));

console.log(result);
<html>
<body>
<div>
    <div>a<div>a1</div></div>
    <div>b</div>
    <p>c</p>
    <div>d</div>
</div>

如何获得<div>d</div>

创建一个只匹配您想要的选择器:

console.log(document.body.querySelector('body > div > div:last-of-type'));

console.log(document.body.querySelector('p + div'));
<html>
<body>
<div>
    <div>a<div>a1</div></div>
    <div>b</div>
    <p>c</p>
    <div>d</div>
</div>

答案 2 :(得分:0)

所以这是获得最后一个孩子的规范方式

&#13;
&#13;
console.log(document.body.querySelector('div').lastElementChild)
&#13;
<div>
    <div>a<div>a1</div></div>
    <div>b</div>
    <p>c</p>
    <div>d</div>
</div>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

  1.   

    为什么document.body.querySelector('div > div:last-of-type')会返回<div>a1</div>,而不是<div>d</div>?这是一个错误吗?

    不,这不是错误。原因有两个:

    1. 如果选择器匹配多个元素,querySelector()仅返回第一个匹配元素。
    2. 选择器的范围不限于调用querySelector()方法的元素。

    3. 由于<div>a1</div>是匹配div > div:last-of-type的第一个元素,因此您的代码会返回该元素。

    4.   

      选择<div>d</div>的正确方法是什么?

      document.querySelector('body > div > div:last-of-type')
      

      无需使事情过于复杂。