首页 > 其他分享 >防抖和节流

防抖和节流

时间:2022-11-05 15:46:55浏览次数:32  
标签:触发 防抖 节流 timer delay event fn

防抖节流的作用

防抖和节流都是用来减少函数执行的频率,已达到项目性能的优化

防抖:

 概念:

          事件在触发一定时间后再执行回调,如果在这段时间又被触发了,则重新计时,等到计时到了再执行回调

    应用场景:

           1).输入框远程查询事件(防止边输入边执行后台请求,触发后台请求太多,浪费资源)

           2)在线文档自动保存 (防止文档编辑过程中一直触发函数。而停止编辑后再触发性能比较好)

           3)浏览器视口大小改变(防止在拖动窗口时一直触发某个方法,浪费资源。而等停止拖动后再触发性能比较好)

   代码实现:

// 防抖函数的定义: 内部实际是一个闭包函数,可以通过调用debounce获取到内部的value值
const debounce = (fn, delay) => { let timer = null return function () { clearTimeout(timer) // 每次执行某个操作之前先清空timer timer = setTimeout(fn, delay) // 待延时时间到了再执行回调 } }
// 输入完成1s后再触发相应的回调 const inputEl = document.getElementById('inputEl') inputEl.oninput = debounce(function(event) { const value = event.target.value console.log('value的值是:', value) }, 1000)

 

节流:

  概念:

        在单位时间内多次触发某个事件,只执行一次

  应用场景:

        1)按钮提交事件 (也可以用loading实现,支付功能用节流更佳)

        2)页面滚动事件

  实现原理:设置一个时间,如果在规定时间内再次触发同一操作,则不执行该操作

  代码实现:

const throttle(fn, delay) {
   let timer = null
   return function (evevt) {
       if (timer) return false;     // 如果时间没到,不执行下一次操作
       timer = setTimeouut(() => {  // 如果时间到了,可以执行下一次操作,将timer清空,从头再来
           clearTimeout(timer)
           timer = null
           fn(event)
       }, delay)
   }
}
cosnt btnEl = document.getElementById('btnEl')
btnEl.addEventListener('click', throttle(function(event) {
  console.log("执行点击事件")
}, 1000)

 上述代码在每次执行点击操作均需要等待,而现实需求是第一次点击一次上一次点击结束后再点击都无需等待。所以有以下优化方案

  优化后的代码实现:

function throttle (fn, delay) {
      let init = false // 引入一个参数记录状态
      let timer;
      return (event) => {  
        if (init) return
        init = true
        clearTimeout(timer)
        timer = setTimeout(() => {
          init = false
        }, delay)
        fn(event)
     }
  }

标签:触发,防抖,节流,timer,delay,event,fn
From: https://www.cnblogs.com/liuminxiu0707/p/16860232.html

相关文章

  • JS防抖与节流
    1.概念上的区别防抖:多次执行只有最后一次生效,必要参数[handle,time]节流:一段时间内只能执行一次,必要参数[handle,time]2.实现一下防抖:1functiondebounce......
  • 防抖函数
    函数封装exportconstdebounce=(func,delay)=>{lettimer=nullreturnfunction(...args){if(timer)clearTimeout(timer)timer=setTimeout......
  • React-Hooks怎样封装防抖和节流-面试真题
    Debouncedebounce原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的。防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在......
  • java-文件-字节流-3
    packageFile2_Byte_file;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.I......
  • vue防抖
     constdebounce=()=>{axios.get('/api/blog/administration/spot').then(res=>{if(res.data.code==200){}else{this.......
  • 防抖--如何讲清楚函数防抖?
    首先函数为什么会抖呢?来列举一个实际的应用场景,例如百度的搜索提示:你可以看到,当你在输入框每输入一个字符的时候百度都会不断的根据当下的输入给予新的提示----那么,如......
  • 函数的防抖与节流实现
    一、什么是节流函数,什么是防抖函数,它们之间的区别是什么?·节流函数:节流,可以理解为节省流量。当一个请求被用户在短时间内不停点击时(用户频繁发送一个数据请求),为了减轻服务......
  • #yyds干货盘点#vue的防抖
    在监听频繁触发的事件时,一定要多加小心,比如用户在输入框打字、窗口大小调整、滚动、IntersectionObserver事件。这些事件总是被频繁触发,可能几秒一次。如果针对每次事件......
  • JavaScript 节流和防抖
    前言本文主要记录了JavaScript节流和防抖,节流和防抖本质上是优化执行高频率代码的一种手段。例如:浏览器的mousemove、resize、scroll等事件在触发时,会不断地调用绑定的......
  • 防抖节流的含义使用场景及js实现原理
    1.防抖:n秒后在执行该事件,若在n秒内被重复触发,则重新计时。代码实现重在清零clearTimeout。应用:登录,提交,浏览器窗口的resizes事件,文本编辑保存//防抖函数f......