JS防抖与节流

简介: JS防抖与节流

防抖

防抖是什么?

单位时间内,频繁触发事件,只执行最后一次

通俗易懂点就是把防抖想象成MOBA游戏的回城,在回城过程中被打断就要重来

例子:我们来做一个效果,我们鼠标在盒子上移动,数字就变化 +1

基础样式代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 200px;
            height: 200px;
            background-color: red;
            margin: 100px auto;
            text-align: center;
            line-height: 200px;
            font-size: 30px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

接下来我们来实现这个效果

没防抖时:

// 获取盒子
    const box = document.querySelector(".box")
    // 定义一个num控制数字
    let i = 0
    // 设置鼠标移动事件
    box.onmousemove = function() {
        // 移动就+1
        box.innerHTML = i++
    }

如图所示,我们鼠标移动,数字不停的+1

我们使用防抖的方式写,这里介绍2种方式

第一种 先执行

// 获取盒子
    const box = document.querySelector(".box")
    // 控制数字
    var num = 1
    // 存一个延迟器 关键 
    let timer //undefined
    // setInterval(() => {
    //     console.log(typeof timer) //大家可以实验一下可以更了解原理
    // }, 1000)
    box.onmousemove = function () {
        let obj = timer //第一次是undefined
        // 移动就清除定时器
        clearTimeout(timer)
        // 当鼠标不在移动时执行延迟器 1s后执行
        timer = setTimeout(() => {
            // 给timer传一个空 空就赋值给了全局作用域种的timer
            // 只有当鼠标移动时 全局作用域timer赋值给了obj
            timer = null
        }, 1000)
        // 一移入就判断
        // 第一次obj是undefined 所以一移入就 +1
        // 第二次我鼠标停止不动 timer=null 就赋值给了全局的timer
        // 只有移动才触发全局的timer赋值给 obj 所以 +1
        if (!obj) {
            // num++
            box.innerHTML = num++
        }
    }

第二种 后执行

// 获取盒子
    const box = document.querySelector(".box")
    // 控制数字
    var num = 1
    // 存一个延迟器
    let timer 
    box.onmousemove = function () {
        // 鼠标移动就清除延迟器
        clearTimeout(timer)
        // 鼠标停止时 1s +1 
        // 继续移动停止 1s +1
        // 只有移动了才会触发
        timer = setTimeout(() => {
            box.innerHTML = num++
        }, 1000)
    }

节流

节流是什么?

节流是单位时间内,频繁触发事件,只执行一次

通俗易懂点就是把防抖想象成MOBA游戏中角色的技能,在技能冷却时间内,技能无法释放,只有冷却结束才可以继续释放

使用场景:

高频事件: 鼠标移动 mousemove、页面尺寸缩放 resize 、滚动条滚动 scroll 等等

例子:与上面防抖例子一样 样式也一样 我们来使用节流处理数字

介绍二种写法

第一种 延迟器

// 获取盒子
    const box = document.querySelector(".box")
    // 控制数字
    let num = 1
    // 存延迟器
    let timer
    // 绑定鼠标移动事件
    box.onmousemove = function () {
        // 移动就判断 不移动就一直不进入判断
        // 第一次移动timer 为undefined 
        // 第一次为undefined !undefined为true 执行
        if (!timer) {
            timer = setTimeout(() => {
                // 1s之后 null赋值给timer 现在全局里的timer为null
                timer = null
                // 1s后 num++
                box.innerHTML = num++
            }, 1000)
        }
    }

第二种 时间戳

// 获取盒子
    const box = document.querySelector(".box")
    // 控制数字
    let num = 1
    // 控制时间
    var timeNew = 0;
    // 绑定鼠标移动事件
    box.onmousemove = function () {
        // 获取时间戳
        let timeOld = Date.now()
        // 判断如果老时间戳 - 新时间戳 大于了 1000 就执行
        if (timeOld - timeNew > 1000) {
            // 大于了就把老时间戳赋值给新时间戳
            // 这样就可以控制住时间
            timeNew = timeOld
            // 大于就++
            box.innerHTML = num++
        }
    }

感谢大家的阅读,本人文笔有限,如有不对的地方,可以向我提出,感谢大家!

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