With the following HTML, how can I select all divs at parent level only, except div with attribute - class="first"
and its children using JavaScript?
In other words, after calling a query I want to get an array with these divs: class="all"
, class="second"
and 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>
These divs are children of some container (body
at least, if not something more immediate). So you can use a selector with a child combinator and a :not
clause for the .first
element you don't want:
var divs = document.querySelectorAll("body > div:not(.first)");
Of course, if body
isn't their container, replace that with a selector for the element that is.
Example:
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);
});
<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>
You'll need to build your CSS selector using the direct child combinator and the negation pseudo-class.
Vanilla JavaScript:
var divs = document.querySelectorAll("body > div:not(.first)");
jQuery:
var divs = $("body > div:not(.first)");
In the example above I'm assuming these divs are direct children of the body
element, but if they aren't you can use the id
or class
of their parent instead:
<div id="container">
//divs here
</div>
would be:
document.querySelectorAll("#container > div:not(.first)");
and
<div class="container">
//divs here
</div>
would be:
document.querySelectorAll(".container > div:not(.first)");
The direct child combinator >
only selects elements that meet criteria of the second selector (div
for all div elements) and are only one level below the first selector (body
for the body, #container
and .container
for the container div). Other elements additional levels below the first selector are ignored (e.g. <div class="header">Third</div>
etc.).
The negation pseudo-class takes a simple selector as an argument (in this case .first
) and excludes elements matching that selector from the results.
You can see a demonstration here: http://jsbin.com/puqosimigu/edit?html,js,console
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With