防抖和节流

防抖

为什么要防抖

有些操作是高频触发的,但其实触发一次就好了,就比如我们短时间内多次缩放页面,那么我们不应该每次缩放都去执行操作,应该只做一次就好。再比如监听输入框输入,不应该每次都去触发监听,应该是用户完成一段输入后,再进行触发。 总结:等用户高频事件完了,再进行事件操作

如何实现防抖

事件触发--开启一个定时器--如果再次触发,则清除上一次的定时器,重新开一个--定时到,触发操作

function debounce(fn, delay) {
  let timer = null
  return function () {
    clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, arguments)
    }, delay)
  }
}

var inputdom = document.getElementById('inputid')
inputdom.oninput = debounce(function (event) {
  console.log(event.target.value)
}, 500)

节流

为什么要做节流

防抖存在一个问题,事件会一直等到用户完成操作后一段时间再触发。如果一直操作,会一直不触发。如果这是一个按钮,点击就发送请求。如果一直点,那么请求就会一直不发出去。这里的正确思路应该是第一次点击就发送,然后上一个请求回来后,才能再次发送 总结:某个操作希望上一次的完成再进行下一次,或者说希望隔一定时间触发一次。

如何实现节流

事件触发--操作执行--关闭阀门--阀门关闭,后续触发无效--一定时间后,阀门打开--操作可再次触发

var inputdom = document.getElementById('inputid')
function throttle(fn, delay) {
  let valid = true
  return function () {
    if (valid) {
      setTimeout(() => {
        fn.apply(this, arguments)
        valid = true
      }, delay)
      valid = false
    } else {
      return false
    }
  }
}
inputdom.oninput = throttle(function (event) {
  console.log(event.target.value)
}, 200)

总结

防抖和节流相同点

防抖和节流都是为了阻止用户操作高频触发事件,从而浪费性能。

防抖和节流的区别

防抖是让你多次触发,只生效最后一次。适用于我们只需要一次触发生效的场景。 节流是让你的操作,每隔一段时间才能触发一次。适用于我们多次触发要多次生效的场景。