JS:window.setInterval仍然在后台运行?

时间:2010-12-29 13:21:41

标签: javascript jquery

我的代码就像:

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(),有没有办法阻止它?

1 个答案:

答案 0 :(得分:4)

是的,您可以使用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,将其设为私有将是一个问题。)

但是如果它们已经在某些东西(可能是一个事件处理函数)中,那么你已经有了一个私有范围而且不需要这样做。