等待function直到用户停止输入

我有用户在打字时进行ajax调用。 问题是它会对每个字母进行调用,所以我设置了这样的超时:

$(input).live('keyup', function(e){ setTimeout(function(){ var xx = $(input).val(); doSearch(xx); }, 400); }); 

它确实等待400ms,然后为每个keyup执行。 如何在最后输入的字母后约400ms时更改此选项才能使ajax调用“一次”?

(我过去使用’延迟’,但这对我的脚本根本不起作用……)

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

最好将你的函数移动到一个命名函数并多次调用它,因为否则你会在每个keyup上创建另一个lambda函数,这是不必要的并且相对昂贵

每次按下新键时,您需要重置计时器,例如

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

函数表达式用于确保timer变量的作用域仅限于需要它的那两个函数。

我认为你可以在这种情况下再次使用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(); }); } }); 

我发现以下更容易实现:

 $(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); }); 

通过存储当前字符串,您可以看到用户已停止输入。 然后,您可以安全地调用您的函数来执行处理需要发生的事情。