这里是一些jQuery的搜索框,我预计实际上是一个反模式,并且肯定有一个更好的解决方案,我想指向:
我将在评论中描述它,然后只是给代码,因为注释可能比代码更清晰和简单:
> //在keypress上设置函数调用。
> //函数调用在主事件发生之前有延迟。
> //当调用keypress函数时,擦除任何以前排队的事件,并以标准延迟率创建一个新的事件。
> //使用全局来存储setTimeout指针。
> // clearTimeout任何预先存在的指针。
> //开始新的延迟。
代码:
// set up a filter function call on keypress. $('#supplier-select-filter').keypress(function (){ // Currently,resets a delay on an eventual filtering action every keypress. filterSuppliers(.3,this); }); // Delayed filter that kills all prevIoUs filter request. function filterSuppliers(delay,inputBox){ if(undefined != typeof(document.global_filter_trigger)){ clearTimeout(document.global_filter_trigger); // clearTimeout any pre-existing pointers. } // Use a global to store the setTimeout pointer. document.global_filter_trigger = setTimeout(function (){ var mask = $(inputBox).val(); $('#user_id').load("supplier.PHP?action=ajax_getsuppliers_html&mask="+escape(mask)); },1000*delay); // Finally,after delay is reached,display the filter results. }
问题:
在搜索字词平均可能由10个字符组成的输入框中,10秒钟内调用setTimeout,似乎是处理器很重,在我的测试中会导致一些明显的性能问题,所以希望有一个更干净替代?
.load()比接收JSON然后从json生成html更简单,但也许有一个更好的工具?
.keypress()似乎并不总是触发像退格删除和其他必要的东西,所以也许使用keypress()这个输入框不是理想的?
解决方法
我经常使用以下方法,一个简单的函数来执行一个回调,在用户停止输入指定的时间后::
$(selector).keyup(function () { typewatch(function () { // executed only 500 ms after the last keyup event. },500); });
实施:
var typewatch = (function(){ var timer = 0; return function(callback,ms){ clearTimeout (timer); timer = setTimeout(callback,ms); }; })();
对于更复杂的用法,请看看jQuery TypeWatch Plugin。