防抖和节流

66 阅读1分钟

一、防抖

有的操作是高频触发的,但是其实触发一次就好了

  • 输入框监听用户输入的内容
  • window调整resize大小
<input type="text" />
<script>
// 防抖函数
function debounce(fn, delay) {
    let timer = null
    return function() {
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(this, arguments)
        }, delay)
    }
}

// 使用防抖函数
const input = document.querySelector('input')
input.onkeydown = debounce((event) => {
    console.log(event);
    console.log(input.value);
}, 500) 
    </script>
    

总结: 防抖是在高频触发的条件下, 只会生效最后一次, 适用于只需要触发一次的场景

一、节流

防抖存在一个问题,事件会一直等到用户完成操作一段时间后再操作。如果一直操作,就一直不会触发。如果是一个按钮发送请求,一直点击,那么就一直不会触发。

  • 滑道底部自动加载更多
  • 也可用于输入框中
<input type="text" />
<script>
// 节流函数
function throttle(fn, delay) {
    let valid = true
    return function() {
        if(valid) {
            setTimeout(() => {
                fn.apply(this, arguments)
                valid = true
            }, delay);
            valid = false
        } else {
            return false
        }
    }
}
// 使用节流函数
const input = document.querySelector('input')
input.oninput = throttle(function(event) {
    console.log(event.target.value);
}, 500)
</script>
    

总结: 节流是在高频触发的条件下, 间隔时间内只会触发一次,适用于间隔固定时间触发