我的代码是这样的:

window.setInterval(updateSeconds, 1000);
function updateSeconds() {
    var remainingSeconds = $('#seconds').html() - 1;
    if(remainingSeconds < 0) {
        remainingSeconds = 0;
    }
    $('#seconds').html(remainingSeconds);
    if(remainingSeconds == 0) {
        //stop calling updateSeconds
    }
}


没有问题,除了setInterval仍会继续调用updateSeconds()之外,有没有办法停止它?

最佳答案

是的,您可以使用clearInterval停止计时器:

// Added `var handle`:
var handle = window.setInterval(updateSeconds, 1000);
function updateSeconds() {
    var remainingSeconds = $('#seconds').html() - 1;
    if(remainingSeconds < 0) {
        remainingSeconds = 0;
    }
    $('#seconds').html(remainingSeconds);
    if(remainingSeconds == 0) {
        //stop calling updateSeconds
        window.clearInterval(handle);  // <== added
        handle = 0;                    // <== added
    }
}


如果您的代码在全局范围内,则可能不想创建一个名为handle的新全局变量。您可以通过将其包装在函数中然后立即执行该函数来避免这种情况:

(function() {
    var handle = window.setInterval(updateSeconds, 1000);
    function updateSeconds() {
        var remainingSeconds = $('#seconds').html() - 1;
        if(remainingSeconds < 0) {
            remainingSeconds = 0;
        }
        $('#seconds').html(remainingSeconds);
        if(remainingSeconds == 0) {
            //stop calling updateSeconds
            window.clearInterval(handle);
            handle = 0;
        }
    }
})();


现在handleupdateSeconds是匿名函数专用的。 (显然,如果您需要从其他地方调用updateSeconds,则将其设为私有将是一个问题。)

但是,如果它们已经在某个内部(可能是事件处理函数)中,那么您已经在其中拥有了一个私有作用域,并且不需要这样做。

09-19 05:22