防抖(debounce)
一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该时间(也就是触发过快),则不会触发事件。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。
function debounce(fn,timeout){
let timer = null
return function(){
clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(window,arguments)
}, timeout);
}
}
节流(throttle)
一句话概括:节流是给定一个时间周期,然后对频率大的触发进行削峰,如果触发事件的周期大于该事件(也就是触发过快),则会将触发事件的周期限定在给定的周期内,如果小于则按照正常的时间触发。
举个例子:我给定的时间周期是1s,如果我在触发第一次事件后连续0.5s内触发该事件,那触发周期会变成每间隔1s执行事件。
function throttle(fn,timeout){
let flag = true
return function(){
if(flag){
setTimeout(() => {
fn.apply(this,arguments)
flag = true
}, timeout);
}
flag = false
}
}
其他应用场景举例
讲完了这两个技巧,下面介绍一下平时开发中常遇到的场景:文章来源:https://www.toymoban.com/news/detail-422317.html
- 搜索框input事件,例如要支持输入实时搜索可以使用节流方案(间隔一段时间就必须查询相关内容),或者实现输入间隔大于某个值(如500ms),就当做用户输入完成,然后开始搜索,具体使用哪种方案要看业务需求。
- 页面resize事件,常见于需要做页面适配的时候。需要根据最终呈现的页面情况进行dom渲染(这种情形一般是使用防抖,因为只需要判断最后一次的变化情况)
第三方实现
如果自己不愿意封装,可以用第三方实现,比如lodash库文章来源地址https://www.toymoban.com/news/detail-422317.html
到了这里,关于js实现防抖(debounce)与节流(throttle)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!