Javascript 重置setTimeout对象(如果存在)

Javascript 重置setTimeout对象(如果存在),javascript,jquery,Javascript,Jquery,当有人单击我的复选框时,我想在一个小弹出元素中显示选中复选框的数量。我的问题是,小弹出元素应该在最后一次单击后5秒消失,这对于单击一个复选框是可以的,但是如果我快速选中5个复选框,计时器仍然设置在第一个框上,导致弹出元素消失得太快 正如您在我的函数中看到的,我曾尝试使用clearTimeout(timeoutName)函数,但在应用它时遇到了一些问题。控制台日志表明clearTimeout(timeoutName)未定义,我可以理解:setTimeout甚至还没有启动 在清除计时器之前,如何检查

当有人单击我的复选框时,我想在一个小弹出元素中显示选中复选框的数量。我的问题是,小弹出元素应该在最后一次单击后5秒消失,这对于单击一个复选框是可以的,但是如果我快速选中5个复选框,计时器仍然设置在第一个框上,导致弹出元素消失得太快

正如您在我的函数中看到的,我曾尝试使用
clearTimeout(timeoutName)
函数,但在应用它时遇到了一些问题。控制台日志表明
clearTimeout(timeoutName)
未定义,我可以理解:setTimeout甚至还没有启动

在清除计时器之前,如何检查计时器是否存在?还是这真的不是最好的方法?选中复选框(此函数运行)时,可能会有计时器运行,但有时可能不会

$('.name_boxes').live('click', function() {
    var checked_count = $('.name_boxes:checked').length;
    // other stuff

    clearTimeout(hide_checked_count_timer); // if exists????????

    $(".checked_count").hide();
    $(".checked_count").text(checked_count+" names selected");
    $(".checked_count").show();

    hide_checked_count_timer = setTimeout(function() {
        $(".checked_count").hide();
    },5000);
});

感激地收到任何帮助…

只需在单击处理程序外声明计时器变量:

var hide_checked_count_timer;
$('.name_boxes').live('click', function() {
    var checked_count = $('.name_boxes:checked').length;
    // other stuff

    clearTimeout(hide_checked_count_timer); // if exists????????

    $(".checked_count").hide();
    $(".checked_count").text(checked_count+" names selected");
    $(".checked_count").show();

    hide_checked_count_timer = setTimeout(function() {
        $(".checked_count").hide();
    },5000);
});


考虑到
.live
已被弃用,您应该使用以下方式委派事件:


您可以使用短路操作员的电源

hide_checked_count_timer && clearTimeout(hide_checked_count_timer);

仅当左侧变量未定义时,右侧语句才会运行。

Q.控制台日志表明clearTimeout(timeoutName)未定义,我可以理解:setTimeout甚至还没有启动。

A.的返回值为
未定义
,无论是否有要清除的超时。它没有一个可以测试的“成功”概念。如果存在与您传递的id相关联的排队超时,那么它将被清除,否则不会发生任何事情

Q.如何在清除计时器之前检查计时器是否存在?

你不能这样做,至少在存在一些可以查询的未完成超时注册表的意义上不能这样做。如您所知,将返回刚刚排队的超时的id,您可以在它运行之前使用该id清除它,但无法测试它是否已运行。id只是一个数字,因此保存它的变量将继续保留该数字,即使在超时已运行或已清除之后也是如此

使用已经运行的超时id调用
clearTimeout()
,这一点都没有坏处-基本上,如果该id的超时在队列中,它将被清除,否则不会发生任何事情

测试“是否存在尚未运行的未完成超时”的最简单方法是,在超时运行时,将保存timerid的变量设置为null,即在您排队的函数中:

var timerid = setTimout(function() {
                 timerid = null;
                 // other operations here as needed
              }, 5000);

// in some other code somewhere
if (timerid != null) {
   // timer hasn't run yet
} else {
   // timer has run
}

保存timerid的变量需要位于可以在设置和测试时访问的范围内,即不要在事件处理程序中将其声明为局部变量。

要检查它是否存在,请使用

if (typeof timerid == 'undefined')
{
    //timer has not been set so create it
    timerid = setTimeout(function(){ var something = true;}, 5000);
}

您希望何时清除超时?对不起,我不明白。可能重复:哇,就这么简单。感谢Mate注意到,测试
隐藏\u检查\u计数\u计时器是否未定义实际上并不能告诉您超时是否已运行,或是否已清除。@nnnnnn对,计时器不提供访问此信息的权限,您必须自己使用标志来执行此操作。我相信OP只需要避免脚本错误
if (typeof timerid == 'undefined')
{
    //timer has not been set so create it
    timerid = setTimeout(function(){ var something = true;}, 5000);
}