JavaScript防抖和节流

防抖节流的简单实现 文章目录前言一、防抖测试二、节流测试三、防抖的业务场景:四、节流的业务场景 前言 防抖debounce,好比坐电梯,进来一个人,就得多等几秒。 节流throttle,好比等红绿灯,时间一到,就过一批人。时间没到多来一个人也不影响。 HTML+CSS <h2>防抖</h2> <div id="div1">0</div> <p></p> <h2>节流</h2> <div id="div2 阅读详情

防抖和节流都是优化的方式,经常听见却又不是特别清楚,查阅资料和写一些代码后写篇推文来记录一下

防抖


理解概念

防抖的简单理解为在短时间内多次触发一个操作(执行某个函数),只触发最后一次操作,这里的短时间是自己定义的。这样的好处在于短时间内多次触发同一函数可能只有一次是需要的,就如在搜索框输入内容时自动匹配相似的内容,如果按下每个按键就触发一次,未免有些低效率。

例子

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>防抖</title>
</head>

<body>
    <button id="norBtn">普通</button>
    <button id="antBtn">防抖</button>
    <script>
        window.onload = function() {
            let norBtn = document.getElementById("norBtn");
            norBtn.addEventListener("click", normal);
            let antBtn = document.getElementById("antBtn");
            antBtn.addEventListener("click", antiShake(anti, 500));
        }

        function antiShake(fn, time) {
            let timer = null;
            return function() {
                clearTimeout(timer);
                timer = setTimeout(() => {
                    fn.apply(this, arguments);
                }, time);
            }
        }

        function normal() {
            console.log("normal");
        }

        function anti() {
            console.log("anti");
        }
    </script>
</body>

</html>

这里的防抖实现是通过使用定时器,让函数隔一个相对短的时间后执行,如果在这个等待时间内重复点击该按钮,则会重置等待时间,最后只有最后一次触发是执行了函数的。

可以对上面两个按钮分别尝试短时间内多次点击,可以发现普通按钮在控制台打印的次数和点击的次数相同,而防抖按钮,如果每两次点击间隔小于指定时间,最后只会打印出一次。

应用

假设我们要做一个简单的二进制转换器,当在一个输入框内输入数字时输出对应的二进制数,我们要在数字输入完成后再进行输出,又不想通过点击来使其输出,那么就可以使用防抖来减少调用二进制转换函数的次数。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>转换二进制</title>
</head>

<body>
    <input type="text" id="enter">
    <p id="out"></p>
    <script>
        window.onload = function() {
            let enter = document.getElementById('enter');
            enter.addEventListener('keydown', antiShake(toBinary, 500));
        }

        function toBinary() {
            let num = document.getElementById('enter').value;
            let arr = [];
            let out = document.getElementById('out');
            if (num == 1) {
                arr[0] = 1;
            } else {
                while (num != 0) {
                    let tmp = num % 2;
                    arr.push(tmp);
                    num = (num - tmp) / 2;
                }
            }
            out.innerHTML = arr.reverse().join("");
        }

        function antiShake(fn, time) {
            let timer = null;
            return function() {
                clearTimeout(timer);
                timer = setTimeout(() => {
                    fn.apply(this, arguments);
                }, time);
            }
        }
    </script>
</body>

</html>

在这里,如果输入够快,就不会去计算输入过程中数字的二进制转换,而是等到停下来之后过了一个自定义的时间才会进行二进制转换的计算,所以这样子可以减少计算所需。

虽然在这里看似没有减少多少,但在一些需要较为大型计算的地方,使用防抖就十分高效了,如上面说的在搜索引擎输入内容匹配对应近似的内容。

节流


理解概念

节流简单来说就是在一个固定的时间间隔内只会执行一次,如果在一个长时间内快速触发一个节流的事件,就像是以设置的固定时间为循环时间来执行一个循环事件。

例子

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>节流</title>
</head>

<body>
    <button id="norBtn">普通</button>
    <button id="refBtn">节流</button>
    <script>
        window.onload = function() {
            let norBtn = document.getElementById('norBtn');
            let refBtn = document.getElementById('refBtn');
            norBtn.addEventListener('click', normal);
            refBtn.addEventListener('click', reduceFlow(ref, 1000));
        }

        function reduceFlow(fn, time) {
            let flag = true;
            return function() {
                if (flag) {
                    flag = false;
                    setTimeout(() => {
                        fn.apply(this, arguments);
                        flag = true;
                    }, time);
                }
            }
        }

        function normal() {
            console.log("normal");
        }

        function ref() {
            console.log("ref");
        }
    </script>
</body>

</html>

使用上面的代码可以实现节流,但是针对一些情况,这个节流还要做一些优化,比如我们节流常用的场景,滑动监听,我们每隔一小段时间触发一次真正的视图渲染,但是可能存在一种情况,当我们触发了最后一次,但是还滑动了一小段位置,而在滑动这小段位置时,因为flag为false,所以即使时间到了,也不会去触发该视图渲染,所以做多了以下处理

