来聊聊JavaScript中的防抖和节流

目录

  • JavaScript防抖和节流

    • 问题还原
    • 防抖
      • 什么是防抖
      • 使用场景
    • 节流
      • 什么是节流
      • 使用场景

JavaScript防抖和节流

问题还原

我们先来通过代码把常见的问题还原:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){
            // 没有处理防抖和节流的代码
            let norInput = document.getElementById('normal');

            let ajax = content=>{
                console.log('ajax:' + content);
            }

            norInput.addEventListener('keyup',e=>{
                ajax(e.target.value)
            })
            // console.log(debounce()())
        }
    </script>

    <input type="text" name="normal" id="normal">

</body>
</html>

在上面的程序中,看上去是没有什么问题,但是用户每输入一个字符,都会向后端发起一次请求,而这只是一个用户,如果同时很多用户进行相同的操作,无异于是给服务端造成极大的压力。

而解决这种问题,有很多种合适的方法,但是下文要说到的,是关于JavaScript当中的防抖节流操作。

防抖

什么是防抖

当用户在触发一次事件n秒后在执行回调函数,如果重复触发则进行重新计时。

根据防抖的逻辑,下面通过代码来进行模拟:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){

            let norInput = document.getElementById('normal');
            // 创建一个函数模拟ajax请求
            let ajax = content=>{
                console.log('ajax:' + content);
            }

            // 创建防抖函数
            let debounce = (fn,delay) => {
                return function(args){
                    let that = this;
                    let param = args;
                    // 每次事件触发 清除当前的timmer 然后重写调用
                    clearTimeout(fn.id);
                    fn.id = setTimeout(function(){
                        fn.call(that,param)
                    },delay)
                }
            }

            let deb_func = debounce(ajax,500)
            norInput.addEventListener('keyup',e=>{
                deb_func(e.target.value)
            })

        }
    </script>

    <input type="text" name="normal" id="normal">

</body>
</html>

上面的demo运行后,你会发下,用户如果停止输入后的一段时间才会发起ajax请求,而如果用户持续输入,则计时器会不断的刷新,再这个过程中并不会发生请求,直到用户停止输入,才会开始计时,时间一到,才会发送请求。

这样就能够有效的减少因为频繁发送请求给服务器带来过大的压力。

使用场景

  1. resize 事件或者scroll事件等,可以通过防抖减少触发次数
  2. 用户在输入框中频繁输入

节流

什么是节流

设置一个时间范围,在一定的时间范围内,仅允许执行一次执行一次事件的回调函数,也就是说只要在规定时间范围内,无论事件触发几次,都只能执行一次回调函数。

我们通过click事件来还原下事故现场:

<html>
<head>
    <meta charset="utf-8">
    <title>节流</title>
</head>
<body>

<input type="button" id="btn" value="点击">
<script type="text/javascript">

let oBtn = document.getElementById('btn');

let ajax = ()=>{
    console.log("ajax发送请求")
}

oBtn.addEventListener('click',()=>{
    ajax();
})

</script>
</body>
</html>

当用户每一次点击后,都会发送一次请求,点击不断,请求不断。如同生命不息,战斗不止。可想而知,一旦有人无聊的一直点击,那么请求次数将会变得很可观。

下面是我们根据节流的原理来实现的示例代码:

<html>
<head>
    <meta charset="utf-8">
    <title>问题演示</title>
</head>
<body>

    <script type="text/javascript">
        window.onload = function(){
            // 获取元素
            let oBtn = document.getElementById('normal');

            // 模拟ajax请求
            let ajax = ()=>{
                console.log("ajax发送请求....")
            }

            // 节流函数
            let throttle = (func,wait) =>{
                var timeout ;
                var previous = 0;

                return function(){
                    var _this = this;
                    args = arguments;
                    if(!timeout){
                        timeout = setTimeout(function(){
                            timeout = null;
                            func.apply(_this,args);
                        },wait)
                    }
                }
            }
            let thro_func = throttle(ajax,3000);

            // 绑定事件
            oBtn.addEventListener('click',()=>{
                thro_func();
            })
        }
    </script>

    <input type="button" name="normal" id="normal" value="点击">

</body>
</html>

通过上面的案例,我们可以做到,当用户点击一次后,计时器开始,这当中无论发生几次事件触发,都仅仅会执行一次回调。

当然,想要实现节流的方法不止使用定时器这一种方案,还可以选择使用时间戳,再或者其他方法也不是不行,本文的目的仅仅是为了阐述和说明节流防抖这两种减少服务器压力的方法而已。

使用场景

  1. 鼠标不断点击的情况
  2. 页面无限加载,每隔一段时间发起请求而不是用户停止滚动发起请求
  3. ...

原文地址:https://www.cnblogs.com/liujunhang/p/11405851.html

