2012-04-12 57 views
9

我有用户在输入时进行ajax调用。问题是,它使呼吁每一个正在键入字母,所以我设置超时这样的:等待功能,直到用户停止输入

$(input).live('keyup', function(e){ 

setTimeout(function(){ 

var xx = $(input).val(); 
doSearch(xx); 

}, 400); 

}); 

它等待400毫秒,但然后执行每一个KEYUP。我怎样才能改变这种做法,使最后输入的字母后大约400毫秒只发一次'ajax'?

(我用“延迟”在过去,但这并不在所有与我的脚本工作...)你需要每一个新的按键时,如复位定时器

+0

已经有其他问题提供的解决方案:https://stackoverflow.com/questions/4220126/run-javascript-function-when-user-finishes-typing-instead-of-on-key-up/16324620 #16324620 – 2016-06-21 07:01:30

回答

18
timer = 0; 
function mySearch(){ 
    var xx = $(input).val(); 
    doSearch(xx); 
} 
$(input).live('keyup', function(e){ 
    if (timer) { 
     clearTimeout(timer); 
    } 
    timer = setTimeout(mySearch, 400); 
}); 

最好是你的功能转移到一个名为函数并调用它多次,“导致否则你要创建的是不必要的,

+0

这就像一个魅力:) – Youss 2012-04-12 13:12:13

+0

@Youss和如果你按下并释放一个键,然后再按住另一个键会发生什么? – Alnitak 2012-04-12 13:19:18

+0

@Alnitak,你是对的,还有其他问题,例如当你输入太慢(两个键之间超过400ms),但在正常情况下,它使事情变得更加平滑 – Gavriel 2012-04-12 13:21:38

4

(function() { 
    var timer = null; 

    $(input).live('keyup', function(e) { 
     timer = setTimeout(..., 400); 
    }); 

    $(input).live('keydown', function(e) { 
     clearTimeout(timer); 
    }); 
)(); 

函数表达式用于确保timer变量的范围被限制到需要它的这两个功能。

+0

应该使用'.on('keyup',...)'由于jquery 1.7'.live'已被弃用。 – ZombieCode 2014-09-03 17:44:02

+0

@Ekaterina是的,它可能应该,但这是对OP代码的最小修改。 – Alnitak 2014-09-03 19:37:22

0

我认为,相对昂贵的每个KEYUP另一个lambda函数你可能使用delay()再次在这种情况下,只要你没事为混合添加一个新的临时“东西”。这对你有用吗?

$(input).live('keyup', function(e) { 
    if (!$(input).hasClass("outRunningAJob")) { 
     var xx = $(input).val(); 
     $(input).addClass("outRunningAJob"); 
     doSearch(xx); 
     $(input).delay(400).queue(function() { 
      $(this).removeClass("outRunningAJob"); 
      $(this).dequeue(); 
     }); 
    } 
}); 
+0

似乎是一种解决方法...... @Flöcsy提供的答案更直接。 ps什么是outRunningAJob :) – Youss 2012-04-12 13:17:04

+0

我个人还没有对'timeout'功能感到满意,所以我想也许你是在类似的地方,因为你在问它。这是一种解决方法吗?这是我目前如何解决这个问题。如果你现在更熟悉使用'延迟',那么这可能是更好的解决方案(在可维护性方面)。 'outRunningAJob'只是随心所欲的自我记录。很开心你喜欢 :-) – veeTrain 2012-04-12 13:36:21

0

我发现下面的更容易实现:

$(input).on('keyup', function() { 
    delay(function() { 
     if (input).val() !== '' && $(input).val() !== $(input).attr('searchString')) { 
      // make the AJAX call at this time 
      // Store the value sent so we can compare when JSON returns 
      $(input).attr('searchString', $(input).val()); 

      namepicker2_Search_Prep(input); 
     } 
    }, 500); 
}); 

通过存储当前字符串你能看到用户已停止打字。然后你可以安全地调用你的函数来做需要处理的事情。