function reduceFlow(fn,time){
    let flag = true
    let temp
    return function(){
        if(flag){
            flag = false
            setTimeout(()=>{
                fn.apply(this,arguments)
                flag = true
				temp&&temp()
            },time)
        }else{
            temp = fn.bind(this,...arguments)
        }
    }
}

 

js节流和防抖别看这一篇   前言:我们在做页面事件绑定的时候,经常要进行节流处理,比如鼠标异步点击,去执行一个异步请求时,需要让它在上一次没执行时不能再点击,又或者绑定滚动事件,这种持续触发进行dom判断的时候,就要按一定频率的执行。 一、 伪理论:      概念: 节流和防抖我认为都可以称之为节流。区别:防抖就是不想持续操作的节流,节流就是想固定频率执行的。  节流:函数节流是指一定时间内js方法只跑一次。前一次... 阅读详情

相关推荐

JS防抖和节流(详解)

函数节流(throttle)与函数防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

Zhang_wang_yun的博客 5244

防抖和节流

在进入学习之前,先想一件事情:从哪听说的这俩名词? 我想大部分人应该是在编程中遇到问题后听他人说的。我希望看完这篇博客后能帮你解决实际问题,不只玩玩而已。 简单来说,防抖与节流是为了优化性能,提升用户体验的。 实现原理都是延迟执行,减少调用次数。 不同的是,对于一段时间内的频繁调用,防抖是延迟执行后一次调用,节流是延迟定时多次调用。 使用场景:一般为存在用户交互,需要监听DOM元素时。 下面我们模拟场景,带你学透防抖与节流 防抖 模拟场景:一个搜索输入框,在输入后立即(实时)展现搜索结

KEEP RUNNING的博客 3246

【上海大学计算机组成原理实验报告】六、内存系统实验

学习内存访问机制//理解代码和数据的分区存放原理和技术//手动方式把立即数`33H`写入内存`D1H`单元//手动方式把`D1H`单元的内容读出,再送入`ST`单元//在`CP226`汇编语言程序集成开发环境下编写程序//既然有`ORG`微指令,为什么集成开发环境下载到实验箱的目标程序的第一条执行语句最好存放在0号地址?//上海大学计算机组成原理实验//内存系统实验

HackerKevon的博客 3128

v-model --双向数据绑定

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-...

qq_45802159的博客 3516

unity中VideoPlayer播放视频,使用Shader除去黑底且无黑边

1. 创建一个Shader 和 一个 材质球;Shader中复制如下代码:(此Shader代码为“ChromaKeyKit”插件中的ChromaKey_Alpa_Genera代码,但因只需要除去视频黑底而挂一个插件有点不合适) // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "ChromaKeyKit/ChromaKey/ChromaKey_Alpha_General"

weixin_42065078的博客 1747

Navcat最新版的激活和安装教程(全网最靠谱,最快捷的方式)

现在最新版本navcat已经出到了16.3了,并且新版navcat也支持连接redis和图标等更多样化的功能,但是比较头疼的一件事就是,只能试用14天。那么接下来小编教大家如何用最简单的方式使用最新版navcat16.

weixin_50737119的博客 2万+

antd select 模糊搜索节流

import { debounce } from 'lodash'; //debounce 关键字 getMasterWorkerInfoFUN = debounce(value => { const { initParam } = this.state; initParam.fteacherJobNo = value; getMasterWorkerInfo(initParam); }, 500);

weixin_42327537的博客 867

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程

OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成

weixin_30582943的博客 383

3秒防重复提交!Ant Design表单防抖与节流实战指南

你是否遇到过用户疯狂点击提交按钮导致的表单重复提交问题?或者实时搜索时输入框频繁触发接口请求导致的性能瓶颈?作为企业级UI组件库,Ant Design提供了完善的表单控制方案,但90%的开发者都没充分利用其内置的防抖与节流能力。本文将通过3个实战场景,教你用**20行代码**彻底解决表单提交的性能与数据一致性问题。 读完本文你将掌握: - 3种表单高频触发场景的优化方案 - Ant Design...

gitblog_00747的博客 1028

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

爱快路由(ikuai)多WAN口配置实战:提升网络带宽与稳定性

本文详细解析了爱快路由(ikuai)多WAN口配置的实战技巧,包括双线智能分流、毫秒级故障切换和带宽叠加利用等核心功能。通过七种配置方案和智能QoS策略,帮助企业提升网络带宽与稳定性,实现99.9%以上的高可用性。

weixin_30566063的博客 700

JS | JavaScript函数防抖和节流全解析

防抖和节流本质上是优化高频率执行代码的一种手段,如:浏览器的 resize、scroll、keypress、mousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce)和 节流(throttle)的方式来减少调用频率。节流——n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效。防抖——n 秒后再执行该事件,若在 n 秒内被重复触发,则重新计时.........

青春木鱼的博客 3213

