JavaScript:Last setInterval比预期的持续时间更长
以前我曾就如何修复javascript代码寻求过帮助,现在我已经修复了,但是我的代码有问题吗?因为最后一个阵列保持打开的时间超过1秒,所以它保持打开的时间大约为5秒。这是因为我正在重置数组,还是在Javascript中这很正常JavaScript:Last setInterval比预期的持续时间更长,javascript,Javascript,以前我曾就如何修复javascript代码寻求过帮助,现在我已经修复了,但是我的代码有问题吗?因为最后一个阵列保持打开的时间超过1秒,所以它保持打开的时间大约为5秒。这是因为我正在重置数组,还是在Javascript中这很正常 function Background() { var Backgrounds = [ '#333', '#777', '#999', '#CCC' ], Max_Backgrounds = Backgrounds.length,
function Background()
{
var Backgrounds = [
'#333', '#777', '#999', '#CCC'
],
Max_Backgrounds = Backgrounds.length,
Background_Stage = -1;// Yes, it's meant to be -1 so when background_stage++; is called it will make it 0 thus start at the beginning of the array.
setInterval(function() {
if(Background_Stage >= Max_Backgrounds) Background_Stage = -1;
$('body').css('background', Backgrounds[Background_Stage++]);
}, 1000);
}
正如在评论中指出的,您没有在上一次迭代中更改背景,这就是为什么它比其他迭代逗留的时间更长,这应该保持它的一致性 工作示例:
我建议不要进行-1初始化,而是使用模块。i、 e.
3%2==1
产生除法的剩余部分
另外,setInterval会漂移,因此我宁愿使用setTimeout,并在1秒后再次执行:
相当于
$('body').css('background', Backgrounds[Background_Stage]);
Background_Stage = Background_Stage + 1;
每次循环时,背景都被设置为未定义。如果您希望在访问变量之前使用变量增量,则需要使用
$('body').css('background', Backgrounds[++Background_Stage]);
完整示例(如果条件也已修改):
为什么将
Background\u Stage
设置为-1而不是0?另外:您可以重置它,而不是切换背景。旁注:Javascript不是Java。@Joachim Sauer我将它设置为-1,因为0是起始数组号,而背景是++;将其设置为0,而将其设置为1。@Ingo Bürk我知道这是一个输入错误。我添加了更新的代码,但仍然持续5秒以上。而且Background\u Stage>Max\u Backgrounds
检查有缺陷,当出现这种情况时已经太晚了。Backgrounds[Background\u Stage++]如果您初始化为0
,则是正确的,而不是更混乱的-1
,如中的(var i=0;i
我同意,但我认为是操作顺序在@Callum中出错。我想解释一下他为什么会有问题,而不仅仅是重构代码。好的,我同意,我在上一次编辑中想,我只是把它重构成更地道的东西
(function () {
var Backgrounds = [
'#333', '#777', '#999', '#CCC'
],
Max_Backgrounds = Backgrounds.length,
Background_Stage = 0,
changeBackground = function () {
$('body').css('background', Backgrounds[Background_Stage]);
Background_Stage = (Background_Stage + 1) % Max_Backgrounds;
setTimeout(changeBackground, 1000);
};
changeBackground();
}());
$('body').css('background', Backgrounds[Background_Stage++]);
$('body').css('background', Backgrounds[Background_Stage]);
Background_Stage = Background_Stage + 1;
$('body').css('background', Backgrounds[++Background_Stage]);
function Background()
{
var Backgrounds = [
'#333', '#777', '#999', '#CCC'
],
Max_Backgrounds = Backgrounds.length,
Background_Stage = -1;// Yes, it's meant to be -1 so when background_stage++; is called it will make it 0 thus start at the beginning of the array.
setInterval(function() {
if(Background_Stage >= Max_Backgrounds - 1) Background_Stage = -1;
$('body').css('background', Backgrounds[++Background_Stage]);
}, 1000);
}