javascript - 由于 .classList.toggle,按钮的行为很奇怪
问题描述
我有一个带有一些箭头按钮的菜单。如果您单击这些箭头按钮,则会出现另一个 div。
它工作正常 - 但我注意到一些奇怪的事情。如果我按右箭头 9 次(直到显示所有 10 个 div),按左箭头 9 次(直到只显示第一个 div)然后尝试按右箭头 9 次(所以所有 10 个 div再次显示)菜单卡在第 8 格,我不明白为什么。
我的代码有什么问题吗?
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>
为什么会这样?
解决方案
- 当您从 10 递减 classCounter 时,您的函数以 classCounter 开头——因此它隐藏了第 9 个元素而不是第 10 个元素。
- 当您到达 classCounter = 1 时,您的函数再次以增量开始,因此它添加了第二个元素而不是第一个元素。
- 再次增加到 10 并且您没有第一个 (2.) 元素和第 10 个 (1.) 元素,因为您正在对已经可见的元素进行类切换。
简而言之,您应该重新考虑 classCounter++ 和 classCounter-- 应该在哪里。
推荐阅读
- angular - ToastId 未定义
- java - 递归的动作顺序是什么?
- amazon-web-services - 将日志从 ECS Fargate 发送到 Elasticsearch 的最佳方法
- kotlin - 如何在 Kotlin 对象 Singleton 类中测试 add 方法
- python - 如何使用正则表达式删除带有空格的字符串(由特殊字符组成)?
- sql - 如何在 PostgreSQL 中为数据库的特定对象提取 DDL
- generics - 是否可以在 vala 中创建泛型类型的实例
- azure - Azure PowerShell:如何验证输入的存储帐户是否属于某个订阅
- amazon-web-services - 通过 CloudFormation 使用 EnableCloudwatchLogsExports 参数创建 RDS aurora-mysql5.7
- git - git add 是否只将未跟踪的文件或修改的文件添加到暂存区?