• 封装防抖方法


    • 函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间

    函数防抖的要点,是需要一个 setTimeout 来辅助实现,延迟运行需要执行的代码。如果方法多次触发,则把上次记录的延迟执行代码用 clearTimeout 清掉,重新开始计时。若计时期间事件没有被重新触发,等延迟时间计时完毕,则执行目标代码。

     1         // 封装一个防抖方法对业务逻辑函数进行防抖包装并设置防抖时间。
     2         function debounce(fn, delay) {
     3             let i = null
     4             console.log(this);
     5             return function () {
     6                 //用if做个判断以便清除之前触发的事件,保留最后一次事件
     7                 if (i !== null) {
     8                     clearTimeout(i);
     9                 }
    10                 i = setTimeout(() => {
    11                     fn.call(this)  //必须通过call改变this指向input元素,否则绑定的是window
    12                 }, delay);
    13             }
    14         }
    15 
    16         // 输入框的防抖处理
    17         let input = document.querySelector('input')
    18         function f1(){
    19             console.log(this.value);
    20         }
    21         input.oninput = debounce(f1,500)
    • 节流就是每隔n的时间调用一次函数,而不是一触发事件就调用一次,这样就会减少资源浪费

      

     1         let input = document.querySelector('input')
     2         let f1 = function () {
     3             console.log(this.value);
     4         }
     5         input.oninput = throttle(f1, 1000)
     6 
     7         function throttle(fn, delay) {
     8             let flag = true
     9             return function () {
    10                 if (flag) {
    11                     flag = false
    12                     setTimeout(() => {
    13                         fn.call(this)
    14                         flag = true
    15                     }, delay);
    16                 }
    17             }
    18         }
    俩者区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。



  • 相关阅读:
    Java多线程
    2018腾讯校招软件开发岗在线笔试题
    2018京东校招Java笔试题
    计模式之中介者、观察者
    值得注意的Java基础知识
    Java的内部类
    用静态内部类实现单例模式
    String,StringBuilder区别,一个是常量,一个是可变量
    ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象
    List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?
  • 原文地址:https://www.cnblogs.com/zxf906/p/15269383.html
Copyright © 2020-2023  润新知