美文网首页
前端日常——节流

前端日常——节流

作者: CCCCCccccccch | 来源:发表于2019-10-22 12:18 被阅读0次

    一、什么是节流

    当持续触发事件时,在规定时间段内只调用一次回调函数。如果在规定时间内又触发了该事件,则什么都不做,也不重置定时器。

    与防抖相比较:

    防抖是将多次执行变为最后一次执行,节流是将多次执行变为在规定时间内只执行一次。一般不会重置定时器,即不会if(timer) clearTimeout(timer);(时间戳+定时器版除外)

    二、应用场景

    两个条件:

    1、用户连续频繁地(事件触发的时间间隔比规定的时间要短)触发事件

    2、用户不只关心“最后一次”操作后的结果反馈,而是在操作过程中的持续反馈。

    如:鼠标不断点击触发,点击事件在规定时间内只触发一次(单位时间内只触发一次);监听滚动事件,比如是否滑到底部加载更多,用throttle来判断。

    三、原理

    两种实现方式:

    1、时间戳方式:通过闭包保存上一次的时间戳,然后与事件触发的时间戳比较,如果大于规定时间,则执行回调,否则就不作处理。特点:一般第一次会立即执行,之后连续频繁地触发事件,也是超过了规定时间才会执行一次。最后一次触发事件,也不会执行(因为如果你最后一次触发时间大于规定时间,这样就算不上连续触发了)。

    2、定时器方式:原理与防抖类似,通过闭包保存上一次定时器状态,然后事件触发时,如果定时器为null(即代表此时间隔时间已经大于规定时间),则设置新的定时器,到时间后执行回调函数,并将定时器设置为null。特点:当第一次触发事件时,不会立即执行函数,到了规定时间后才会执行,之后连续频繁地触发事件,也是到了规定时间才会执行一次(因为定时器)。当最后一次停止触发后,由于定时器的延时,还会执行一次回调函数(是上一次成功触发执行的回调,而不是你最后一次触发产生的)。一句话总结就是延时回调,你能看到的回调都是上次成功触发产生的,而不是你此刻触发产生的。

    这两种最大的区别是:时间戳版的函数触发是在规定时间开始的时候,而定时器的函数触发是在规定时间结束的时候。

    四、代码实现

    1、时间戳版:

    2、定时器版:

    3、时间戳+定时器版(实现第一次触发可以立即响应,结束触发也能有响应,该版才最符合实际工作要求)

    相关文章

      网友评论

          本文标题:前端日常——节流

          本文链接:https://www.haomeiwen.com/subject/zttmyctx.html