事件防抖
问题引入
在输入框输入内容后间隔1000ms之后再请求callback
问题解决
-
直接绑定
下面这段代码,每次输入一个字母就会触发callback,显然性能是比较差的~从配图也能看出来,每次输入都会打印输入框的内容。
<!DOCTYPE html> <html> <head> <title>事件节流和事件防抖</title> <meta charset="utf-8"> </head> <body> <input type="text" id="ipt"> </body> <script> function callback(e){ console.log(new Date() , e.target.value); } let ipt = document.querySelector('input'); ipt.addEventListener('input' , callback); </script> </html>
-
改进后的方法
改进后的方法,只在输入完之后才调用了callback,在配图中,我在输入完"zhe’ci"之后故意停顿了几秒,在接着输入下文的,所以控制台打印了两次。
<!DOCTYPE html> <html> <head> <title>事件节流和事件防抖</title> <meta charset="utf-8"> </head> <body> <input type="text" id="ipt"> </body> <script> function debounce (fn , delay = 1000) { let preTimeStamp = new Date().getTime(); let currentTimeStamp = preTimeStamp; let content = null; let arg = null; let sto = null; let run = () => { preTimeStamp = new Date().getTime(); sto = setTimeout(()=>{ fn.apply(content , arg); } , delay); } let clear = () => { clearTimeout(sto); run(); } return function(){ currentTimeStamp = new Date().getTime(); content = this; arg = arguments; currentTimeStamp - delay > preTimeStamp ? run() : clear(); } } function callback(e){ console.log(new Date() , e.target.value); } let ipt = document.querySelector('input'); ipt.addEventListener('input' , debounce(callback)); </script> </html>
总结
-
事件防抖中,输入框在短时间内输入了大量的内容,只有在最后输入停止时才触发了callback,提高了性能
function debounce (fn , delay = 1000) { let preTimeStamp = new Date().getTime(); let currentTimeStamp = preTimeStamp; let content = null; let arg = null; let sto = null; let run = () => { preTimeStamp = new Date().getTime(); sto = setTimeout(()=>{ fn.apply(content , arg); } , delay); } let clear = () => { clearTimeout(sto); run(); } return function(){ currentTimeStamp = new Date().getTime(); content = this; arg = arguments; currentTimeStamp - delay > preTimeStamp ? run() : clear(); } }