节流防抖的使用_监听滚动节流

节流防抖的使用_监听滚动节流节流防抖的使用

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

什么是防抖

当事件被触发后,延迟几秒后再执行回调,如果在这几秒内事件又被触发,则重新计时。如:游戏中的回城机制,中途打断后必须要重新回城,重新读条。

应用场景

用户在输入框中连续输入一串字符时,可以通过防抖策略,只有在输入完后,才执行查询的请求,这样可以有效减少次数,节约请求资源。
例如:实现输入框的防抖

//模拟ajax请求
function ajax(content) { 
   
  console.log('ajax request ' + content);
}

let inputa = document.getElementById('unDebounce');

inputa.addEventListener('keyup', function (e) { 
   
    ajax(e.target.value);
})

Jetbrains全家桶1年46,售后保障稳定

只要按下键盘,就会触发ajax请求。从资源上来说是很浪费的行为,实际应用中,用户是输出完整的字符后才会请求。可以进行优化:

function ajax(content) { 
   
  console.log('ajax request ' + content);
}

function debounce(fun, delay) { 
   
    return function (args) { 
   
        let that = this;
        let _args = args;
        clearTimeout(fun.id);
        fun.id = setTimeout(function () { 
   
            fun.call(that, _args);
        }, delay)
    }
}
    
let inputb = document.getElementById('debounce')

let debounceAjax = debounce(ajax, 500)

inputb.addEventListener('keyup', function (e) { 
   
        debounceAjax(e.target.value)
    })

加入了防抖后,在频繁的输入时不会发送请求,只有当在指定间隔内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。

防抖代码

let timer; // 维护同一个timer
function debounce(fn, delay) { 
   
    clearTimeout(timer);
    timer = setTimeout(function(){ 
   
        fn();
    }, delay);
}
// 用onmousemove测试一下防抖函数:
function testDebounce() { 
   
    console.log('test');
}
document.onmousemove = () => { 
   
    debounce(testDebounce, 1000);
}
----------------------------------------------
简化后代码:
function debounce(fn, delay) { 
   
    let timer; // 维护一个 timer
    return function () { 
   
        // let _this = this; // 取debounce执行作用域的this
        let args = arguments;
        if (timer) { 
   
            clearTimeout(timer);
        }
        // timer = setTimeout(function () { 
   
        // fn.apply(_this, args); // 用apply指向调用debounce的对象,相当于_this.fn(args);
        // }, delay);
        timer = setTimeout(()=> { 
   
            fn.apply(this, args); // 用apply指向调用debounce的对象,相当于this.fn(args);
        }, delay);
    };
}


// test
function testDebounce(e, content) { 
   
    console.log(e, content);
}
var testDebounceFn = debounce(testDebounce, 1000); // 防抖函数
document.onmousemove = function (e) { 
   
    testDebounceFn(e, 'debounce'); // 给防抖函数传参
}

什么是节流

即每隔一段时间,只执行一次函数。如游戏中的点击鼠标发射子弹,连续不断点按鼠标,并不会发射更多的子弹,而是按照一定的数量连续发射。

应用场景

1 滚动加载,加载更多或滚到底部监听
2 谷歌搜索框,搜索联想功能
3 高频点击提交,表单重复提交

函数防抖与节流的比较

都可以通过使用 setTimeout 实现。目的都是降低回调执行频率,节省计算资源。

节流代码

function throttle(fn, delay) { 
   
    let timer;
    return function () { 
   
        let _this = this;
        let args = arguments;
        if (timer) { 
   
            return;
        }
        timer = setTimeout(function () { 
   
            fn.apply(_this, args);
            timer = null; // 在delay后执行完fn之后清空timer,此时timer为假,throttle触发可以进入计时器
        }, delay)
    }
}


