Alberto De Caro
Alberto De Caro

Reputation: 5213

Exclusive CSS selector

I am working on a page where the selected item among a list is characterized by NOT having a given class. Something like the following:

<ul>
  <li class="a">not selected</li>
  <li class="a b">selected</li>
  <li class="a">not selected</li>
</ul>

I would like to defined a CSS selector to grab the li node in the page having ONLY the a class. Unsurprisingly the following statement is not enough:

document.querySelectorAll('li.a')

Because it returns ALL the li nodes having the a class.

Any experience on such scenario?

Upvotes: 4

Views: 962

Answers (3)

Temani Afif
Temani Afif

Reputation: 272806

In such case you may consider attribute selector like this:

console.log(document.querySelectorAll('li[class="a"]').length)
li[class="a"] {
  color:red;
}
<ul>
  <li class="a">Select me</li>
  <li class="a b c d more classes">Don't select me</li>
  <li class="a b">Don't select me</li>
  <li class="a">Select me</li>
</ul>

Simply pay attention to extra spaces:

console.log(document.querySelectorAll('li[class="a"]').length)
li[class="a"] {
  color:red;
}
<ul>
  <li class="a ">Pay attention to this one !!</li>
  <li class="a b">Don't select me</li>
  <li class="a">Select me</li>
</ul>

But since you are using JS you can use trim() to get rid of the extra spaces:

var elem=document.querySelectorAll('li');
for(var i=0;i<elem.length;i++)
  elem[i].className=elem[i].className.trim();

console.log(document.querySelectorAll('li[class="a"]').length)
li[class="a"] {
  color:red;
}
<ul>
  <li class="a ">Pay attention to this one !!</li>
  <li class="a b">Don't select me</li>
  <li class="a">Select me</li>
</ul>

Upvotes: 9

Johan
Johan

Reputation: 3611

Apart from Temanis answer you can use the not selector in this case

document.querySelectorAll('li.a:not(.b)')

Upvotes: 3

dkellner
dkellner

Reputation: 9926

You can use the :not() pseudo, that's exactly what you need for this job.

https://developer.mozilla.org/en-US/docs/Web/CSS/:not

So all you have to do is

document.querySelector(".a:not(.b)")

But also consider using jQuery, like

$(".someclass").not(".another")

Stansard querySelector is faster, jQ is more readable.

Upvotes: 1

Related Questions