addClass和removeClass jQuery问题(SetTimeout在循环中不起作用)



首次过帐。我很难让一些代码正常工作。我正在创建一个Simon Says游戏,并试图使用jQuery中的setTimeout函数来实现向项目数组添加和删除类。当我在while循环之外单独使用addClass和removeClass方法时,它会更改类,然后再将其改回。然而,当我把它放在while循环中时(这样我就可以循环前面的Simon Says按钮序列(,类被添加到元素中,但在setTimeout函数上分配的时间之后不会变回。

这是代码:

var buttonColors = ["red", "blue", "green", "yellow"];
var gamePattern = [];
function nextSequence() {
var randomNumber = Math.floor(Math.random() * 4);
gamePattern.push(randomNumber);
// $("#" + buttonColors[randomNumber]).addClass("pressed");
// setTimeout(function() {
//   $("#" + buttonColors[randomNumber]).removeClass("pressed");
// }, 500);
var ticker = 0;
while (ticker < gamePattern.length) {
console.log("#" + buttonColors[gamePattern[ticker]]);
$("#" + buttonColors[gamePattern[ticker]]).addClass("pressed");
setTimeout(function() {
$("#" + buttonColors[gamePattern[ticker]]).removeClass("pressed");
}, 500);
ticker += 1;
}
}
<link href="https://fonts.googleapis.com/css?family=Press+Start+2P" rel="stylesheet">
<h1 id="level-title">Press A Key to Start</h1>
<div class="container">
<div lass="row">
<div type="button" id="green" class="btn green">
</div>
<div type="button" id="red" class="btn red">
</div>
</div>
<div class="row">
<div type="button" id="yellow" class="btn yellow">
</div>
<div type="button" id="blue" class="btn blue">
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

注释部分是实际用于更改元素并在500ms后将其更改回的代码。在while循环中,console.log消息确实显示了正确的信息。

发生了什么

实际上问题是while循环不会等待setTimeout。因此,它将在执行setTimeout处理程序之前递增ticker。由于当ticker获得增量时,gamePattern是一个元素的数组,因此gamePattern[ticker]的结果将是undefined,因此它不会在DOM中找到这样的元素。

如何解决此问题

为了解决这个问题,您需要为每个执行设置不同的时间延迟,然后我们需要使用一个简单的closure来保持ticker的当前值,然后将其正确地传递给setTimeout。在您的特定情况下,函数最初需要执行,因此我们需要使用匿名function

所以你的最终代码应该是这样的:

var buttonColors = ["red", "blue", "green", "yellow"];
var gamePattern = [];
function nextSequence() {
var randomNumber = Math.floor(Math.random() * 4);
gamePattern.push(randomNumber);
// $("#" + buttonColors[randomNumber]).addClass("pressed");
// setTimeout(function() {
//   $("#" + buttonColors[randomNumber]).removeClass("pressed");
// }, 500);
var ticker = 0;
while (ticker < gamePattern.length) {
$("#" + buttonColors[gamePattern[ticker]]).addClass("pressed");
console.log("#" + buttonColors[gamePattern[ticker]]);
(function(ticker) {
setTimeout(function() {
$("#" + buttonColors[gamePattern[ticker]]).removeClass("pressed");
console.log("#" + buttonColors[gamePattern[ticker]]);
}, 500 * ticker)
})(ticker++)
}
}
nextSequence();
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Simon</title>
<link rel="stylesheet" href="styles.css">
<link href="https://fonts.googleapis.com/css?family=Press+Start+2P" rel="stylesheet">
</head>
<body>
<h1 id="level-title">Press A Key to Start</h1>
<div class="container">
<div lass="row">
<div type="button" id="green" class="btn green">
</div>
<div type="button" id="red" class="btn red">
</div>
</div>
<div class="row">
<div type="button" id="yellow" class="btn yellow">
</div>
<div type="button" id="blue" class="btn blue">
</div>
</div>
</div>
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- Javascript -->
<script src="game.js" charset="utf-8"></script>
</body>
</html>

最新更新