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