gpt4 book ai didi

javascript - JavaScript 中的俄罗斯方 block : setInterval setTimeout behavior

转载 作者:行者123 更新时间:2023-11-28 17:50:44 26 4
gpt4 key购买 nike

我有一个问题。我正在尝试用 javascript 做一个俄罗斯方 block 游戏(为了学习)。但是,我无法使用 setInterval (或 setTimeout)函数。我想做的是每 2000 毫秒改变下一个案例的颜色。

HTML 代码:

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>PROJET : PROGRAMMATION COTE CLIENT</title>
<link rel="stylesheet" type="text/css" href="index.css">
</head>
<body>
<div class="all">
<div id="A">
<span id="pos1A"></span>
<span id="pos2A"></span>
<span id="pos3A"></span>
<span id="pos4A"></span>
<span id="pos5A"></span>
<span id="pos6A"></span>
<span id="pos7A"></span>
<span id="pos8A"></span>
<span id="pos9A"></span>
<span id="pos10A"></span>
</div>
</div>
<script src="classes.js"></script>
<script src="indexjs.js"></script>
</body>
</html>

CSS 代码:

.all {
display: flex;
flex-direction: column;
}
.all > div {
display: flex;
flex-direction: row;
}
.all > div > span {
width: 20px;
height: 20px;
border: 1px solid gray;
}

JS 代码:

var array = ['pos1A','pos2A','pos3A','pos4A','pos5A','pos6A','pos7A','pos8A','pos9A','pos10A    '];
function downmove(i) {
var element = document.getElementById(array[i]);
element.style.backgroundColor = 'green';
console.log(element);
}
var i;
for(i=0;i<10;i++) {
setInterval(downmove(i),2000);
}

我希望每个 block 都一一改变颜色,但实际上它会为一行中的所有行着色。好像我的间隔不起作用。

enter image description here

最佳答案

那是因为您的 setInterval 调用是错误的。

setIntervalsetTimeout 都将 Function 作为第一个参数,而(在您的示例中)您实际上是立即调用函数(这就是为什么您可以立即看到结果)。您应该查看文档,例如 MDN:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval .

您可以修改 downmove(i) 函数以返回将传递给 setInterval 的新函数,也可以使用匿名函数来包装您 downmove 在间隔内调用,如下所示:

for (i = 0; i<10; i++) {
setInterval(
(function (idx) { downmove(idx); })(i),
2000
);
}

(请注意,我使用 IIFE 来正确处理 i 变量,这可以通过在 for 循环中使用 let i = 0 来避免,但为什么需要这样做是另一个需要讨论的主题,您可以在此处阅读更多相关内容: JavaScript closure inside loops – simple practical example )。

<小时/>

您的代码还有一个问题 - 您想要按顺序更改颜色,但您的实现(即使修复)将在上述 2 秒时间后立即运行每次颜色更改。要解决此问题,您必须以某种方式跟踪先前着色的行并每 2 秒递增一次。

这是一个固定实现的简单示例:

let idx = 0;

const intervalID = setInterval(function () {
if (idx >= 10) {
// Maximum row reached, break the loop...
clearInterval(intervalID);

return;
}

downmove(idx);

idx++;
}, 2000);

(此处无需使用for-loop)。

关于javascript - JavaScript 中的俄罗斯方 block : setInterval setTimeout behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45572682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com