如何限制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,等待)
返回函数的限制版本,当重复调用时,每隔等待毫秒最多只调用一次包装函数。 对于速度限制事件非常有用,这些事件发生得比您能跟上的速度要快。
还有debounce
function:
去抖 _.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。