关于JavaScript防抖与节流的区别与实现

 更新时间:2021年10月21日 14:12:35   作者:Mjser  
这篇文章主要介绍关于JavaScript防抖与节流的区别与实现,防抖就是用户多次触发事件,在用户一直触发事件中,事件不会执行,只有在用户停止触发事件一段时间之后再执行这个事件一次,二节流是用户多次触发事件,具体详情一i起来学习下面文章内容吧

前言:

作为前端开发中会以下两种需求

(1)搜索需求

搜索的逻辑就是监听用户输入事件,等用户输入完成之后把数据发送给后端,后端返回匹配数据,前端显示数据到页面。如果只要用户输入就发请求,这样会给后端造成请求压力,需要控制请求的频率。

(2)页面无限加载数据

页面无限加载数据的逻辑就是监听用户用户滚动事件,在用户滚动的过程中,去请求下一页的数据来显示到页面。,那么只要滚动就去发请求,同样会造成后端请求压力,需要控制请求的频率。

以上两种看起来都是控制请求频率的问题,但是需求有细微的差别:搜索是用户在输入中输入多次,只有等用户短暂停止输入之后,就去发送请求,此时就需要防抖去实现。滚动加载数据是在用户滚动页面的过程中每间隔一段时间就去请求,即使用户一直滚动,都会去请求,而不是等用户停止滚动才去请求,此时就需要使用节流去实现。

1、防抖

含义:

简单的理解方式就是:用户多次触发事件,在用户一直触发事件中,事件不会执行,只有在用户停止触发事件一段时间之后再执行这个事件一次。

实现:

 

// @fn 是对应请求数据
    // @ms 是用户多次触发事件的时间间隔 是一个毫秒数
    function debounce(fn, ms) {
        let timeout = null
        return function() {
            clearTimeout(timeout)
            timeout = setTimeout(() => {
                fn.apply(this, arguments)
            }, ms)
        }
    }

原理:

用户每一次触发事件都会延迟执行,在设置延迟定时器执之前都会把上一次延迟定时器清除,最终只有用户连续触发这个事件的间隔时间超出我们设置的参数ms毫秒之后,该事件才会触发一次

测试:

<input id="searchInput"/>
    function getData(){
        console.log('发送请求...')
    }
    document.getElementById('searchInput').oninput = debounce(getData, 800)
    // 如果用户一直在输入,是不会发送请求
    // 只有用户连续输入时间间隔超过800ms之后才会请求一次数据,也就是用户在800ms内没有输入才会去请求数据

2、节流

含义:

简单的理解方式就是:用户多次触发事件,在用户一直触发事件过程中事件会每间隔一段时间执行一次,会执行多次。

实现:

    // @fn 是对应请求数据
    // @ms 是用户多次触发事件的时间间隔 是一个毫秒数
     function throttle(fn, ms){
        let flag = true
        return function(){
            if(!flag) return
            flag = false
            setTimeout(()=>{
                fn.apply(this, arguments)
                flag = true
            }, ms)
        }
    }

原理:

用户每一次触发事件都会设置一个延迟定时器,但是如果已经设置了延迟定时器就会等上一次延迟定时器执行之后才会开启下一个定时器,这样用户一直触发事件,事件会每间隔一段时间执行一次

测试:

function getData(){
        console.log('发送请求...')
    }
    window.onscroll = throttle(getData, 800)
    // 用户在滚动的过程中,会间隔去请求数据


3、总结

节流和防抖本质上都是控制事件执行的频率,但是触发事件的时机本质上有区别,防抖是在用户多次触发事件,当用户停止触发事件,将事件执行一次;节流是用户多次触发事件,会在多次触发的过程中,间隔执行事件。

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

相关文章

  • JavaScript文档对象模型DOM

    JavaScript文档对象模型DOM

    这篇文章主要介绍了JavaScript文档对象模型DOM,当网页被加载时,浏览器会创建页面的文档对象模型,通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。下面来看看文章得详细内容,需要的朋友可以参考一下
    2021-11-11
  • JavaScript立即执行函数用法解析

    JavaScript立即执行函数用法解析

    这篇文章主要介绍了JavaScript立即执行函数,我们知道,在一般情况下,函数必须先调用才能执行,如下所示,我们定义了一个函数,并且调用,下面一起进入文章来接具体的使用方法吧
    2021-12-12
  • 前端JavaScript大管家 package.json

    前端JavaScript大管家 package.json

    这篇文章主要介绍了前端JavaScript大管家 package.json,在每个前端项目中,都有package.json文件,它是项目的配置文件,常见的配置有配置项目启动、打包命令,声明依赖包等,下面我们就来学习 package.json的详细内容,需要的朋友可以参考一下
    2021-10-10
  • Javascript 之封装(Package)

    Javascript 之封装(Package)

    Javascript是一种基于对象(object-based)的语言,我们在JS中遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程语言,因为它的语法中没有class(类)那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象
    2018-09-09
  • 微信小程序 获取二维码实例详解

    微信小程序 获取二维码实例详解

    这篇文章主要介绍了 微信小程序 获取二维码实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • 客户端静态页面玩分页

    客户端静态页面玩分页

    客户端静态页面玩分页...
    2006-06-06
  • 微信小程序 UI布局常用技巧整理总结

    微信小程序 UI布局常用技巧整理总结

    这篇文章主要介绍了微信小程序 UI布局常用技巧整理总结的相关资料,现在不论是APP 还是各种软件,UI布局还是非常重要的,用户体验第一位啊,这里就整理下微信小程序的UI布局,需要的朋友可以参考下
    2016-12-12
  • threejs中使用drawbufferss示例详解

    threejs中使用drawbufferss示例详解

    这篇文章主要为大家介绍了threejs中使用drawbufferss示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • You-Dont-Know-JS作用域学习文档

    You-Dont-Know-JS作用域学习文档

    这篇文章主要介绍了You-Dont-Know-JS作用域学习文档,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 微前端框架qiankun源码剖析之上篇

    微前端框架qiankun源码剖析之上篇

    这篇文章主要为大家介绍了微前端框架qiankun的源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论