querySelector с last-child возвращает null, если после классифицированных элементов есть элемент без класса - PullRequest
0 голосов
/ 20 июня 2020

В моем коде document.querySelector (.list-group-item: last-child) не может найти элемент и возвращает значение null, если после элементов li с классом list-group- есть элемент li без класса. item ".

мой вопрос в том, почему querySelector выбирает последний li без класса" .list-group-item ", хотя я указываю имя класса в querySelector, я думаю, что последний li не должен

Это спецификация querySelector?

Спасибо за помощь!

<!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 Ответ

0 голосов
/ 20 июня 2020

document.querySelector ('. List-group-item: last-child') выдает ошибку, поскольку это не последний элемент # items , это на самом деле li .

Чтобы получить последний элемент элемента с классом, захватите все элементы с помощью document.querySelectorAll (". list-group-item") , ( все, что содержит querySelectorAll , помещается в массив ), а l oop через этот массив, чтобы получить последний элемент.

Я переместил document.querySelector ('. list-group-item: last-child') в конце, иначе он был бы перезаписан document.querySelectorAll (". list-group-item") .

Надеюсь, это поможет.

// 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...