JavaScript——防抖&节流

简介: 防抖和节流是防止高频率触发的事件

防抖和节流是防止高频率触发的事件

防抖,一般用在使用

onresize事件(onresize:当浏览器被重置大小时执行Javascript代码)、

oninput事件:在用户输入时触发。

如果事件进行高频率触发,很可能会导致服务器崩溃

那么就可以使用函数防抖进行优化,比如你乘坐电梯,如果十秒钟之内有人进入或者出去,那么十秒钟就会重新开始计时,直到十秒之内都不在有人流动才会关门

那么节流就不一样了:同样是电梯十秒运作,电梯的机制是当人进入电梯 后,十秒钟内自动关门,这十秒钟内人可以进出,当到了十秒钟后,不管你有没有人进入出去都直接关门,准时运作。

函数节流简单理解

每隔一段时间执行一次

函数防抖简单理解

每当事件触发一次,就会重置定时器,一直到最后一次触发事件,再去执行

防抖一般用于触发input事件

例如:

<body>
    请输入信息:<input type="text">
    <script>
        var input =document.querySelector('input');
        input.oninput = function(){
            console.log('事件被触发');
        }
    </script>
</body>

效果如下:

20210916195224944.gif

我们在输入文字时,每次输入都会发送请求,这样中间的很多东西没有必要给后端,给了的话对服务器的压力非常大,那么在这里可以使用函数防抖来进行优化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text">
    <script>
        var input = document.querySelector('input');
        function debounce(callBack, time) {
            var timer = null;
            return function () {
                if (timer) {
                    clearTimeout(timer)
                }
                timer = setTimeout(callBack,time);
            }
        }
        function fn2() {
            console.log('防抖');
        }
        input.addEventListener('input',debounce(fn2,1000))
    </script>
</body>
</html>
进行优化过后:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>防抖优化</title>
</head>
<body>
    请输入信息:<input type="text">
    <script>
    var processor = {  
    timeoutId: null,
    performProcessing: function() {
    var days = new Date()
    var a= days.getHours();
    var b= days.getMonth();
    var c= days.getSeconds();
    var d= days.getMilliseconds();
    console.log(a+'时'+b+'分'+c+'秒'+d+'毫秒');
    },
    process: function() {
     var that = this;
      clearTimeout(that.timeoutId);    
      that .timeoutId = setTimeout(function() {
        that.performProcessing();
      }, 500)                     //每隔500毫秒后执行,如果中间间隔没到五秒钟还在输入,那么这500毫秒将重新开始计算
    }
  };
  document.querySelector('input').oninput = function() {
    processor.process();
  }
    </script>
</body>
</html>

效果如下图所示:

20210916201313450.gif

节流

原理:规定一个时间,在这个时间段内的所有事件都会一起被执行

一般用于:resize,touchmove移动DOM,上拉列表加载数据等

例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text">
    <script>
        var input = document.querySelector('input');
        function fn1(callback,time){
            var flag = true;
            return function(){
                if (flag) {
                    flag = false;
                    callback();
                    setTimeout(()=>{
                        flag = true
                    },time)
                } 
            }
        }
        function fn2(){
            console.log('节流');
        }
        input.addEventListener('input',fn1(fn2,1000))
    </script>
</body>
</html>

效果为每个一秒节流一次

详情

扩展例子如下:

<body>
    <div>
        加入节流-定时器 & 时间戳:<input type="text" id="throttle"/>
    </div>
    <script>
        window.onload = () => {
            function ajax (data) {
                console.log(new Date().toLocaleTimeString() + ' - ' + data)
            }
            function throttle(fn, delay) {
                let last
                return args => {        
                    let now = Date.now()
                    if (last && now < last + delay) {      
                        clearTimeout(fn.id)
                        fn.id = setTimeout(() => {
                            fn.call(this, args)
                            last = now
                        }, delay)
                    } else {
                        fn.call(this, args)
                        last = now
                    }
                }
            }
            const throttleAjax = throttle(ajax, 1000)
            document.querySelector('#throttle').addEventListener('keyup', e => {
                throttleAjax(e.target.value)
            })
        }
    </script>
</body>

20210916204541944.png




相关文章
|
2月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
104 57
|
5月前
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
61 3
|
21天前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
25 1
|
5月前
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
53 1
|
2月前
|
JavaScript 前端开发
js防抖函数返回值问题解决方案
本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。
25 1
|
3月前
|
JavaScript 前端开发 UED
JS 防抖与节流
防抖和节流是优化高频事件处理的技术。针对如`scroll`、`resize`等频繁触发的事件,它们能有效减少不必要的回调执行,节省资源。防抖确保在一段时间内仅执行最后一次操作,适用于输入框自动补全等场景;而节流则按固定间隔执行函数,适合拖拽、滚动事件。通过简单的JavaScript实现,可以显著提升应用性能和用户体验。
33 1
JS 防抖与节流
|
6月前
|
JavaScript 前端开发 UED
js的防抖节流
js的防抖节流
35 1
|
6月前
|
JavaScript 前端开发 UED
js的节流
js的节流
32 0
|
6月前
|
测试技术
js_防抖与节流(闭包的使用)
js_防抖与节流(闭包的使用)
42 0
|
6月前
|
JavaScript
JS中防抖和节流的区别是什么
JS中防抖和节流的区别是什么
45 0