防抖可以利用插件解决lodashi
防抖是什么:防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调函数,如果在这n秒事件又被触发则重新计时。类比:英雄回城
防抖的实际应用:输入框防抖
Var timer = null //1、防止抖动的timer
Function debounceSearch(keywords) { //2、定义防抖函数
timer = setTimerout(function(){ getSuggestList(keywords) },500)//发请求
}
$(‘#ipt’).on(‘keyup’,function(){// 3、 在触发keyup事件的时候,立即清空timer,重新开启执行防抖函数
clearTimeout(timer)
debounceSearch(keywords)
} )
什么是节流:节流策略(throttle),顾名思义,就是减少一段时间内事件的触发频率。类比:射击游戏,不能说你按住发射键就一直发射子弹,会有一个间隙,在这个间隙之间触发射击键是没有用的
节流的应用场景:1、鼠标连续不断地触发某事件(如点击),只在单位时间内触发一次。2、懒加载的时候要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算频率,不浪费cpu资源
节流需要借助节流阀实现:节流阀概念=>高铁卫生间 红绿灯控制,红灯有人,绿灯没人。
节流阀为空可以进行下一次的操作,不为空就不能执行下一步的操作。当前的操作完成,必须必须将节流阀重置为空,表示可以执行下一次操作了,每次执行前必须先判断节流阀是否为空。
对延迟函数进行理解:是16毫秒之后开始执行函数体里面的内容,函数体内部其实也有先后顺序。
timer在事件触发到事件16毫秒执行都是真(true)值。 定时器是同步的内部是异步的,定时器只要一开timer就是真值。
扩展:定时器不会自己关闭,需要手动清除
区别:
防抖:事件被频繁触发,防抖可以保证最后一次的触发生效,前面的n多次触发会忽略
节流:事件被频繁触发,节流可以减少事件的触发的频率,有选择的执行一部分事件。