首先,确保您声明pracOnly. 不要使用未声明的变量。还要考虑在 javascript 代码中添加事件侦听器,而不是onclick在 HTML 中使用属性。
就您的问题中所述的问题而言,您不需要循环。您只需要通过跟踪当前显示的问题的索引来一次显示一个问题。
一旦用户点击Answer按钮,检查答案是否正确。如果是,请清除输入并显示下一个问题。否则向用户显示提示答案不正确的警报。
在用户回答完所有问题后,您可能想通知用户他们已经回答了所有问题。
var pracOnly = ['4*2=', '3*3=', '5*5='];
var pracAnswer = 0;
var index = 0;
var input = document.getElementById('p');
var span = document.getElementById('prac');
var answerBtn = document.querySelector('button');
answerBtn.addEventListener('click', function practiceAnswer() {
if (input.value == pracAnswer) {
alert('Correct!');
input.value = '';
showNextQuestion();
} else {
alert('Not correct');
}
});
function showNextQuestion() {
if (index == pracOnly.length) {
return endQuiz();
};
pracAnswer = pracOnly[index][0] * pracOnly[index][2];
span.innerHTML = pracOnly[index];
index++;
}
function endQuiz() {
span.innerHTML = 'Quiz ended.';
input.style.display = 'none';
answerBtn.style.display = 'none';
}
showNextQuestion();
<section>
<span id="prac"></span>
<input type="number" id="p" />
<button type="button">Answer</button>
</section>
使用生成器函数的替代解决方案
或者,您可以使用generator函数并使用循环来迭代数组并一次显示一个问题。这是有效的,因为即使使用循环,生成器函数的执行也可以暂停。
var pracOnly = ['4*2=', '3*3=', '5*5='];
var pracAnswer = 0;
var input = document.getElementById('p');
var span = document.getElementById('prac');
var answerBtn = document.querySelector('button');
function* showNextQuestion() {
for (const question of pracOnly) {
pracAnswer = question[0] * question[2];
span.innerHTML = question;
yield question;
}
endQuiz();
}
var questionGenerator = showNextQuestion();
questionGenerator.next();
answerBtn.addEventListener('click', function practiceAnswer() {
if (input.value == pracAnswer) {
alert('Correct!');
input.value = '';
questionGenerator.next();
} else {
alert('Not correct');
}
});
function endQuiz() {
span.innerHTML = 'Quiz ended.';
input.style.display = 'none';
answerBtn.style.display = 'none';
}
<section>
<span id="prac"></span>
<input type="number" id="p" />
<button type="button">Answer</button>
</section>