我使用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();
    }
};

10-07 22:34