如何限制jQuery事件的回调?

好吧,所以我在google中搜索,你在输入中键入文本,它会立即为你提供条目。 但我不喜欢那样。 我使用类似$("TEXTINPUT").keyup(function() {东西$("TEXTINPUT").keyup(function() { 。当用户输入非常快时,它连接数据库很多次。是否可能,只有当用户停止输入时我们才会连接到PHP文件1-2秒,但不是立即?我需要在jQuery中这样做。谢谢。

试试:

 var time_out; $("TEXTINPUT").keyup(function(){ clearTimeout(time_out); time_out = setTimeout(your_function, 500); } function your_function() { /*CHECK DATABASE*/ } 

如果您使用Underscore库,它就像这样简单:

$("TEXTINPUT").keyup(_.throttle(function () {...}, 150));

来自Underscore网站的文档:

油门 _.throttle(function,等待)

返回函数的限制版本,当重复调用时,每隔等待毫秒最多只调用一次包装函数。 对于速度限制事件非常有用,这些事件发生得比您能跟上的速度要快。

还有debouncefunction:

去抖 _.debounce(function,等待)

调用去抖动函数将推迟执行,直到自上次调用函数后经过等待毫秒数。 用于实现仅在输入停止到达后才会发生的行为。 例如:渲染Markdown注释的预览,在窗口停止resize后重新计算布局…

这个函数有点像underscore.js,但没有额外的依赖。 它还会将调用的作用域和参数传递给包装函数。 与YoannM的答案不同,这会返回一个不使用外部变量的自包含回调(EG,可以根据需要多次使用)。

 function throttle (func, wait) { return function() { var that = this, args = [].slice(arguments); clearTimeout(func._throttleTimeout); func._throttleTimeout = setTimeout(function() { func.apply(that, args); }, wait); }; } 

并且用法几乎与underscore.js库的用法相同。

 $('input').on('input keyup', throttle(function() { // ... }, 100)); 

这是我通常接近它的方式:

 $(function(){ var tiTO, jqXHR; $('textinput').keyup(function(){ if (tiTO) clearTimeout(tiTO); if (jqXHR && jqXHR.abort) jqXHR.abort(); tiTO = setTimeout(function(){ jqXHR = $.ajax({....}); //Ajax call to PHP },2000); }); }); 

每个keyup重置超时,并中止任何活动的ajax。