我使用JavaScript中的setTimeout()函数在不同时间显示一组对象我所做的是为每个元素运行一个循环,我为它自己初始化了一个setTimeout事件。
我用来为每个元素设置超时的代码:
for (i = currentIndex; i < this.items.length; i++) {
var object = "element#"+i;
var delay = 10*i;
this.keepDelay[id] = new Timer(function() {
$("#objectSet").css("display", "none").html(object).fadeIn("fast");
currentIndex = id;
}, delay);
}
计时器类是
function Timer(callback, delay) {
var timerId, start, remaining = delay;
// works
this.pause = function() {
window.clearTimeout(timerId);
remaining -= new Date() - start;
};
// works
this.resume = function() {
start = new Date();
id = currentIndex;
timerId = window.setTimeout(callback, remaining);
};
// does NOT work
this.speedup = function() {
remaining -= 100;
window.clearTimeout(timerId);
timerId = window.setTimeout(callback, remaining);
}
// does NOT work
this.slowdown = function() {
remaining += 100;
window.clearTimeout(timerId);
timerId = window.setTimeout(callback, remaining);
}
this.resume();
}
resume()
和pause()
方法确实有效resume()
尝试根据延迟值逐个显示每个对象pause()
是不言而喻的。这两个工作正常。现在我想加速和减慢对象的延迟,我试着编写speedup()和slown()方法,但不知怎么的,它们不起作用。
看看代码,我找不到为什么它不会,也许我已经关注它太久了,所以我需要从一个新的头脑寻求帮助。
最佳答案
你需要计算已经过去的时间,这样你就可以计算出要为多少时间设置一个新的计时器。以下是.speedup()
的示例:
this.speedup = function() {
window.clearTimeout(timerId);
var elapsed = new Date() - start;
remaining-= elapsed + 100;
if (remaining > 0) {
this.resume();
} else {
callback();
}
}
您可以为
.slowdown()
执行类似的操作。我突然想到这可以简单一点:
this.speedup = function() {
this.pause();
remaining-= 100;
this.resume();
}
this.slowdown = function() {
this.pause();
remaining+= 100;
this.resume();
}
然后,将
this.resume()
更改为此值,以确保remaining
不会变为负值:this.resume = function() {
start = new Date();
id = currentIndex;
if (remaining > 0) {
timerId = window.setTimeout(callback, remaining);
} else {
callback();
}
};