延迟javascript函数执行
我使用的是jQuery(最新版本),有一个名为“calculate()”的函数,每次编辑字段并退出该字段(模糊等)时都会调用该函数。(允许“动态”计算) 计算需要不到4秒的时间才能完成,但如果用户在计算完成之前更改了表单上的另一个元素,则它们将排队,并在当前操作完成后再次调用该函数。 由于我无法在函数启动后停止处理,是否可以将函数延迟几秒钟,然后每次与表单元素交互时,添加到计时器中 我认为这是不可能的,但尽管我愿意试一试 我知道我能做到:延迟javascript函数执行,javascript,jquery,Javascript,Jquery,我使用的是jQuery(最新版本),有一个名为“calculate()”的函数,每次编辑字段并退出该字段(模糊等)时都会调用该函数。(允许“动态”计算) 计算需要不到4秒的时间才能完成,但如果用户在计算完成之前更改了表单上的另一个元素,则它们将排队,并在当前操作完成后再次调用该函数。 由于我无法在函数启动后停止处理,是否可以将函数延迟几秒钟,然后每次与表单元素交互时,添加到计时器中 我认为这是不可能的,但尽管我愿意试一试 我知道我能做到: setTimeout(函数(){…},4000); 但是
setTimeout(函数(){…},4000);
但是我需要一种添加到此计时器的方法(即计时器还剩1秒,我单击一个字段,希望计时器返回到4秒)这可以通过在执行
setTimeout()
之前调用cleartimout()
来处理,以清除任何挂起的操作
// Declare the variable that holds the timeout pointer at a higher scope
var ts;
// in your onblur
// clear any pending pointer
if (ts) window.clearTimeout(ts);
// then reset the timeout and assign its handle to the same variable ts
ts = window.setTimeout(function() {}, 4000);
这可以通过在执行
setTimeout()
之前调用clearTimeout()
来处理,以清除任何挂起的操作
// Declare the variable that holds the timeout pointer at a higher scope
var ts;
// in your onblur
// clear any pending pointer
if (ts) window.clearTimeout(ts);
// then reset the timeout and assign its handle to the same variable ts
ts = window.setTimeout(function() {}, 4000);
您可以记住timeoutID,并在每次启动新计时器时重置旧计时器
var timeoutID = null;
if ( timeoutID !== null ) {
window.clearTimeout( timeoutID );
}
timeoutID = window.setTimeout( function(){
// your code here
}, 4000 );
您可以记住timeoutID,并在每次启动新计时器时重置旧计时器
var timeoutID = null;
if ( timeoutID !== null ) {
window.clearTimeout( timeoutID );
}
timeoutID = window.setTimeout( function(){
// your code here
}, 4000 );
我会这样做:
var isCalculating = false;
var calculateQueue = false;
function calculate(){
isCalculating = true;
// do calculations
isCalculating = false;
if(calculateQueue){
calculate();
}
}
$('element').blur(function(){
if(!isCalculating){
calculate();
}
else{
calculateQueue = true;
}
});
这样,您就不会同时运行calculate()
函数。不需要无限的计时器,如果有计算“排队”,那么它们将在第一个计算函数停止后进行计算……而不是每次等待4次。当您更改计算函数时会发生什么情况,并且需要更长的时间
希望这能有所帮助。我会这样做:
var isCalculating = false;
var calculateQueue = false;
function calculate(){
isCalculating = true;
// do calculations
isCalculating = false;
if(calculateQueue){
calculate();
}
}
$('element').blur(function(){
if(!isCalculating){
calculate();
}
else{
calculateQueue = true;
}
});
这样,您就不会同时运行calculate()
函数。不需要无限的计时器,如果有计算“排队”,那么它们将在第一个计算函数停止后进行计算……而不是每次等待4次。当您更改计算函数时会发生什么情况,并且需要更长的时间
希望这有帮助。您的问题不是添加计时器,而是清除上一个计时器 你可以这样做:
var delay = (function() {
var time_id;
return function(callback, ms) {
if (time_id) {
window.clearTimeout(time_id);
}
time_id = window.setTimeout(callback, ms);
};
}());
// use it like
delay(function(){...}, 4000);
您的问题不是添加到计时器,而是清除上一个计时器 你可以这样做:
var delay = (function() {
var time_id;
return function(callback, ms) {
if (time_id) {
window.clearTimeout(time_id);
}
time_id = window.setTimeout(callback, ms);
};
}());
// use it like
delay(function(){...}, 4000);
正如其他人所提到的,
clearTimeout
是处理这个问题的方法。我给出了一个非常基本的例子来说明它是如何工作的。在函数运行之前,单击按钮将取消并重新启动计时器,但这个事件很容易绑定到另一个事件(如字段上的焦点或模糊,就像您将要做的那样)
正如其他人所提到的,
clearTimeout
是处理此问题的方法。我提供了一个非常基本的示例,说明了此方法的工作原理。在函数运行之前,单击按钮将取消并重新启动计时器,但此事件可能很容易绑定到另一个事件(像场上的焦点或模糊,就像你要做的那样)
问题出在哪里?你的意思是什么?但我需要一种方法来添加到此计时器。在计算过程中,用户如何执行任何操作?这没有任何意义。除非计算是指ajax请求或其他。是的,我正在使用ajax调用MVC中的函数。该工具尝试请求提供输入在客户端是有效的。#有什么问题吗?你的意思是什么?但是我需要一种方法来添加到这个计时器。当计算发生时,用户怎么能做任何事情?这没有任何意义。除非计算是指ajax请求或什么。是的,我使用ajax在MVC中调用函数。该工具试图请求计算,前提是输入在客户端有效#