美文网首页
防抖函数

防抖函数

作者: js好难学啊 | 来源:发表于2018-12-20 12:13 被阅读0次

    防抖(debounce)

    场景

    假设有一个搜索输入框,当内容变更的时候会从后台取回一些数据,并提示用户类似的数据。比如用户输入英雄,会出现英雄联盟,英雄无敌 ...之类的提示。
    如果监听Blur事件获取数据,那用户体验就跟没有一样。如果监听keyup, keydown事件,请求次数过于频繁,增加了服务器的压力,并且如果服务器响应慢的话,体验也不好。那就用防抖吧。

    实现防抖函数

    场景中,假设用户在这1s中没有输入新的数据,我们便向服务器发起请求。
    防抖函数可以通过闭包 + 定时器实现。

    function debounce(func, wait) {
      let timeout = null
    
      return function() {
        clearTimeout(timeout)
        timeout = setTimeout(function() {
          func()
        }, wait)
      }
    }
    

    调用的话可以直接

    function getData() { 
      ... // ajax
    }
    
    documentElement.addEventListener('keyup', debounce(getData, 1000))
    

    这样就很好的解决了场景1中的问题。
    此时的debounce函数并不是特别的完整。还需要解决两个问题this事件对象的问题。

    1. 在实际的应用场景中,大多数情况都会使用事件的第一个参数e获取input的值,在闭包返回的匿名函数中拥有这个参数,但是函数是在定时器的匿名函数中执行的,所以并不具有这个参数。
    2. 如果不使用debounce函数直接绑定getData为点击事件,在getData中使用console.log(this)打印出来的值是这个dom对象。所以使用了防抖函数以后也要修正这个问题。
    function debounce(func, wait) {
      let timeout = null
    
      return function() {
        clearTimeout(timeout)
        timeout = setTimeout(() => {
          func.apply(this, arguments)
        }, wait)
      }
    }
    

    这样就完成了一个最基本的防抖函数!

    相关文章

      网友评论

          本文标题:防抖函数

          本文链接:https://www.haomeiwen.com/subject/iwzdkqtx.html