【发布时间】:2019-03-18 09:51:04
【问题描述】:
我正在构建一个简单的琐事应用程序,到目前为止它很棒,但我在继续下一个问题时遇到了问题。 奇怪的是,当用户正确回答问题并按下提交按钮时,它确实会增加到下一个问题,但如果他们再次正确回答,它什么也不做。
这是我的代码:
<div class="app">
<h2 id="question"></h2>
<button class="options" type="button" value="val"></button>
<button class="options" type="button" value="val"></button>
<button class="options" type="button" value="val"></button>
<button class="options" type="button" value="val"></button>
</br>
<button id="submit" type="button" name="button">Submit</button>
<button id="back" type="button" name="button">Back</button>
</div>
var data = {
currentQuestion: 0,
questions:[
{
answers:[1,3,5,6],
question:'how much is 3+3',
correctAnswer:6
},
{
answers:[1,3,5,2],
question:'how much is 1+1',
currectAnswer:2
},
{
answers:[1,8,5,6],
question:'how much is 4+4',
correctAnswer:8
},
{
answers:[1,8,10,6],
question:'how much is 4+6',
correctAnswer:8
}
]
}
var options = document.querySelectorAll('.options');
var question = document.querySelector('#question');
var backBtn = document.querySelector('#back');
var submitBtn = document.querySelector('#submit');
function init() {
newQuestion();
optionClick();
evaluate();
back();
}
function newQuestion() {
question.textContent = data.questions[data.currentQuestion].question;
for(var i = 0; i< data.questions.length; i++) {
options[i].textContent = data.questions[data.currentQuestion].answers[i]
}
}
function optionClick() {
options.forEach(function(elem) {
elem.addEventListener('click', function() {
this.classList.toggle('picked')
})
})
}
function evaluate() {
submitBtn.addEventListener('click', function() {
for(i = 0; i < options.length; i++) {
if(options[i].classList.contains('picked') && options[i].textContent == data.questions[data.currentQuestion].correctAnswer && data.currentQuestion <= 6){
options[i].classList.remove('picked')
data.currentQuestion++
newQuestion();
}
}
})
}
【问题讨论】:
-
另外,我目前正在运行 4 个按钮,它们代表可能的答案中的 4 个选项,它们都共享同一个类,我选择它们作为 querySelectorAll 以将它们定义为一个数组。我还在我的 css 中创建了一个简单的“picked”类来点亮所选答案的边框。我的问题是,是否有办法将切换类选项限制为一次只有一个元素,因此如果我单击另一个选项,那么之前选择的选项将被关闭。提前ty(-:
-
您遗漏了附加事件的部分,这对于帮助您解决问题可能很重要。
optionClick是仅在init中运行还是在单击选项时运行?现在的方式是,每次optionClick运行时,它都会为每个按钮重新附加一个新事件。同样,每次evaluate运行时,它都会将一个新的事件处理程序附加到submitBtn。通常,对于这种东西,您只想在开始时附加一次事件。此外,(相关元素的)实际 HTML 结构可能会有所帮助。 minimal reproducible example -
我添加了 HTML。 optionClick 事件是在 init 中设置的,因为它们看起来这个应用程序的方式是你有问题,并且你有 4 个方形按钮,所以当你选择 1 个按钮(答案选项)时,你然后用“提交”提交它按钮,然后进行评估。
-
如果您仅在“1+1 是多少”问题之后才观察到该问题,可能是因为该对象没有“正确答案”属性。相反,它有一个“currectAnswer”属性,这可能会导致问题。
-
我想把这个optionClick事件函数分开,使其模块化
标签: javascript increment ecmascript-5