为什么setInterval函数没有停止?

时间:2016-09-25 02:47:25

标签: javascript jquery

我正在尝试清除每15秒运行一次的时间间隔。

这是ajax请求:

function extras()
{
    $x = {
        action:'extras'
    }; 
    var r;
    $.ajax({
        type:'POST',
        url:'services.php',
        data:$x,
        beforeSend:function() {
            $('input[name="stop_"]').trigger("click");
        },
        success:function(response) {
            r = response;   
            //console.log(response)
        },
        complete:function() {
            console.log(r);                 
            $('input[name="re_start"]').trigger("click");
        }
    }); 
}

因此,在我的按钮re_startstop_中,我有:

$('input[name="re_start"]').click(function (event) {
    event.preventDefault();
    clearInterval(check);
    var check = setInterval(function() {
        extras();
    },15000);
    console.log('Starting again...');
});

$('input[name="stop_"]').click(function (event) {
    event.preventDefault();
    clearInterval(check);
    console.log('Stop');
});

在jQuery的DOM中,我初始化函数extras()并将其保存在名为“check”的变量中,其中我按如下方式初始化时间间隔:

<input type="button" style="display:none;" name="re_start">
<input type="button" style="display:none;" name="stop_">

<script type="text/javascript">
    (function() {
        extras();
        var check = setInterval(function() {
            extras();
        },15000);   
    })();
    function extras()
    {
        $x = {
            action:'extras'
        }; 
        var r;
        $.ajax({
            type:'POST',
            url:'services.php',
            data:$x,
            beforeSend:function() {
                $('input[name="stop_"]').trigger("click");
            },
            success:function(response) {
                r = response;   
                //console.log(response)
            },
            complete:function() {
                console.log(r);
                //message_smart(r);                     
                $('input[name="re_start"]').trigger("click");
            }
        }); 
    }   
</script>

然后我无法理解前30秒是如何工作的,以及当他们通过60秒似乎一次开始做两次,然后是三次等等!好像我每秒都会改变间隔,并且运行得越来越快。有什么问题?

1 个答案:

答案 0 :(得分:3)

问题在于:

(function() {
    extras();
    var check = setInterval(function() {
        extras();
    },15000);   
})();

您正在新范围内无法访问的新功能范围中创建变量checkMicrosoft在javascript中有一个很好的范围示例。此外,您可以看到this question

现在要解决您的问题,您需要将check变量放在全局范围内,因此请删除函数包装器。

extras();
var check = setInterval(function() {
    extras();
},15000);  

您还需要更改重启处理程序以重新分配变量,如下所示:

$('input[name="re_start"]').click(function (event) {
    event.preventDefault();
    clearInterval(check);
    check = setInterval(function() {
        extras();
    },15000);
    console.log('Starting again...');
});

现在他们都应该使用相同的check变量,并在清除超时时按预期工作。