//test
function testThrottle(e, content) { 
   
    console.log(e, content);
}
let testThrottleFn = throttle(testThrottle, 1000); // 节流函数
document.onmousemove = function (e) { 
   
    testThrottleFn(e, 'throttle'); // 给节流函数传参
}
/** * 触发完事件 n 秒内不再触发事件,n秒后再执行 * 只执行最后一次点击 * @param event * @param time * @param flag 是否立即执行 * @returns {Function} * @constructor */
export function debounce(event, time, flag) { 
   
  const interval = time || 500
  let timer = null
  // 默认立即执行
  const f = flag || true
  return function(...args) { 
   
    clearTimeout(timer)
    if (f && !timer) { 
   
      event.apply(this, args)
    }
    timer = setTimeout(() => { 
   
      event.apply(this, args)
    }, interval)
  }
}

/** * 只在单位时间内执行一次 * 第一次事件不会触发,最后一次一定触发 * @param event * @param time * @returns {Function} * @constructor */
export function throttle(event, time) { 
   
  const interval = time || 500
  let timer = null
  return function(...args) { 
   
    if (!timer) { 
   
      timer = setTimeout(() => { 
   
        timer = null
        event.apply(this, args)
      }, interval)
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210153.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月26日 下午10:01
下一篇 2025年7月26日 下午10:43


相关推荐

  • python和java哪个值得学-Python和Java学哪个好?大家是怎么选的

    python和java哪个值得学-Python和Java学哪个好?大家是怎么选的Python和Java学哪个好?很多开始学习编程的同学就很难选择,过去几年选择Java无话可说,近年来大家都开始关注人工智能这一方向,都觉得人工智能是未来的趋势,选择Java就会和人工智能失之交臂,确实,但大家要知道,想从事人工智能方面的工作,学的可不只有Python,更需要你会各种复杂的计算,数据分析,推演,超强的思维等等。Java是一门成熟发展20多年编程语言,开发使用率极高,目前java市场…

    2022年7月7日
    23
  • C语言 — void的用法解析[通俗易懂]

    C语言 — void的用法解析[通俗易懂]C语言-void的用法解析简介​ void中文翻译为”无类型”,有的也叫”空类型”。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。用法​ void应用最广泛的就是跟指针结合,即void* //无类型指针,也称为空指针,可以指向任何类型的数据 //注意一点:当我们需要使用void类型的的指针变量区指向 某一类型的变量的时候,必须要对其进行类型转换​ 这里补充一点:因为我们在定义一个指针变量的时候第一件事就是指定我们指针变量所指向的变量的类型。一

    2022年5月19日
    105
  • JVM内存划分[通俗易懂]

    JVM内存划分[通俗易懂]目录 1.概述2.运行时数据区域 2.1程序计数器2.2Java虚拟机栈2.3本地方法栈2.4Java堆2.5方法区2.6补充2.6.1运行时常量池和Class文件常量池2.6.2直接内存3.HotSpot虚拟机3.1内存划分3.2对象的创建、内存布局、访问定位3.2.1对象的创建3.2.2对象的内存布局…

    2022年5月26日
    53
  • Idea激活码永久有效Idea2021.3.2激活码教程-持续更新,一步到位

    Idea激活码永久有效Idea2021.3.2激活码教程-持续更新,一步到位Idea激活码永久有效2021.3.2激活码教程-Windows版永久激活-持续更新,Idea激活码2021.3.2成功激活

    2022年6月17日
    106
  • Spring 事务隔离级别有哪些?

    Spring 事务隔离级别有哪些?DEFAULT 采用 DB 默认的事务隔离级别 READ UNCOMMITTED 读未提交 READ COMMITTED 读已提交 REPEATABLE READ 可重复读 SERIALIZABLE 串行化 Spring 事务的传播机制有哪些 propagation required 当前方法 必须在一个具有事务的上下文中运行 如有客户端有事务在进行 那么被调用端将在该事务中运行 否则的话重新开启一个事务 如果被调用端发生异常 那么调用端和被调用端事务都将回滚 propa

    2026年3月26日
    3
  • python:shapely模块

    python:shapely模块目录一 几何对象 1 点 Point 2 线 LineString 3 闭合线 LinearRing 4 多边形 Polygon 5 集合 Collections 6 多个点 MultiPoint 7 多条线 MultiLineStr 8 多个多边形 MultiPolygon 二 属性和方法三 仿射变换四 地图投影和转换一 几何对象 1 点 Point fromshapely geometryimpo Point 0 0 0 0 属性说明

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号