为什么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_start
和stop_
我有:
$('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秒时,似乎开始一次做两次,然后三次,等等!看来,如果我每隔一段时间更改一次,运行速度会更快,速度更快。问题是什么?
答
的问题是在这里:
(function() {
extras();
var check = setInterval(function() {
extras();
},15000);
})();
你正在创造一个新的功能范围不能接近该范围之外的变量check
。 Microsoft在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
非常感谢。我从来没有想到问题出现在全局变量中。我的问题解决了。问候。 –
'check'不在第二点击处理程序的范围内... – Li357
感谢您的回答。你怎么知道?我的意思是,当AJAX在完整的函数完成并且beforeSend我停止最后一个setInterval时,我重新启动我的setInterval。 –