Open serendipityApe opened 2 years ago
题目 implement debounce() with leading & trailing option 基于上一个问题防抖 例子 一个input输入框,一直触发其输入事件。(下文---代表一直触发输入事件) 当{leading: true,trailing: true} //开始输入(执行func)---- 停止输入(wait后执行func) 开始输入(执行func)----停止输入(wait后执行func) 当{leading: false,trailing: true} //开始输入---- 停止输入(wait后执行func) 开始输入----停止输入(wait后执行func) 当{leading: true,trailing: false} //开始输入(执行func)---- 停止输入 开始输入(执行func)----停止输入 当{leading: false,trailing: false} //开始输入---- 停止输入 开始输入----停止输入 ps:当{leading: true,trailing: true} ,且只输入一个字符,结果为 //开始输入(执行func) 而不是 //开始输入(执行func)(wait后执行func) 答案 //以输入事件为例 //规定 一个轮询为:在wait间隔内一直触发输入 即:开始输入---- 停止输入 (快速输入一个字符串) //规定 输入事件 为:输入一个字符触发的事件 即 开始输入---- 停止输入中的- (输入单个字符) function debounce(func,wait,option ={leading:false,trailing:true}){ let timer=null; return function(){ let isInvoked=false; //没有定时器(本次轮询开始)且leading为true if(timer == null && option.leading){ func.apply(this,arguments); isInvoked=true; } clearTimeout(timer); timer=setTimeout(() => { //本次输入事件开始时未执行过func且trailing为true if(option.trailing && !isInvoked){ func.apply(this,arguments); } timer=null; }, wait); } }
题目 implement debounce() with leading & trailing option 基于上一个问题防抖
例子
一个input输入框,一直触发其输入事件。(下文---代表一直触发输入事件) 当{leading: true,trailing: true} //开始输入(执行func)---- 停止输入(wait后执行func) 开始输入(执行func)----停止输入(wait后执行func) 当{leading: false,trailing: true} //开始输入---- 停止输入(wait后执行func) 开始输入----停止输入(wait后执行func) 当{leading: true,trailing: false} //开始输入(执行func)---- 停止输入 开始输入(执行func)----停止输入 当{leading: false,trailing: false} //开始输入---- 停止输入 开始输入----停止输入 ps:当{leading: true,trailing: true} ,且只输入一个字符,结果为 //开始输入(执行func) 而不是 //开始输入(执行func)(wait后执行func)
答案
//以输入事件为例 //规定 一个轮询为:在wait间隔内一直触发输入 即:开始输入---- 停止输入 (快速输入一个字符串) //规定 输入事件 为:输入一个字符触发的事件 即 开始输入---- 停止输入中的- (输入单个字符) function debounce(func,wait,option ={leading:false,trailing:true}){ let timer=null; return function(){ let isInvoked=false; //没有定时器(本次轮询开始)且leading为true if(timer == null && option.leading){ func.apply(this,arguments); isInvoked=true; } clearTimeout(timer); timer=setTimeout(() => { //本次输入事件开始时未执行过func且trailing为true if(option.trailing && !isInvoked){ func.apply(this,arguments); } timer=null; }, wait); } }