input绑定keyup or keydown事件发送延时请求

input框输入的时候如果需要异步请求资源做autosuggest功能或者其他情况的话就需要绑定keyup/keydown/keypress事件,在键入的过程中根据用户输入的内容通过异步接口获取对应suggest信息,例如:

<input type="text" id="inputTimerTest" placeholder="inputTimer测试">
<script>
(function($){
    $('inputTimerTest').on('keyup',function(){
        $.get('/path',function(){
            //do something here
        })
    })
})(jQuery)
</script>

但是如果用户量过大,或者键入信息过多由于各种情况(尤其是中文输入法),只要触发一次keyup/keydown/keypress事件就会发送一次请求。对服务器的压力是相当大的,对正在快速键入的用户来说也没有任何体验上的好处。

如何在一定的键入时间内,如果用户正在连续接入就不用再去发送请求,对比了几个实现方案,发现一个简单的思路: 在一连串的键入事件中,只要取消上一次的键入延时程序即可 ,根据这个思路对上面的代码做一下改动:

<input type="text" id="inputTimerTest" placeholder="inputTimer测试">
<script>
(function($){
    var timer,
        delayTime = 300;//可感知的延时,300ms以下最合适

    $('inputTimerTest').on('keyup',function(){

        clearTimeout(timer);//取消上一次的操作延时

        timer = setTimeout(function(){//定义本次键入操作的延时
            $.get('/path',function(){
                //do something here
            })
        },delayTime)

    })
})(jQuery)
</script>

这样只需要去操作延时程序即可实现,思路很简单,实现代码也很容易;唯一的缺憾是产生了一个timer的变量在绑定方法的作用域外,但无关紧要。

这里是DEMO/demo/inputTimer.html