4

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?

Temani Afif
  • 245,468
  • 26
  • 309
  • 415
Alberto De Caro
  • 5,147
  • 9
  • 47
  • 73

3 Answers3

9

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>
Temani Afif
  • 245,468
  • 26
  • 309
  • 415
3

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

document.querySelectorAll('li.a:not(.b)')
Johan
  • 3,577
  • 1
  • 14
  • 28
1

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.

dkellner
  • 8,726
  • 2
  • 49
  • 47