简体   繁体   English

如何停止setInterval循环

[英]How to stop setInterval loop

I've setup a setInterval to change the colour of a div using different css classes. 我已经设置了setInterval,以使用不同的CSS类更改div的颜色。 I start it changing colours by pressing a button, but I also want to stop it changing colours using the same button. 我通过按一个按钮来开始改变颜色,但是我也想停止使用相同的按钮来改变颜色。 I can't get that to work. 我不能让它工作。 Here is my js: 这是我的js:

    var bsstyles = ["alert alert-success","alert alert-info","alert alert-warning","alert alert-danger"];

    var i = 0;

    var buttonstate = false;

    var runner;

    var mainfun = function () {
        if (buttonstate == 0) {
            buttonstate = true;
            document.getElementById("changebutton").className = "btn btn-primary btn-lg active";
            var runner = setInterval(function() {
                document.getElementById("alertw").className = bsstyles[i];
                i++;
                if (i==bsstyles.length) {
                        i=0;
                }
            },1000);
        } else {
            clearInterval(runner);
            document.getElementById("changebutton").className = "btn btn-primary btn-lg";
            buttonstate = false;
        }
    }

    var changeButton = document.getElementById("changebutton");

    changeButton.addEventListener('click',mainfun,false);

Here is the JSFiddle 这是JSFiddle

when you define mainfun you need to remove the var keyword before 'runner' 当您定义mainfun您需要在“ runner”之前删除var关键字

by using the var keyword there you are defining a new local variable that no longer references your global variable runner 通过使用var关键字,您可以定义一个不再引用全局变量运行器的新局部变量

so the code should look like 所以代码应该看起来像

var bsstyles = ["alert alert-success","alert alert-info","alert alert-warning","alert alert-danger"];

var i = 0;

var buttonstate = false;

var runner;

var mainfun = function () {
    if (buttonstate == 0) {
        buttonstate = true;
        document.getElementById("changebutton").className = "btn btn-primary btn-lg active";
        runner = setInterval(function() {
            document.getElementById("alertw").className = bsstyles[i];
            i++;
            if (i==bsstyles.length) {
                    i=0;
            }
        },1000);
    } else {
        clearInterval(runner);
        document.getElementById("changebutton").className = "btn btn-primary btn-lg";
        buttonstate = false;
    }
}

var changeButton = document.getElementById("changebutton");

changeButton.addEventListener('click',mainfun,false);

I often store Interval handles on the function itself (assuming I know there will only be one instance) : 我经常将Interval句柄存储在函数本身上(假设我知道只有一个实例):

mainfun.runner = setInterval(function () {
    //Content
}, 1000);
clearInterval( mainfun.runner );

This prevents having a global 'runner' var around that might get overwritten by accident. 这样可以避免全局“运行”变量可能被意外覆盖。 (mainfun.runner is globally accessible as well, of course, but less likely to be written to accidentally.) (当然,mainfun.runner也可以在全球范围内访问,但不太可能被意外写入。)

All the other answers have pointed out the actual problem, overriding a global variable with a local one, but I thought I would simplify your code a bit: 所有其他答案都指出了实际问题,用局部变量覆盖了全局变量,但我想我可以简化一下代码:

var runner = null, i = 0;

var changeClassById = function(id, className) {
    document.getElementById(id).className = className;
};

var mainfun = function () {
    if (runner) {
        clearInterval(runner);
        changeClassById("changebutton", "btn btn-primary btn-lg");
        runner = null;
    } else {
        changeClassById("changebutton", "btn btn-primary btn-lg active");
        runner = setInterval(function() {
            changeClassById("alertw", bsstyles[++i % bsstyles.length]);
        }, 1000);
    }
}

Fewer lines of code means fewer chances to screw up. 更少的代码行意味着更少的出错机会。

You are redefining runner in your if statement. 您正在重新定义runner在你的if语句。 Remove var : http://jsfiddle.net/g6to2gqn/2/ 删除varhttp : //jsfiddle.net/g6to2gqn/2/

You are redeclaring the variable of the interval runner; 您正在重新声明间隔跑步者的变量; Just remove var on thie line var runner = setInterval(function() { 只需删除该行上的var runner = setInterval(function() { varRunner var runner = setInterval(function() {

Here http://jsfiddle.net/g6to2gqn/4/ 在这里http://jsfiddle.net/g6to2gqn/4/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM