javascript - 防止 addEventListener 在 forEach 循环中再次运行
问题描述
首先,我想知道我对问题原因的看法是否正确。
const updateScore = (isCorrect) => {
// Update Game Variables
if (isCorrect === true) {
counter++;
score += 100;
}
};
// Reset Styling
const resetLoadedQuestionStyling = (isCorrect) => {
questionScreen.style.display = 'none';
answerArr.forEach(answer => {
answer.classList.remove('correct');
answer.classList.remove('wrong');
answer.classList.remove('disable');
});
updateScore(isCorrect);
};
const styleAnswer = (div, isCorrect) => {
if (isCorrect === true) {
div.classList.add('correct');
} else {
div.classList.add('wrong');
for (let i = 0; i < answerArr.length; i++) {
if (i === currentQuestion.correct) {
answerArr[i].classList.add('correct');
}
}
}
// Prevent Second Check
answerArr.forEach(answer => {
answer.classList.add('disable');
});
// Reset Styling
setTimeout(() => {
resetLoadedQuestionStyling(isCorrect);
}, 3000);
};
const checkAnswer = (div, index) => {
const userChoice = index;
// Default Answer State
let isCorrect = false;
if (userChoice === currentQuestion.correct) {
isCorrect = true;
}
styleAnswer(div, isCorrect);
};
answerArr.forEach((div, index) => {
div.addEventListener('click', () => {
checkAnswer(div, index);
});
});
我
counter
更新了 1 次,那 2 次......我认为这个问题的原因是我EventListener
处于一个forEach
循环中,对吗?如何预防?
谢谢!
编辑:添加了更多代码以使我的想法更好。
编辑: answerArr 是我的 HTML 中的 4 个 div 数组
解决方案
可能存在与 setTimeout 相关的问题。每次单击答案时,计数器设置为在 3 秒后递增。
这是单击答案时的顺序:
'click'
checkAnswer ->
styleAnswer ->
setTimeout =>
resetLoadedQuestionStyling ->
updateScore ->
counter++
下面是删除了所有不相关行的代码。每次点击后它都会增加计数器,但仅在 3 秒后。
const answerArr = [...document.querySelectorAll('button')];
let counter = 0;
const span = document.getElementById('counter');
const updateScore = (isCorrect) => {
if (isCorrect === true) {
counter++
}
span.innerText = counter;
}
const resetLoadedQuestionStyling = (isCorrect) => {
updateScore(isCorrect)
}
const styleAnswer = (div, isCorrect) => {
// Reset Styling after 3 seconds
setTimeout(() => {
resetLoadedQuestionStyling(isCorrect);
}, 3000);
}
const checkAnswer = (div, index) => {
styleAnswer(div, true);
}
answerArr.forEach((div, index) => {
div.addEventListener('click', () => {
checkAnswer(div, index);
});
});
<button>Answer 1</button><br>
<button>Answer 2</button><br>
<button>Answer 3</button><br>
<button>Answer 4</button><br>
<p>Counter: <span id="counter"></span></p>
推荐阅读
- graphql - 无法在 Drupal GraphQL 插件中重新声明类
- r - 在 geom_line() 中更改线条颜色后向混合 ggplot 添加图例
- java - 带有 CompletableFuture 的 Rest 端点与没有 CompletableFuture 的 Rest 端点
- vue.js - 如何在 vue 路由中使用组件?
- c++ - 是否可以有一个可变参数模板,其中一个参数是参数包,下一个参数是同一参数包的 std::function?
- json - 获取 Observable 的值
进入打字稿中的数组 - vb.net - 如何通过 vb.net 使用命令提示符来使用 BCDEDIT
- go - 如何在 OSX 上获取 os 环境变量?
- azure - Azure 搜索匹配同一对象的两个属性
- java - 当用户没有输入“是”或“否”时,我需要帮助让该程序打印“无效响应”,我该如何简单地做到这一点?