时间: 2024-10-08 12:57:44

来聊聊JavaScript中的防抖和节流的相关文章

javascript中的防抖与节流。

1.什么是防抖?它有什么作用? 什么是防抖?相信行入门的小白,甚至做了一段时间的程序员也不太理解是什么意思,我也是听了公开课才了解一点,现在和大家分享一下我的理解! 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.比如,在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕,请求的次数多了浏览器会造成卡

直播开始:&#39;云榨汁机&#39;诞生记--聊聊JavaScript中的&#39;业务建模&#39;

闭包是JavaScript中的一个重要特性,在之前的博文中,我们说闭包是一个'看似简单,其实很有内涵'的特性.当我们用JavaScript来实现相对复杂的业务建模时,我们可以如何利用'闭包'这个特性呢?JavaScript中的'原型继承',又可以解决业务建模中的哪些问题呢?今天我们就通过一家'榨汁机工厂'生产设计'榨汁机'的故事,来聊一聊'闭包'和'原型继承'在业务建模中的作用.现在直播开始: 1> 工厂默认选用A型刀头方案制造榨汁机 例子当中我们主要涉及到2个函数:1.榨汁机的生产工厂(Jui

Js中的防抖与节流

在实际开发中,我们经常需要绑定一些持续触发的事件,如resize.scroll,mousemove,input等,浏览器在默认情况下会对事件处理函数无限制的调用,这样就会加重浏览器的负载,导致用户体验很差,有些还会频繁向后台请求数据,对服务器造成不必要的压力有些情况下我们不需要事件持续触发过程中频繁的去执行事件处理函数,或者更希望把多次计算合并成一次,只操作一个精确点.对此,我们可以采用防抖(debounce)和节流(throttle)的方式来减少调用频率,同时又不影响实际效果. 函数防抖(de

聊聊Javascript中的AOP编程

Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Monkey patch这个词来源于 guerrilla patch,意为在运行中悄悄的改变代码,而 guerrilla 这个词与 gorilla 同音,而后者意又与monkey相近(前者为“猩猩”的意思),最后就演变为了monkey patch. 如果你没有听说过duck punch,但你或许听说过du

聊聊javascript中的面向对象

面向对象这个东西一直晕晕乎乎的,正好这段时间没有活,可以好好整理整理了! 1.什么是对象? 其实这个说起来一切东西都是对象 2.目前我们使用对象的时候,使用的是两种设计模式杂糅起来的 分别是原型模式和构造模式: 原型模式 需要了解的就是原型是什么? 原型:摘录自<javascript高级程序设计> 我自己的理解就是:本来属性 方法都是在构造函数中,但是现在用函数名.prototype{}里面放入属性和方法:这个就是原型对象 之后我们整个过程其实就是创建的实例和原型对象之间的关系,而不是原型对象

聊聊 JavaScript 中的二进制数

事情的起因是这样的最近在业务代码中发现下面这样的一行代码,我看了半天没搞明白是什么意思,不知道聪明的你能不能知道是什么意思呢? !~location.href.search('***') 如果你也不知道,并且也像我一样富有好奇心那么就和我一起来学习这篇文章吧.在本文中你将学到如下知识: 二进制数的表示 js中的二进制数整数 js中的位运算 二进制数 本文假设你知道计算机中用二进制数来存储,计算数字,并且熟悉二进制数的表示方法. 为了实现不同的目的,其实都是为了简化问题,二进制数在计算机中有不同的

JavaScript防抖和节流

JavaScript防抖和节流 问题还原 我们先来通过代码把常见的问题还原: <html> <head> <meta charset="utf-8"> <title>问题演示</title> </head> <body> <script type="text/javascript"> window.onload = function(){ // 没有处理防抖和节流的代码

闲聊前端性能----防抖、节流、重绘与回流。

在最近,小米9卖的特别火,在官方抢购的时候基本都是一点既空.这不禁让我想到了,官网是怎样控制顾客不停点击发起请求而不导致官网崩溃的呢?这由此引出了前端性能的优化中的----防抖和节流.在闲聊完后你就会发现有些时候在抢购商品的时候,你用鼠标在几秒钟不停的按了数十次,或许它仅仅是发送了你第一次点击抢购的那个请求.所以说 抢购时间内的第一次点击尤为关键! 下面来介绍一下什么是防抖!        防抖:任务频繁触发的情况下,只有任务触发的间隔超过制定的时间间隔的时候,任务才会被执行. 下面引用一下知乎

VUE中的函数的防抖和节流 以及应用场景

先看看概念 函数防抖(debounce): 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时:典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时. 应用场景: search搜索联想,用户在不断输入值时,用防抖来节约请求资源. window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次 函数节流(throttle): 规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只有一次生效: