zoukankan      html  css  js  c++  java
  • 封装防抖方法

    • 函数防抖(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 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。



  • 相关阅读:
    SimpleDateFormat解析的时区问题
    linux之cp/scp命令+scp命令详解
    java.net.SocketException: java.security.NoSuchAlgorithmException
    Gradle使用手册(一):为什么要用Gradle?
    js_实用
    exp.validate.js
    MySQL实用技巧
    MongoDB 用户配置
    js 图片处理 Jcrop.js API
    MySQL连接池
  • 原文地址:https://www.cnblogs.com/zxf906/p/15269383.html
Copyright © 2011-2022 走看看