• 【JS函数】JS函数之防抖、节流函数


     自我介绍:大家好,我是吉帅振的网络日志;微信公众号:吉帅振的网络日志;前端开发工程师,工作4年,去过上海、北京,经历创业公司,进过大厂,现在郑州敲代码。

    JS函数专栏

    1【JS函数】JS函数之普通、构造、闭包函数

    2【JS函数】JS函数之定时器函数

    3【JS函数】JS函数之防抖、节流函数

    一、防抖debounce函数

    1.定义

    n秒后执行,事件触发后延迟执行,输入期间不执行触发操作。无操作及延迟时间过后触发,一般适用于频繁触发的操作。

    2.应用场景

    输入框中频繁的输入内容,搜索或者提交信息;频繁的点击按钮,触发某个事件;监听浏览器滚动事件,完成某些特定操作;用户缩放浏览器的resize事件。

    3.基本实现

    1. //原理是用setTimeout函数达到延迟效果,连续操作时使用clearTimeout函数不断清除定时器,重置延迟时间,阻止连续触发。
    2. let inp = document.getElementById("inp")
    3. var timeout;
    4. inp.oninput = function () {
    5. clearTimeout(timeout)
    6. timeout = setTimeout(() => {
    7. console.log(this.value)
    8. },1000)
    9. }
    10. //优化:参数和this指向;增加取消功能;第一次立即执行;返回值
    11. function debounce(fn,delay,immediate=false,resultCallback){
    12. let timer=null
    13. // console.log(this)//window
    14. // 定义控制立即执行的变量,false表示没有执行过
    15. let isInvoke=false
    16. // 真正的处理函数
    17. function _debounce(...args){
    18. // 取消事件执行操作
    19. if(timer) clearTimeout(timer)
    20. // console.log(this)//element元素
    21. if(immediate&&!isInvoke){
    22. const result=fn.apply(this,args)
    23. resultCallback(result)
    24. isInvoke=true
    25. }else{
    26. // 延迟执行
    27. timer=setTimeout(()=>{
    28. const result=fn.apply(this,args)
    29. resultCallback(result)
    30. timer=null
    31. isInvoke=false
    32. },delay)
    33. }
    34. }
    35. // 封装取消请求
    36. _debounce.cancel=function(){
    37. if(timer) clearTimeout(timer)
    38. timer=null
    39. isInvoke=false
    40. }
    41. return _debounce
    42. }

     二、节流throttle函数

    1.定义

    n秒内只执行一次,节流函数是规定一段时间内无法触发,时间过了才触发,即使不断输入值,但只要1秒钟过了,也会触发。

    2.应用场景

    监听页面的滚动事件;鼠标移动事件;用户频繁点击按钮操作;游戏中的一些设计。

    3.基本实现

    1. //节流,就是节制的意思,能省就省。写法与防抖函数类似,都是使用定时器,不过它们还是有差别的。
    2. let inp = document.getElementById("inp")
    3. var timeout
    4. let flag = true
    5. inp.oninput = function () {
    6. if (!flag) {
    7. return
    8. }
    9. flag = false
    10. timeout = setTimeout(() => {
    11. console.log(123)
    12. flag = true
    13. }, 1000)
    14. }
    15. //优化:节流最后一次也可以执行;增加取消功能;返回值
    16. function throttle(fn,interval,options={leading:true,trailing:false}){
    17. let lastTime=0
    18. const {leading,trailing,resultCallback}=options
    19. let timer=null
    20. function _throttle(...args){
    21. const nowTime=new Date().getTime()
    22. // leading优化
    23. if(!leading&&!lastTime) lastTime=nowTime
    24. let remainTime=interval-(nowTime-lastTime)
    25. if(remainTime<=0){
    26. if(timer){
    27. clearTimeout(timer)
    28. timer=null
    29. }
    30. // 参数优化
    31. const result=fn.apply(this,args)
    32. if(resultCallback) resultCallback(result)
    33. lastTime=nowTime
    34. return
    35. }
    36. // 优化trailing
    37. if(!timer&&trailing){
    38. timer=setTimeout(()=>{
    39. // 参数优化
    40. const result=fn.apply(this,args)
    41. if(resultCallback) resultCallback(result)
    42. timer=null
    43. lastTime=!leading?0:new Date().getTime()
    44. },remainTime)
    45. }
    46. }
    47. _throttle.cancel=function(){
    48. if(timer) clearTimeout(timer)
    49. timer = null
    50. lastTime = 0
    51. }
    52. return _throttle
    53. }
  • 相关阅读:
    MySQL和Java程序建立连接的底层原理(JDBC),一个SQL语句是如何执行的呢?
    【GO】项目import第三方的依赖包
    Git常用命令1
    Dart(6)-类
    算法之冒泡排序
    C语言指针操作·八大总结
    Windows系统提示“ping”不是内部或外部命令,也不是可运行的程序或批处理文件解决办法
    408 | 【2021年】计算机统考真题 自用回顾知识点整理
    Python爬虫:制作一个属于自己的IP代理模块
    C语言学习第二天
  • 原文地址:https://blog.csdn.net/qq_42451979/article/details/125514018