如何使用 JavaScript 选择所有元素,除了一个元素及其所有子元素?

use*_*672 6 javascript css-selectors

使用以下 HTML,如何仅选择父级的所有 div,但带有属性的 div 除外 -class="first"及其使用 JavaScript 的子级?

换句话说,在调用查询后,我想获得一个包含以下 div 的数组:class="all",class="second"class="third"

<div class="all">
    <div class="header">All</div>
    <div class="cell-1"></div>
    <div class="cell-2"></div>
    <div class="cell-3"></div>
    <div class="cell-4"></div>
</div>
<div class="first">
    <div class="header">First</div>
    <div class="cell-1"></div>
    <div class="cell-2"></div>
    <div class="cell-3"></div>
    <div class="cell-4"></div>
</div>
<div class="second">
    <div class="header">Second</div>
    <div class="cell-1"></div>
    <div class="cell-2"></div>
    <div class="cell-3"></div>
    <div class="cell-4"></div>
</div>
<div class="third">
    <div class="header">Third</div>
    <div class="cell-1"></div>
    <div class="cell-2"></div>
    <div class="cell-3"></div>
    <div class="cell-4"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

这些 div 是某个容器的子级(body至少,如果不是更直接的话)。因此,您可以使用带有子组合器的选择器和您不想要:not.first元素的子句:

var divs = document.querySelectorAll("body > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)

当然,如果body不是他们的容器,请将其替换为该元素的选择器。

例子:

var divs = document.querySelectorAll("body > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)
var divs = document.querySelectorAll("body > div:not(.first)");
console.log("matching elements: " + divs.length);
Array.prototype.forEach.call(divs, function(div, index) {
  console.log(index + ": " + div.className);
});
Run Code Online (Sandbox Code Playgroud)

  • @Gerardo Furtado:这与所有内部 div 以及外部 div 相匹配。不确定提问者是否想要如此庞大的元素集合。此外,它还匹配 .first 的孩子——这大概是提问者*不*想要的。 (2认同)

小智 6

您需要使用直接子组合器和否定伪类来构建CSS 选择器。

普通 JavaScript:

var divs = document.querySelectorAll("body > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)

jQuery:

var divs = $("body > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我假设这些 div 是该元素的直接子元素body,但如果它们不是,您可以使用其父元素的idor来代替:class

<div id="container">
   //divs here
</div>     
Run Code Online (Sandbox Code Playgroud)

将会:

document.querySelectorAll("#container > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)

<div class="container">
   //divs here
</div>     
Run Code Online (Sandbox Code Playgroud)

将会:

document.querySelectorAll(".container > div:not(.first)");
Run Code Online (Sandbox Code Playgroud)

直接子组合器>仅选择满足第二个选择器条件的元素(div对于所有 div 元素)并且仅比第一个选择器低一级(body对于主体#container.container容器 div)。第一个选择器下方的其他元素附加级别将被忽略(例如<div class="header">Third</div>等)。

否定伪类采用一个简单的选择器作为参数(在本例中为.first),并从结果中排除与该选择器匹配的元素。

您可以在这里看到演示:http://jsbin.com/puqosimigu/edit ?html,js,console