防抖与节流的简单实现

253 阅读1分钟

为了解决在开发中一些频繁的事件触发,例如:window.onscroll,window.onresize,mousedown,mousemove,keyup,keydowm等等高频触发的事件 因为 有两种解决方案 :

1. 防抖函数

防抖的原理解析:防抖函数一定等你触发完事件而且在n秒类不再触发才会执行函数。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	 <div>
	 	 <p>加入了防抖的input</p>
	 	  <input type="text" id='input'/>
	 </div>	
    <script type="text/javascript">
           //防抖函数
           //fn 是需要防抖处理的函数
           //delay 是延时时间
            function debounce (fn, delay) {
                //通过实现闭包缓存一个定时器id,即代码定义的timer
            	let timer=null;
                return (...args) => {
                   //如果已经定义过setTimeout函数的话就清除当前setTimeout
                   timer&&window.clearTimeout(timer)
                    timer = setTimeout(() => {
                        fn.call(this, ...args)
                    }, delay)
                }
            }
            function ajax (e,d) {
               console.log(`${new Date().toLocaleTimeString()}--${e.target.value}--${d}`)
            }

            const debounceAjax = debounce(ajax, 500)
            
            document.querySelector('#input').addEventListener('keyup', e => {
                debounceAjax(e,'pp')
            })
    </script>     
</body>
</html>

2. 节流函数

原理 : 如果你持续触发事件,每隔一段时间,只执行一次事件。当触发事件的时候,我们取出当前的时间戳,然后减去之前的时间戳,如果大于设置的时间周期,就执行函数,然后更新时间戳为当前的时间戳,如果小于,就不执行。

  var throttle = function(func, delay=300){
        var prev = Date.now();
        return function(){
            var now = Date.now();
            if(now-prev>=delay){
                func.apply(this,arguments);
                prev = Date.now();
            }
        }
    }
    window.onscroll=throttle(function(){
        console.log(1)
    })