1: 防抖 (多次触发 只执行最后一次) 防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。
作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间。
2: 防抖的应用场景:
2.1 :登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖; 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖; 文本编辑器实时保存,当无任何更改操作一秒后进行保存。
2.2:搜索框搜索信息 1.不是每输入一个字就立马搜索词条,而是会登一段时间,如果这段时间用户,有输入了,证明用户只想搜这个,直接搜。 2.如果这段时间用户又输入了,那证明用户还没有输完,在等一段时间,看用户最终实际想搜索什么。
3:函数防抖的实现:
var timer = null;
return function() {
var context = this,
args = [...arguments];
// 如果此时存在定时器的话,则取消之前的定时器重新记时
if (timer) {
clearTimeout(timer);
timer = null;
}
// 设置定时器,使事件间隔指定事件后执行
timer = setTimeout(() => {
fn.apply(context, args);
}, wait);
};
}
4: 节流 (规定时间内 只触发一次)
4.1:节流策略(throttle),控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。 作用: 高频率触发的事件,在指定的单位时间内,只响应第一次。
4.:2: 节流的应用场景 鼠标连续不断地触发某事件(如点击),单位时间内只触发一次; 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。例如:懒加载; 浏览器播放事件等。
4.3:函数节流的实现:
function throttle(fn, delay) {
var preTime = Date.now();
return function() {
var context = this,
args = [...arguments],
nowTime = Date.now();
// 如果两次时间间隔超过了指定时间,则执行函数。
if (nowTime - preTime >= delay) {
preTime = Date.now();
return fn.apply(context, args);
}
};
}
// 定时器版
function throttle (fun, wait){
let timeout = null
return function(){
let context = this
let args = [...arguments]
if(!timeout){
timeout = setTimeout(() => {
fun.apply(context, args)
timeout = null
}, wait)
}
}
}