javascript - 带有计时器的 Javascript 或 Jquery 函数,每次调用时都会重置
问题描述
我正在寻找一种方法来调用一个应该在执行前等待 1000 毫秒的函数。并且当在达到 1000 毫秒之前再次调用该函数时,计时器应该重新启动。这样该函数在最后一次调用后运行 1000 毫秒。
所以假设我有一个按钮:
<button type="button" id="btnclick">Click Me!</button>
我想在最后一次点击后正好 1000 毫秒后显示一个警报。但是当第二次单击按钮时,在 1000 毫秒过去之前,计时器应该重新启动。
- 如果有人单击按钮 1 次,则在单击后 1 秒显示警报。
- 如果有人单击该按钮,然后在 999 毫秒后再次单击,然后在 999 毫秒后再次单击,那么我想在最后一次单击后 1 秒运行该功能(即第一次单击后 2.98 秒)。
这可能吗?如何?我最好的猜测是这样的:
function delay(callback, ms) {
var timer = 0;
return function () {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
callback.apply(context, args);
}, ms || 0);
};
}
$('#btnclick').click(function(e){
console.log('I want to see this everytime the button is clicked, without any delay');
delay(waitFunction(),1000);
});
function waitFunction(){
console.log('I want to see this 1 second after the LAST click');
}
(灵感来自:等待函数直到用户停止输入)
解决方案
对的,这是可能的。您只需要检查超时是否已经倒计时,如果是,请重置它。这是一个简单的例子。
// set timer-variable
var timer = null;
//on button-click
$('#btnclick').click (function (e) {
//clear timeout if already applied
if (timer) {
clearTimeout (timer);
timer = null;
}
//set new timeout
timer = setTimeout (function () {
//call wait-function and clear timeout
waitFunction ();
clearTimeout (timer);
timer = null;
}, 1000);
});
function waitFunction () {
console.log ('I want to see this 1 second after the LAST click');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="btnclick">Click Me!</button>
推荐阅读
- php - 如何从 Symfony 4.1 的包中获取自定义配置 yaml 文件?
- sorting - 使用哪种数据结构对数百万条记录进行排序以及使用哪种算法
- css - 表 TD 元素换行中的图层(div)
- javascript - Angular Material 2 Datepicker关闭事件未执行(Angular 4)
- r - 从 R Shiny Datatable 中提取过滤器
- azure - Azure 存储 Java SDK 检查 Blob 是否存在?
- php - Symfony SymfMail - 如何发送电子邮件
- c - 不安全可变指针
转为 UTF8 字符串 - laravel - Clear cache everytime for changes to show
- swift - URLSession dataTask 不运行