数字电路逻辑与设计实验三 译码器和数据选择器

1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不

欢迎交流学习心得 3085

语音机器人为何仍需STM32?MCU在实时控制与低功耗中的关键角色

在嵌入式系统开发中,MCU与SoC的协同分工是提升实时性与可靠性的核心。STM32作为微控制器,凭借精确的定时器、中断管理和低功耗模式,负责舵机控制、灯效驱动、电源管理等实时任务,而上位机专注语音识别与大模型计算。这种架构在语音交互机器人、智能硬件及基于STM32的毕业设计中广泛应用,能有效解决Linux调度延迟和功耗问题。本文深入剖析STM32在语音机器人中的真实分工与工程实践,帮助开发者掌握MCU选型与系统设计要点。

weixin_34160277的博客 406

STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与以W5500通信,驱动以太网模块。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): W5500以太网模块 这里我使用常见的以太网模块W5500: W5500官网 http://www.w5500.cn/ W5500中文手册 iEthernet W5500 Datasheet 软件准备 需要安装好Keil - MDK及芯片对应的包,以

Mculover666的博客(嵌入式) 7387

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Javascript函数防抖与节流的理解以及在vue和原生js中的使用

防抖和节流的目的都是为了减少不必要的计算,不浪费资源,只在适合的时候再进行触发计算。 一、函数防抖(debounce) 1.定义: 事件触发停止一定时间后才会执行响应的函数,期间如果重复调用动作,重新计算时间。类似于,按下一个弹簧,只有你松手的时候弹簧才会弹起。本质上是将多次操作合并为一次操作。可用一个定时器维护,事件触发后wait时间内如果事件重复触发,那么取消当前定时器,重新设置一个时延为wa...

前端李小白的博客 583

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JavaScript防抖与节流

是一种。

2301_82023822的博客 5047

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JS-详细的防抖和节流

1、防抖和节流 防抖 节流 概念 短时间频繁触发同一事件,只会执行一次函数 函数每隔一段时间只会执行一次 实现原理 设置一个计时器,约定在XX毫秒后再触发事件处理,每次触发事件都会重新设置计时器,直到XX毫秒内无第二次操作 设置一个计时器,约定XX毫秒后执行事件,如果时间到了,就执行函数,并重置计时器 应用场景 搜索框/滚动条的监听事件处理等。如果不做防抖,每输入一个字/滚动屏幕,都会触发事件处理,造成性能浪费 窗口调整,页面滚动,抢购疯狂..

huohuoit的博客 745

js 防抖 节流 JavaScript

js 防抖 节流 JavaScript 实际工作中,通过监听某些事件,如scroll事件检测滚动位置,根据滚动位置显示返回顶部按钮;如resize事件,对某些自适应页面调整DOM的渲染;如keyup事件,监听文字输入并调用接口进行模糊匹配等等,这些事件处理函数调用的频率如果太高,会加重浏览器的负担,减弱性能,造成用户体验不好。此时需要采用debounce(防抖)和throttle(节流)的方式来减...

weixin_34311757的博客 144

JS 防抖与节流

再比如监听输入框的输入,不应每次输入框内容变化都触发监听,应该是用户完成一段输入后再进行触发。事件会一直等到用户完成操作后一段时间在操作,如果一直操作,会一直不触发。比如说是一个按钮,点击就发送请求,如果一直点,那么请求就会一直发布出去。,保证在特定时间内至少执行一次,无论事件触发频率如何。节流就是减少流量,将频繁触发的事件减少,并每隔一段时间执行。这种结合方式综合了时间戳和定时器的优点,既能保证在开始时立即执行函数,又能在后续按照固定时间间隔执行。:事件触发之后,执行操作,然后设置一个定时器,在。

weixin_62971133的博客 1598

JavaScript 中节流和防抖技术详解

以游戏中的技能释放为例,许多技能都设有冷却时间,在冷却时间内,玩家多次点击技能按钮是不会产生额外效果的,只有当冷却时间结束后,才能再次释放技能,这便是节流技术在实际应用中的典型案例。比如在玩英雄联盟(LOL)游戏时,点击回城按钮后会有一段等待时间,在这段时间内,玩家重复点击回城按钮并不会产生额外的响应,只有等待时间结束,回城操作才会完成,这就是节流技术在游戏场景中的具体应用。节流和防抖技术应运而生,它们的核心目标就是对函数的执行频次进行有效限制,以此来优化程序性能,为用户带来更流畅的交互体验。

奋斗的小前端 1754

JavaScript实现防抖和节流

JavaScript实现防抖和节流

weixin_51422386的博客 2634

JS进阶10 -- 防抖和节流

一文教你如何拿捏住前端防抖与节流,各自的适用场景和手写方法以及二者区别,全部cover!

qq_44581775的博客 1203

JS防抖和节流

在浏览器进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。

linfeng_meng的博客 700
上一篇: node.js学习笔记(二)模块的调用
下一篇: typescript基础知识(一)基本类型
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值