javascript - 如何显示下一个 div 并隐藏前一个?
问题描述
Javascript 新手,我正在开发一个类似测验的解决方案,它使用 div 和按钮来循环问题。我已经在 Javascipt 中编写了一些代码,但由于某种原因,它没有解决应该停止的最后一个问题。任何帮助将不胜感激为什么下一个问题没有转到最后一个问题。
var question = document.querySelectorAll('.question');
var next = document.getElementById("next");
next.addEventListener("click", function() {
var question = document.querySelectorAll(".question");
for (var i = 0; i < question.length; i++) {
if (question[i].style.display != "none") {
question[i].style.display = "none";
//resets to original questions
if (i == question.length - 1) {
question[0].style.display = "block";
} else {
question[i + 1].style.display = "block";
}
break;
}
}
});
.question {
margin: 50px;
width: 300px;
height: 300px;
border-radius: 10px;
padding: 50px;
text-align: center;
color: white;
background: #333;
position: relative;
display: none;
}
.visible {
display: block;
}
.q-input,
.move {
margin: 10px;
border: none;
padding: 10px;
}
.move {
display: flex;
justify-content: space-between;
}
.move button {
padding: 5px;
font-size: 16px;
width: 60px;
border-radius: 5px;
border: none;
cursor: pointer;
transition: 0.4s;
}
.move button:hover {
box-shadow: -2px -2px 20px #fff;
}
.move button:focus {
outline: none;
}
<div class="question visible">
<h1>Question <span class="one">1</span></h1>
<p>What is your Name</p>
<input type='text' class="q-input">
<div class="move">
<button id="prev">Prev</button>
<button id="next">Next</button>
</div>
</div>
<div class="question">
<h1>Question 2</h1>
<p>What is your Age</p>
<input type="text" class="q-input">
<div class="move">
<button id="prev">Prev</button>
<button id="next">Next</button>
</div>
</div>
<div class="question">
<h1>Question 3</h1>
<p>What is your Sex</p>
<input type="text" class="q-input">
<div class="move">
<button id="prev">Prev</button>
<button id="next">Next</button>
</div>
</div>
解决方案
您正在使用 document.getElementById("next")
它只返回 ID 为 next 的第一个按钮,因此只有该按钮会获得添加到它的点击侦听器。
ID 只是一个唯一元素,因此您应该改用 class - 将其更改为<button class="next">Next</button>
在您的 JS 中,您应该选择所有这些下一个按钮元素,并使用forEach
它为所有这些元素添加一个侦听器。
parentElement
然后在该侦听器中,您可以使用and让连接的问题 div 显示/隐藏nextElementSibling
,并在更改可见性之前检查下一个元素是问题。
visible
此外,与尝试手动编辑样式属性相比,添加/删除类更简洁、更容易调试。
所有这些看起来像:
var nextButtons = document.querySelectorAll('.next');
nextButtons.forEach(nextButton =>
nextButton.addEventListener("click", function() {
var currentQuestion = nextButton.parentElement.parentElement;
var nextElement = currentQuestion.nextElementSibling;
if (nextElement.classList.contains("question")) {
nextElement.classList.add("visible");
currentQuestion.classList.remove("visible");
}
}));
.question {
margin: 50px;
width: 300px;
height: 300px;
border-radius: 10px;
padding: 50px;
text-align: center;
color: white;
background: #333;
position: relative;
display: none;
}
.visible {
display: block;
}
.q-input,
.move {
margin: 10px;
border: none;
padding: 10px;
}
.move {
display: flex;
justify-content: space-between;
}
.move button {
padding: 5px;
font-size: 16px;
width: 60px;
border-radius: 5px;
border: none;
cursor: pointer;
transition: 0.4s;
}
.move button:hover {
box-shadow: -2px -2px 20px #fff;
}
.move button:focus {
outline: none;
}
<div class="question visible">
<h1>Question <span class="one">1</span></h1>
<p>What is your Name</p>
<input type='text' class="q-input">
<div class="move">
<button class="prev">Prev</button>
<button class="next">Next</button>
</div>
</div>
<div class="question">
<h1>Question 2</h1>
<p>What is your Age</p>
<input type="text" class="q-input">
<div class="move">
<button class="prev">Prev</button>
<button class="next">Next</button>
</div>
</div>
<div class="question">
<h1>Question 3</h1>
<p>What is your Sex</p>
<input type="text" class="q-input">
<div class="move">
<button class="prev">Prev</button>
<button class="next">Next</button>
</div>
</div>
推荐阅读
- python - Discord Bot 未上线
- c - 如果条件没有正确输出但它在 C 中编译
- python - 更新帖子“'bytes'对象没有属性'_committed'”时Django管理面板错误
- jquery - jQuery make child element and parent element show on hover and fade out when not
- python - 如何获取具有唯一列值的行数(按其他列值分组)?
- python - 如何在 BeautifulSoup find_all ResultSet 之外继续过滤?
- javascript - 如何创建一个显示所有已连接用户的光标位置的页面?Node.js、ws、快递
- automation - exists().click 不适用于空手道 0.9.6.RC3 版本
- laravel - laravel控制器中的复选框值
- android - declareMock<> 在 android 单元测试中不能与 mockk 一起使用