Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未设置clearInterval_Javascript_Ajax - Fatal编程技术网

Javascript 未设置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 =

我正在尝试创建一个按钮来切换setInterval/clearInterval。setInterval将正常工作,但再次单击按钮时,clearInterval未完成。这是一个可变范围问题还是函数设置的问题


只需删除
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()
来完全覆盖插入符号。你很可能是对的!