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