【发布时间】:2023-02-02 07:54:07
【问题描述】:
我正在尝试更改我的 HTML 页面的背景颜色,如果单击按钮 id = 'button4',则每 200 毫秒使用 setInterval。当用户再次点击同一个按钮时,我希望背景颜色的改变停止。
setInterval 的代码在分配给 var x 时执行,而我想在调用“goCrazy”函数内部满足条件时执行它。那怎么办?
clearInterval 工作正常,颜色变化停止。
下面是我的代码。
var x = setInterval(() => {
const rndInt1 = randomIntFromInterval(0, 255);
const rndInt2 = randomIntFromInterval(0, 255);
const rndInt3 = randomIntFromInterval(0, 255);
document.body.style.backgroundColor = `rgb(${rndInt1}, ${rndInt2}, ${rndInt3})`;
}, 200);
function goCrazy() {
if (document.getElementById('button4').innerText == 'Go Crazy') {
document.getElementById('button4').innerText = 'stop';
x;
}
else {
clearInterval(x);
document.getElementById('button4').innerText = 'Go Crazy';
}
}
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
我正在尝试更改我的 HTML 页面的背景颜色,如果单击按钮 id = 'button4',则每 200 毫秒使用 setInterval。当用户再次点击同一个按钮时,我希望背景颜色的改变停止。
setInterval 的代码在分配给 var x 时执行,而我想在调用“goCrazy”函数内部满足条件时执行它。那怎么办?
clearInterval 工作正常,颜色变化停止。
下面是我的代码。
var x = setInterval(() => {
const rndInt1 = randomIntFromInterval(0, 255);
const rndInt2 = randomIntFromInterval(0, 255);
const rndInt3 = randomIntFromInterval(0, 255);
document.body.style.backgroundColor = `rgb(${rndInt1}, ${rndInt2}, ${rndInt3})`;
}, 200);
function goCrazy() {
if (document.getElementById('button4').innerText == 'Go Crazy') {
document.getElementById('button4').innerText = 'stop';
x;
}
else {
clearInterval(x);
document.getElementById('button4').innerText = 'Go Crazy';
}
}
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
【问题讨论】:
-
您可能让您的 setInterval 回调在后台运行并检查您将通过单击按钮翻转的全局布尔值。这里肯定有类似的问题
-
“setInterval 的代码在我将其分配给 var x 后立即执行”- 好吧,当你称呼一个函数,它里面的代码就会执行。
-
“setInterval 的代码在分配给 var x 时执行,因为我想在调用‘goCrazy’函数内部满足条件时执行它。” - 怎么了,呃,将满足条件时应执行的代码放入条件中?
-
id只是一个ID。它是通话结果功能。可以从条件内的代码将其分配给范围更广的变量。这是迄今为止您得到的答案的基本共同点。那是混乱的地方吗?
-
@Fakipo ... OP 可能会检查我提供的答案的最新编辑。第二种方法从
this-context aware(因此明确绑定)事件处理程序更改为this-context-free closure。顺便说一句,这两种方法都是非常好的“惯用 JavaScript”。两个示例代码都作为可执行堆栈 sn-ps 提供,因此它们都证明了它们的每个描述声称它在做什么。选择与哪个一起去是在 OP 上。
标签: javascript