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

防抖和节流

时间:2023-05-11 19:57:14浏览次数:33  
标签:触发 防抖 节流 func var options wait

卡顿现象

//正常情况(用户慢慢的操作):鼠标进入,每一个一级分类h3,都会触发鼠标进入事件
//非正常情况(用户操作很快):本身全部的一级分类都应该触发鼠标进入事件,但是经过测试,只有部分h3触发了
//就是由于用户行为过快,导致浏览器反应不过来。如果当前回调函数中有一些大量业务,有可能出现卡顿现象
 changeIndex(index) {
	this.cuurentIndex = index;
},
  

正常:事件触发非常频繁,而且每一次的触发,回调函数都要去执行(如果时间很短,而回调函数内部有计算,那么很可能出现浏览器卡顿)
节流:在规定的间隔时间范围内不会重复触发回调,只有大于这个时间间隔才会触发回调,把频繁触发变为少量触发
防抖:前面的所有的触发都被取消,最后一次执行在规定的时间之后才会触发,也就是说如果连续快速的触发只会执行一次
 //throttle回调函数别用箭头函数,可能出现上下文this不匹配
//lodash插件:里面封装函数的防抖与节流的业务【闭包+延迟器】
https://www.lodashjs.com/docs/lodash.debounce

//1:lodash函数库对外暴露_函数
console.log(_)
console.log(_.debounce)

防抖:用户操作很频繁,但是只是执行一次
节流:用户操作很频繁,但是把频繁的操作变为少量操作【可以给浏览器有充裕的时间解析代码】

_.debounce(func, [wait=0], [options=]) 防抖

参数

  1. func (Function): 要防抖动的函数。
  2. [wait=0] (number): 需要延迟的毫秒数。
  3. [options=] (Object): 选项对象。
  4. [options.leading=false] (boolean): 指定在延迟开始前调用。
  5. [options.maxWait] (number): 设置 func 允许被延迟的最大值。
  6. [options.trailing=true] (boolean): 指定在延迟结束后调用。

返回

(Function): 返回新的 debounced(防抖动)函数。

应用场景

  • search搜索联想,用户在不断输入值时,用防抖来节约请求资源。
  • 频繁操作点赞和取消点赞,因此需要获取最后一次操作结果并发送给服务器

实现一个简单的防抖

//用定时器实现防抖
function debounce(func,wait) {
  var timer=null;
  return function() {
    //保存当前调用的dom对象
    var _this=this;
    //保存事件对象
    var args=arguments;
    clearTimeout(timer)
    timer=setTimeout(function() {
      func.apply(_this,args)
    },wait)
  }

}

_.throttle(func, [wait=0], [options=]) 节流

参数

  1. func (Function): 要节流的函数。
  2. [wait=0] (number): 需要节流的毫秒。
  3. [options=] (Object): 选项对象。
  4. [options.leading=true] (boolean): 指定调用在节流开始前。
  5. [options.trailing=true] (boolean): 指定调用在节流结束后。

返回

(Function): 返回节流的函数。

import throttle from "lodash/throttle";

methods:{
	changeIndex: throttle(function (index) {
		this.cuurentIndex = index;
	}, 50),
}

应用场景

  • 鼠标不断点击触发,mousedown(单位时间内只触发一次)
  • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

实现一个简单的节流

//定时器实现节流
function throttle(func,wait) {
  var timer=null;

  return function() {
    var _this=this;
    var args=arguments;
    if(!timer) {
      timer=setTimeout(function() {
        timer=null;
        func.apply(_this,args)
      },wait)
    }
  }
}


//时间戳实现节流
function throttle(func,wait) {
  //定义初始时间
  var oldTime=0;

  return function() {
    var _this=this;
    var args=arguments;

    //当前时间戳
    var newTime=+new Date();

    //判断用当前时间减去旧的时间,如果大于wait指定的时间就会触发
    if(newTime-oldTime>wait) {
      //执行触发的函数
      func.apply(_this,args)
      //将旧时间更新
      oldTime=newTime;
    }

  }
}

标签:触发,防抖,节流,func,var,options,wait
From: https://www.cnblogs.com/sunqqw/p/17392043.html

相关文章

  • 防抖
    <script>functionTest(fn,delay){lettimer=null;returnfunction(){if(timer){clearTimeout(timer);}timer=setTimeout(fn,delay);}}window.o......
  • JS高级(作用域,原型链,闭包,节流,防抖等概念性)
    作用域局部作用域函数作用域在函数内部声明的变量只能在函数内部被访问,外部无法直接访问块作用域let和const声明的变量会产生块作用域,var不会产生块作用域,推荐使用let和const全局作用域在<script>和.js文件的最外层就是全局作用域,在此声明的变量在其他任何作用域都可以被......
  • 下载文件(Excel)功能,后端返回blob字节流,前端怎么处理?
    在做大屏数据项目有个报表下载的功能,根据用户选择的时间下载对应时间的报表,后端返回的是文件流,前端需要怎么去处理呢?实现的功能效果: 后端返回的数据:需要我们处理的乱码:前端代码:1exportExcel(){2axios({3methods:"xxxx",4url:"xxx/xxxx/xx......
  • lazyload&防抖动和节流阀
    title:07-自定义按键修饰符&自定义指令publish:falselazyload用的最多的场景是:图片lazyload组件lazyload现在一般都单独做css的lazyload或者js的lazyload,因为这种方式,其实还是要加载图片和组件。图片lazyload图片一般是页面最大的资源,所以非首屏延迟加载很重要(......
  • 防抖和节流
    1.debounce(防抖)和throttle(节流)的定义口语版:防抖就是只有当小明连续10天不捣蛋时,小明爸爸才给他零花钱。如果在这10天内小明捣蛋了,那么重新计算,直到满足了10天不捣蛋的条件,小明爸爸才给零花钱。一年下来小明居然只拿到了5次零花钱,你说气人不?节流就是无论小明捣蛋不捣蛋,小明......
  • vue2 input防抖功能
    1.在el-input绑定@input事件 2.在data中定义timer为null 3.在methods中定义@input绑定的方法 4.在setTimeout中调用对应处理的方法<el-inputstyle="width:140px;color:#FF8900"size="small"v-model="singleDiscountForm.discount"@input="inputDis......
  • js节流和防抖
    节流(throttle):指连续触发事件的函数,在一定时间间隔内只执行一次。functionthrottle(fn,delay){lettimer=null;returnfunction(){constself=this;constargs=arguments;if(!timer){timer=setTimeout(function(){timer......
  • 防抖和节流及多种实现方式
    当用户在网页中进行操作时,如点击、滚动、输入等,往往会频繁地触发事件。如果每个事件都立即执行相应的函数,可能会导致性能问题和用户体验不佳,因为这些函数可能需要执行复杂的操作,如计算、网络请求等。为了优化这种情况,我们可以使用防抖和节流来限制函数的调用次数,从而提高性能和用......
  • js实现防抖(debounce)与节流(throttle)
    防抖(debounce)一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该事件(也就是触发过快),则不会触发事件。举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。functiondebounce(fn,timeout){......
  • js-防抖和节流的区别及实现
    函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。函数节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。函数节流(throttle)与函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过......