2010-12-06 49 views
16

我正在为一个网站的自动搜索功能。jquery运行代码最后一次按键后2秒

它使用ajax来查询api。

在输入3个字符后,它会搜索每个按键。

我想要的是

情况1:
用户输入TES
2秒通过 搜索执行


情况2:
用户输入TES
1秒通
用户按t
2秒传递是在测试

CASE3进行
搜索:

用户输入TES
1秒传递
用户按下吨
1.5秒传递
用户按下我
1.5秒通过
用户按n
1.5秒通过
用户按下克
2秒通过
搜索在测试中表现

,从而可以看到, 搜索动作时出现了两个无按键(或糊剂ECT)时,才执行按下按键后的秒数。

我的基本想法是。

on keydown 调用设置超时的函数, 该函数还设置包含文本框中最后一项的变量。 当超时到期时,它检查框中的值以查看它是否与变量中的值匹配。

如果他们匹配,那么一直没有变化。 搜索也是如此

如果他们不做任何事情,因为从后面的按键的超时将作出相同的检查。

这是唯一/最好的方法吗?

回答

38

Remy Sharp下面的函数就可以了:

function throttle(f, delay){ 
    var timer = null; 
    return function(){ 
     var context = this, args = arguments; 
     clearTimeout(timer); 
     timer = window.setTimeout(function(){ 
      f.apply(context, args); 
     }, 
     delay || 500); 
    }; 
} 

在前面的代码,f是函数您想要调节,delay是最后一次调用后等待的毫秒数(默认为500,如果省略)。 throttle返回一个包装函数,该函数将清除先前调用中的任何现有超时,然后将delay毫秒的超时设置为f。对返回函数arguments的引用用于调用f,确保f接收它所期望的参数。

$('#search').keyup(throttle(function(){ 
    // do the search if criteria is met 
})); 
+0

护理解释它是如何工作:

您应按如下方式使用它呢? f,适用? – Hailwood 2010-12-06 21:25:37

9

除了计时器几乎相同的设置为仅当条件满足:

<input id="search" type="text" /> 
<script> 
    var timer, value; 
    $('#search').bind('keyup', function() { 
     clearTimeout(timer); 
     var str = $(this).val(); 
     if (str.length > 2 && value != str) { 
      timer = setTimeout(function() { 
       value = str; 
       console.log('Perform search for: ', value); 
      }, 2000); 
     } 
    }); 
</script> 
相关问题