0
votes

In my code, document.querySelector(.list-group-item:last-child) cannot find the element and returns null when there is a li element without the class after the li elements with the class "list-group-item".

my question is that why the querySelector pick up the last li without class ".list-group-item" even though I specify the class name in the querySelector, I think the last li shouldn't be picked up.

Is this the specification of the querySelector?

Thank you for helping!

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <!-- bootstrap css -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
  <title>Item Lister</title>

</head>

<body>
  <div class="container">
    <div id="main" class="card card-body">
      <h2 class="title">
        Items
      </h2>
      <ul id="items" class="list-group">
        <li class="list-group-item">
          Item 1
        </li>
        <li class="list-group-item">
          Item 2
        </li>
        <li class="list-group-item">
          Item 3
        </li>
        <!-- Not classed <li> before classed <li>s -->
        <li>Item 3.5</li>
        <li class="list-group-item">
          Item 4
        </li>
        <!-- Not classed <li> after classed <li>s-->
        <!-- this causes error -->
        <li>Item 5</li>
      </ul>
    </div>
  </div>
  <script>
    /* Ask a Question */
    // TypeError: lastItem is null, when there is a not classed <li> after classed <li>s.

    // select by the class .list-group-item, pseudo class: last-child
    let lastItem = document.querySelector('.list-group-item:last-child');
    lastItem.style.color = 'cyan';



    /*  The code below are references */

    // select by the class .list-group-item
    let item = document.querySelector('.list-group-item');
    item.style.color = 'red';

    // select by the class .list-group-item, pseudo class: nth-child(2)
    let secondItem = document.querySelector('.list-group-item:nth-child(2)');
    secondItem.style.color = 'coral';

    // select by the element <li>, pseudo class: last-child
    let liLastItem = document.querySelector('li:last-child');
    liLastItem.style.color = 'cyan';
  </script>


</body>

</html>
1

1 Answers

0
votes

document.querySelector('.list-group-item:last-child') gives you error as this is not the last element of #items, it's actually li.

In order to get the last element of an element with a class, grab all elements with document.querySelectorAll(".list-group-item"), (anything with querySelectorAll is put in an array), and loop through this array to retrieve the last element.

I moved document.querySelector('.list-group-item:last-child') at the end or else it would have been overwritten by document.querySelectorAll(".list-group-item").

Hope this helps out.

// select by the class .list-group-item
let items = document.querySelectorAll(".list-group-item");
items.forEach(function(item, index) {
  item.style.color = "red";
});

// select by the class .list-group-item, pseudo class: nth-child(2)
let secondItem = document.querySelector(".list-group-item:nth-child(2)");
secondItem.style.color = "coral";

// select by the element <li>, pseudo class: last-child
let liLastItem = document.querySelector("li:last-child");
liLastItem.style.color = "cyan";

// select by the class .list-group-item, pseudo class: last-child
let lastItems = document.querySelectorAll(".list-group-item");
lastItems.forEach(function(lastItem, index) {
  if (index === lastItems.length - 1) {
    lastItem.style.color = "purple";
  }
});
<div class="container">
  <div id="main" class="card card-body">
    <h2 class="title">
      Items
    </h2>
    <ul id="items" class="list-group">
      <li class="list-group-item">
        Item 1
      </li>
      <li class="list-group-item">
        Item 2
      </li>
      <li class="list-group-item">
        Item 3
      </li>
      <!-- Not classed <li> before classed <li>s -->
      <li>Item 3.5</li>
      <li class="list-group-item">
        Item 4
      </li>
      <!-- Not classed <li> after classed <li>s-->
      <!-- this causes error -->
      <li>Item 5</li>
    </ul>
  </div>
</div>