Javascript 未设置clearInterval
我正在尝试创建一个按钮来切换setInterval/clearInterval。setInterval将正常工作,但再次单击按钮时,clearInterval未完成。这是一个可变范围问题还是函数设置的问题Javascript 未设置clearInterval,javascript,ajax,Javascript,Ajax,我正在尝试创建一个按钮来切换setInterval/clearInterval。setInterval将正常工作,但再次单击按钮时,clearInterval未完成。这是一个可变范围问题还是函数设置的问题 只需删除int的第二个声明 $(function () { var int; $('button[id^=temp]').click(function () { window.id = $(this).attr("value"); int =
只需删除
int
的第二个声明
$(function () {
var int;
$('button[id^=temp]').click(function () {
window.id = $(this).attr("value");
int = setInterval(doAjax, 3000); //remove var to prevent new declaration
if (onrepeat == false) {
$(this).find('i').addClass("fa-spin");
doAjax();
int;
onrepeat = true;
} else {
clearInterval(int);
$(this).find('i').addClass("fa-spin");
onrepeat = false;
}
});
});
JS小提琴:
这是一个可变范围问题吗
对。您已经使用了两次,第二次引入了一个局部变量,您确实希望访问外部变量
但是,对于使用该选择器的所有元素,使用单个int
变量仍然可能会遇到问题。我现在已经创建了一个对象,它存储对象上每个元素id的间隔id,您还可以使用each
循环为每个元素创建一个额外的变量
另外,您的全局变量id
非常糟糕,最好为doAjax
函数使用一个参数
$(function () {
var ints = {};
$('button[id^=temp]').click(function () {
var id = $(this).attr("value");
if (id in ints) {
$(this).find('i').removeClass("fa-spin");
clearInterval(ints[id]);
delete ints[id];
} else {
$(this).find('i').addClass("fa-spin");
doAjax(id);
ints[id] = setInterval(function() {
doAjax(id);
}, 3000);
}
});
});
真正的问题是它每次都在创造新的间隔。想想看,每一次“点击”都在运行该代码(因此它在执行一个setInterval) 解决方案是在click之外声明int一次(并且只声明一次)。然后在条件内移动设置间隔
var int;
var onrepeat;
$('button[id^=temp]').click(function () {
window.id = $(this).attr("value");
if (onrepeat == false) {
$(this).find('i').addClass("fa-spin");
doAjax();
int = setInterval(doAjax, 3000);
onrepeat = true;
} else {
clearInterval(int);
$(this).find('i').addClass("fa-spin");
onrepeat = false;
}
});
您的问题是变量int
的范围。您正在函数中声明它,当您认为正在清除间隔时,原始变量int
已被销毁
因此,只需从函数内部的var int=…
中删除var即可
如果问题依然存在,请继续阅读下面的内容
好吧,我已经经历了太多同样的问题,通常我只是顺其自然,
但大多数时候,我意识到在清除interval之后,interval会继续运行,这可能会影响设备的性能(就像有一个无限循环)
所以我做了一些研究,发现了问题所在,并编写了一个简单的代码来解决它
现在,在大多数情况下,当您启动一个间隔(很可能由事件触发)时,会声明该间隔的多个实例(无论出于何种原因)
因此,当您稍后清除间隔时,您只清除*顶级间隔,然后设置下一个级别间隔。
(顶级可能不是正确的词)
因此,为了真正清除间隔,我使用了以下方法:
设置间隔:
if(!timer)
timer =setInterval(myFunction, 1000);
clearInterval(timer);
timer=null;
while (timer!== null){
timer=null;
}
清除间隔:
if(!timer)
timer =setInterval(myFunction, 1000);
clearInterval(timer);
timer=null;
while (timer!== null){
timer=null;
}
您可能会决定清除while循环中的间隔,但我发现这对我来说是有效的,而且效率更高
确保检查间隔变量的范围(即在上述情况下的计时器)
什么是
int
for?无需在声明中指定int
初始值,特别是不需要指定一个甚至合适的不同类型的初始值。无需将其设置为全局值!更大的问题是每次点击(点击和点击关闭)都会声明setInterval,所以这就是为什么当它真的在开关和再次开关(以及倍增)时,它似乎没有关闭。请看下面我的解决方案。他给了按钮一个id,所以我想他打算只给一个。不确定是否需要ID列表…@isick:选择器看起来好像有多个按钮的ID以temp
开头。不过我还没看小提琴呢。如果他真的只需要一个按钮,一个简单的int
变量就可以了,但是$(“#temp”)。应该使用click()
来完全覆盖插入符号。你很可能是对的!