惯用的jQuery延迟事件(只有在键入短暂停顿后)? (aka timewatch/typewatch/keywatch)

前端之家收集整理的这篇文章主要介绍了惯用的jQuery延迟事件(只有在键入短暂停顿后)? (aka timewatch/typewatch/keywatch)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这里是一些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

原文链接:/jquery/184692.html

猜你在找的jQuery相关文章