为什么setInterval函数不能停止?

问题描述:

我想清除每15秒运行的时间间隔。为什么setInterval函数不能停止?

这里是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()并保持在一个名为“检查”的变量,其中我初始化时间间隔如下:

<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秒时,似乎开始一次做两次,然后三次,等等!看来,如果我每隔一段时间更改一次,运行速度会更快,速度更快。问题是什么?

+3

'check'不在第二点击处理程序的范围内... – Li357

+0

感谢您的回答。你怎么知道?我的意思是,当AJAX在完整的函数完成并且beforeSend我停止最后一个setInterval时,我重新启动我的setInterval。 –

的问题是在这里:

(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变量和工作清除超时时预期。

+0

非常感谢。我从来没有想到问题出现在全局变量中。我的问题解决了。问候。 –