javaScript_防抖与节流

简介: javaScript_防抖与节流

防抖事件

定义:持续触发事件,一定时间内没有触发事件,事件处理函数只会执行一次,
当设定的时间内触发过一次事件后会重新开始延时。
例:输入框的事件(2s显示内容,不是实时刷新显示内容),对比输入框的内容事件。
实时刷新的效果

        <div class="container">
            <div class="left">
                <p>实时刷新显示内容</p>
                <input type="text" id="leftInput" />
                <div class='textDiv' id="textShow"></div>
            </div>

            <div class="right"></div>
        </div>
        <script>
            var inputDom=document.getElementById('leftInput');
            inputDom.addEventListener('keyup',function(e){
    
    
                var textDom=document.getElementById('textShow');
                console.log(e.target.value);
                textDom.innerText=e.target.value;
            })    
        </script>

输入123456会依次打印123456的金字塔
image.png

防抖(1s内显示输入内容)

        <div class="container">
            <div class="left">
                <p>防抖(1s内显示输入内容)</p>
                <input type="text" id="leftInput" />
                <div class='textDiv' id="textShow"></div>
            </div>

            <div class="right"></div>
        </div>
        <script>
            // 防抖
            var inputDom = document.getElementById('leftInput');
            // 函数柯里化
            function debounce(delay, callback) {
    
    
                let timer
                return function(value) {
    
    
                    //闭包内存泄漏
                    clearTimeout(timer)
                    timer = setTimeout(function() {
    
    
                        //执行
                        callback(value)
                    }, delay)
                }
            }
            // 显示内容的函数
            function showText(value) {
    
    
                var textDom = document.getElementById('textShow');
                console.log(value)
                textDom.innerText = value;
            }
            var debounceFunc = debounce(1000, showText);
            inputDom.addEventListener('keyup', function(e) {
    
    
                let value = e.target.value
                debounceFunc(value)
            })
        </script>

1s内输入123456只会打印一次123456
image.png

节流事件

定义:一段时间直只调用一次事件处理函数
实际用例:提交事件 、游戏的技能cd(在游戏cd中点击n次都不会发动技能)

// 节流
            var skillDom = document.getElementById('skillTriger');
            function throttle(wait,callback) {
                let timeOut;
                return function(value) {
                    if (!timeOut) {
                        timeOut = setTimeout(function() {
                            callback(value);
                            //执行一次,时间段内的都不知执行
                            timeOut = null;
                        }, wait)
                    }
                }
            }
            function skillEvent(value){
                var textDom = document.getElementById('skillEventId');
                console.log(value)
                ++count
                textDom.innerText = value+count;
            }
            var skillAc=throttle(3000,skillEvent)
            var count=0
            skillDom.addEventListener('click', function(e) {
                let value = e.target.value
                skillAc(value)
            })

在这里插入图片描述

完整的html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>防抖与节流</title>
    </head>
    <style>
        * {
    
    
            margin: 0;
            padding: 0;
        }

        .container {
    
    
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 600px;
            height: 400px;
            background: #262626;
            display: flex;
        }

        .left {
    
    
            position: relative;
            width: 50%;
            height: 100%;
            background: #00cec9;
            box-sizing: border-box;
            overflow: hidden;

        }

        .right {
    
    
            position: relative;
            width: 50%;
            height: 100%;
            background: #b2bec3;
        }
    </style>
    <body>
        <div class="container">
            <div class="left">
                <p>防抖(1s内显示输入内容)</p>
                <input type="text" id="leftInput" />
                <div class='textDiv' id="textShow"></div>
            </div>

            <div class="right">
                <p>节流(3s内触发一次)</p>
                <input type="submit" id="skillTriger" value="发动技能" />
                <div class='skillEvent' id="skillEventId"></div>
            </div>
        </div>
        <script>
            // 防抖
            var inputDom = document.getElementById('leftInput');
            // 函数柯里化
            function debounce(delay, callback) {
    
    
                let timer
                return function(value) {
    
    
                    //闭包内存泄漏
                    clearTimeout(timer)
                    timer = setTimeout(function() {
    
    
                        //执行
                        callback(value)
                    }, delay)
                }
            }
            // 显示内容的函数
            function showText(value) {
    
    
                var textDom = document.getElementById('textShow');
                console.log(value)
                textDom.innerText = value;
            }
            var debounceFunc = debounce(1000, showText);
            inputDom.addEventListener('keyup', function(e) {
    
    
                let value = e.target.value
                debounceFunc(value)
            })

            // 节流
            var skillDom = document.getElementById('skillTriger');

            function throttle(wait, callback) {
    
    
                let timeOut;
                return function(value) {
    
    
                    if (!timeOut) {
    
    
                        timeOut = setTimeout(function() {
    
    
                            callback(value);
                            //执行一次,时间段内的都不知执行
                            timeOut = null;
                        }, wait)
                    }
                }
            }

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