Кнопки ведут себя странно из-за .classList.toggle

#javascript #html

#javascript #HTML

Вопрос:

У меня есть меню с несколькими кнопками со стрелками. Если вы нажмете на эти кнопки со стрелками, появится еще один div.

Он работает нормально, но я заметил кое-что странное. Если я нажму на стрелку вправо 9 раз (пока не будут показаны все 10 разделов), на стрелку влево 9 раз (пока не будет показан только первый раздел), а затем попытаюсь нажать на стрелку вправо 9 раз (так что все 10 разделов будут показаны снова), меню застрянет на8-й div, и я не понимаю, почему.

Что-то не так с моим кодом?

 let classCounter = 1;
let pasiExecutie = document.querySelectorAll(".pas-executie");

document.querySelector(".fa-arrow-right").addEventListener("click", function() {
    if(classCounter < 10)
    {
        classCounter  ;
        document.querySelector(".pas"   classCounter.toString()).classList.toggle("hide");
    }  
});

document.querySelector(".fa-arrow-left").addEventListener("click", function() {
    if(classCounter > 1)
    {
        classCounter--;
        document.querySelector(".pas"   classCounter.toString()).classList.toggle("hide");
    }  
}); 
 .hide {
    display: none !important;
} 
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    <title>Divide et Impera</title>
    <script src="https://kit.fontawesome.com/6612084f00.js" crossorigin="anonymous"></script>
</head>
<body>
            <div class="executie-problema executie problema">
                <div class="row d-flex justify-content-center align-items-center vh-100">
                      <span style="color: #77dff1;">Pasi executie:</span><br>
                      <ol class="pasi-executie" id="pasi-exec">
                        <li class="pas-executie pas1">isBstUtil(4, INT_MIN, INT_MAX) – Nodul nu este null si se afla in [INT_MIN, INT_MAX] =></li>
                        <li class="pas-executie pas2 hide">isBstUtil(2,INT_MIN,3) – Nodul nu este null si se afla in [INT_MIN, 3] =></li>
                        <li class="pas-executie pas3 hide">isBstUtil(1,INT_MIN,1) – Nodul nu este null si se afla in [INT_MIN,1] => </li>
                        <li class="pas-executie pas4 hide">isBstUtil(NULL,INT_MIN,0) – Nodul este NULL, se returneaza 1 => </li>
                        <li class="pas-executie pas5 hide">se apeleaza ramura 2 a returnului anterior, si anume isBstUtil(NULL,2,1) – Nodul este NULL, se returneaza 1 =></li>
                        <li class="pas-executie pas6 hide">s-a terminat ramura din stanga a lui 2, acum algoritmul verifica ramura dreapta si anume isBstUtil(3,3,3) – Nodul nu este NULL si se afla in [3,3] =></li>
                        <li class="pas-executie pas7 hide">isBstUtil(NULL,3,2) – Nodul este NULL, se returneaza 1 =></li>
                        <li class="pas-executie pas8 hide">se apeleaza ramura 2 a returnului anterior, si anume isBstUtil(NULL,4,3) – Nodul este NULL, se returneaza 1 si acum a fost verificat tot subarborele cu 2 drept radacina, agloritmul va trece acum in partea dreapta a adevaratei radacini =></li>
                        <li class="pas-executie pas9 hide">isBstUtil(5,5,INT_MAX) – Nodul nu este NULL si este in [5,INT_MAX] => </li>
                        <li class="pas-executie pas10 hide">isBstUtil (NULL,5,4) – Nodul este NULL, se returneaza 1 si se apeleaza ramura 2 a returnului anterior si anume isBstUtil(NULL,6,INT_MAX) – Nodul este NULL, se returneaza 1, ceea ce inseamna ca si subarborele ce are drept radacina 5 este BST, functia se intoarce in 4, si deoarece ambele ramuri ale sale sunt BST, si acesta este BST, functia afisand pe ecran: „Este BST”.</li>
                      </ol>
                      <div class="navigatie-sageti" style="position: absolute; top: 70%; left: 4%;">
                        <i class="fas fa-arrow-left fa-arrow-custom"></i>
                        <i class="fas fa-arrow-right fa-arrow-custom"></i>
                      </div>
                  </div>
                </div> 
</body>
<script src="main.js"></script>
</html> 

Почему это происходит?

Ответ №1:

  1. Когда вы уменьшаете classCounter с 10, ваша функция начинается с classCounter — поэтому она скрывает 9-й элемент, а не 10-й.
  2. Когда вы добираетесь до classCounter = 1, ваша функция снова начинается с приращения, поэтому она добавляет второй элемент, а не 1-й.
  3. Увеличьте значение до 10 снова, и у вас не будет 1-го (2.) элемента и 10-го (1.), Потому что вы настраиваете класс для элемента, который уже виден.

Короче говоря, вам следует переосмыслить, где должны быть classCounter и classCounter— .

Комментарии:

1. Я исправил это, переместив «classCounter—» ниже строки, которая переключается. Это решение?

2. Если вам не нужно скрывать 1-й элемент, этого должно быть достаточно.