详细聊一聊js防抖节流到底是什么

 更新时间:2022年04月15日 14:32:28   作者:在下月亮有何贵干  
在项目开发中我们常常会去监听滚动事件或者用户输入框验证事件,如果事件处理没有频率限制,当用户不断触发事件时,就会加重浏览器的负担,影响用户的体验,造成不必要的损失,这篇文章主要给大家介绍了关于js防抖节流到底是什么的相关资料,需要的朋友可以参考下

前言

防抖和节流,这是前端防止用户频繁调用同一个接口的方法,比如短时间重复点击上传同一个文件,短时间重复点击提交同一个评论,异步的操作还没给你带来反馈,于是你重复上传了多个文件,重复提交了多个评论。

本文以常见的使用场景与解决方案,一篇教会你如何使用防抖节流。

场景

为了例子更加简单,我们就用延迟来模拟一个后端接口返回的过程。

<body>
<button onclick="comment()">发表评论</button>
<script>
    const commentApi = () => {
        // 我们使用延迟模拟异步请求
        setTimeout(() => {
            const div = document.createElement('div')
            div.innerText = '本人到此一游'
            document.body.appendChild(div)
        }, 1000)
    }

    const comment = () => {
        // 请求发布评论Api
        commentApi()
    }
</script>
</body>

以上是一个发表评论的例子,由于接口一秒后才会响应评论反馈到界面上。

用户本意只是发布一条评论,但是由于接口需要响应时间,他以为自己的第一次点击没有生效于是就多点击了两次,结果显而易见,就是非用户本意的发布了三条一样的评论。

我们希望的是用户不要在请求还在进行的时候,频繁的重复发送请求。这时候就需要防抖节流了。

防抖

核心

  • 设置延迟,短时间高频率触发只有最后一次触发成功

解释

防抖指的是设置延时器,比方说我点击之后设置一个1s的延迟,1s后开始上传。

如果在1s之中再次点击该事件,那么这个延迟被清除,重置1s的延迟,也就是还没开始上传你得重新等待1s。

也就是无论你如何一直乱点,也只有你停止点击后的最后一次点击会成功。

修复场景例子

快速点击几次,还是只会发送一条评论。

但是缺点就是用户得到响应的时间更久了,得要算上延迟加上接口的响应。

<body>
<button onclick="comment()">发表评论</button>
<script>
    const commentApi = () => {
        // 我们使用延迟模拟异步请求
        setTimeout(() => {
            const div = document.createElement('div')
            div.innerText = '本人到此一游'
            document.body.appendChild(div)
        }, 1000)
    }
    let later
    const comment = () => {
        // 如果已经设置过延迟请求,则重置延迟
        if (later) {
            clearTimeout(later)
        }
        later = setTimeout(() => {
            commentApi()
        }, 1000)
    }
</script>

所以防抖一般也不完全适合此类型的场景,它更适合需要一定操作结束之后再执行的场景,比如请你输入一段话,输入结束之后再进行请求,当然不希望你在输入的过程中就开始请求了,于是设置防抖,直到发觉你停止输入了才开始请求。

节流

核心

  • 设置状态锁,短时间高频率触发只有第一次会触发成功

解释

节流是设置状态锁,比如设置一个key作为锁,锁一开始的状态是关闭的,我们将key设置为false。

当你点击的时候,会对key进行判断,如果发现key为false,未上锁,那么开始请求,并且与此同时给key上锁,将flag设置为true。

然后这时候你继续点击请求的时候,同样要判断key,发现上锁了,你怎么点击也没用。

然后什么时候再将锁关闭呢?在你接口返回给前端,提示你已经上传完毕了之后,再将key关闭置为false,就可以再次提交请求了。

修复场景例子

快速点击几次,还是只会发送一条评论。只有一条请求发布成功之后,才能够发布第二条请求,对于该场景十分合适。

<body>
<button onclick="comment()">发表评论</button>
<script>
    let key = false
    const commentApi = () => {
        setTimeout(() => {
            const div = document.createElement('div')
            div.innerText = '本人到此一游'
            document.body.appendChild(div)
            // 请求结束,解锁
            key=false
        }, 1000)
    }
    const comment = () => {
        // 未上锁开始执行
        if (!key) {
            // 请求开始,上锁
            key = true
            commentApi()
        }
    }
</script>
</body>

总结

函数防抖:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否有延迟调用函数未执行。

区别: 函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

到此这篇关于js防抖节流到底是什么的文章就介绍到这了,更多相关js防抖节流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超全面的JavaScript开发规范(推荐)

    超全面的JavaScript开发规范(推荐)

    作为一名开发人员(WEB前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题。本文就主要介绍了关于Javascript的命名规范、注释规范以及框架开发的一些问题,需要的朋友可以参考学习。
    2017-01-01
  • JS实现数组按升序及降序排列的方法

    JS实现数组按升序及降序排列的方法

    这篇文章主要介绍了JS实现数组按升序及降序排列的方法,涉及javascript针对数组的简单排序操作相关实现技巧,需要的朋友可以参考下
    2017-04-04
  • javascript中的异步调用机制

    javascript中的异步调用机制

    这篇文章主要介绍了javascript中的异步调用机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 一文学会用JS判断文字是否被省略(ellipsis)

    一文学会用JS判断文字是否被省略(ellipsis)

    这篇文章主要给大家介绍了用JS如何判断文字被省略ellipsis,CSS帮我们搞定了省略,但是JS并不知道文本什么时候被省略了,所以我们得通过JS来计算,接下来,我将介绍2种方法来实现JS计算省略,需要的朋友可以参考下
    2023-08-08
  • 微信小程序图片左右摆动效果详解

    微信小程序图片左右摆动效果详解

    这篇文章主要介绍了微信小程序图片左右摆动效果详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • JavaScript知识点总结之如何提高性能

    JavaScript知识点总结之如何提高性能

    JavaScript的性能问题不容小觑,这就需要我们开发人员在编写JavaScript程序时多注意一些细节,本文非常详细的介绍了一下JavaScript性能优化方面的知识点,绝对是干货,需要的朋友快来一起学习吧
    2016-01-01
  • 用js实现简单轮播图

    用js实现简单轮播图

    这篇文章主要为大家详细介绍了用js实现简单轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)

    PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)

    PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)...
    2007-08-08
  • JavaScript获取时间戳的方法总结

    JavaScript获取时间戳的方法总结

    JavaScript获得时间戳的方法有五种,后四种都是通过实例化时间对象new Date() 来进一步获取当前的时间戳,下面我们就一起学习一下具体获取的方法吧
    2023-09-09
  • antd table长表格出现滚动条的操作方法

    antd table长表格出现滚动条的操作方法

    这篇文章主要介绍了antd table长表格如何出现滚动条,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论