JS防抖与节流(含实例各二种写法 介绍原理)

news2024/9/30 3:28:26

防抖

防抖是什么?
单位时间内,频繁触发事件,只执行最后一次
通俗易懂点就是把防抖想象成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++
        }
    }

请添加图片描述
感谢大家的阅读,本人文笔有限,如有不对的地方,可以向我提出,感谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美摄AI商品图解决方案

电子商务时代&#xff0c;商品图片的质量直接影响着消费者的购买决策。一张高质量的商品图片不仅能够吸引消费者的注意力&#xff0c;还能够提升品牌形象&#xff0c;从而提高销售额。然而&#xff0c;拍摄高质量的商品图片并不是一件容易的事情&#xff0c;它需要专业的摄影技…

C语言KR圣经笔记 2.7类型转换

2.7 类型转换 当一个操作符有几个不同类型的操作数时&#xff0c;会根据少量规则将几个操作数转换为一个公共的类型。 通常来说&#xff0c;仅有的自动转换&#xff0c;是在不丢失信息的情况下将“窄”的操作数转换为“宽”的类型&#xff0c;例如在 表达式 f i 中将整数转换…

如何用.bat文件直接安装jar包

大家应该都知道一个maven引入jar包&#xff0c;如果直接把jar包放到目录&#xff0c;这样是没用的&#xff0c;引入还是会失败 这里我们可以创建一个.bat的windows系统文件&#xff0c;写入pom.xml对应的groupid&#xff0c;artifactId&#xff0c;version pom.xml中进入jar包…

深入理解数据结构(2)——用数组实现队列

数组是一种数据结构&#xff0c;队列也是一种数据结构。它们都是由基础的语法实现的。 如果一个数据结构可以用另外的数据结构来实现&#xff0c;那么可以有力的证明——“数据结构是一种思想”&#xff0c;是一种讲语法组合起来实现某种功能的手段 “整体大于局部” 一、队列的…

大模型相关概念

GGML 以纯C语言编写的框架&#xff0c;让用户可以在MacBook电脑上轻松运行大型语言模型&#xff0c;这种模型通常在本地运行成本较高。目前&#xff0c;这一框架主要被业余爱好者使用&#xff0c;但在企业模型部署方面也有广泛的应用前景。 量化快速入门 我们首先简单介绍一下…

原生JavaScript实现的SPA单页应用(hash路由)

什么叫做SPA单页应用 单页Web应用 &#xff08;single page web application&#xff0c;SPA&#xff09; &#xff0c;就是只有一张Web页面的应用&#xff0c;是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。 单页应用的说法是在JavaScript和AJA…

超写实数字人小灿加入,助力火山语音全类型虚拟数字人应用创新

当发现更多AI科技作用于日常生活时&#xff0c;你是否想过竟然有一天会与AI数字人做同事&#xff1f;日前&#xff0c;火山语音团队重磅推出了一位神秘新成员——首个超写实数字员工小灿&#xff01;这位新同事不仅形象清新美丽&#xff0c;还有着很强的亲和力&#xff0c;大幅…

ardupilot开发 --- CAN BUS、DroneCAN 、UAVCAN 篇

1. CAN BUS、DroneCAN 、UAVCAN 区别 UAVCAN是一种轻量级协议&#xff0c;旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络&#xff0c;其中每个对等体&#xff08;节点&#xff09;具有唯一的数字标识符 - 节点ID&#xff0c;并且仅需要…

minio + linux + docker + spring boot实现文件上传与下载

minio docker spring boot实现文件上传与下载 1.在linux上安装并启动docker2.在docker中拉取minio并启动3.Spring Boot 整合 minio4.测试 minio 文件上传、下载及图片预览等功能 1.在linux上安装并启动docker 检查linux内核&#xff0c;必须是3.10以上 uname ‐r安装docker…

没有电脑也不用担心,在Android设备上也可以轻松使用ppt

PowerPoint是制作幻灯片的好工具&#xff0c;无论是工作、学校还是个人使用。但有时你无法使用电脑或笔记本电脑&#xff0c;你必须在旅途中做演示。 这就是PowerPoint for Android派上用场的地方。它允许你在移动设备上创建、编辑和呈现幻灯片。以下是要遵循的步骤&#xff1…

[每周一更]-(第69期):特殊及面试的GIT问题解析

整合代码使用过程的问题&#xff0c;以及面试遇到的细节&#xff0c;汇总一些常用命令的对比解释和对比&#xff1b; 1、fetch和pull区别 git fetch是将远程主机的最新内容拉到本地&#xff0c;用户在检查了以后决定是否合并到工作本机分支中。 git pull则是将远程主机的最新内…

unity button移动位置some values driven by canvas

1 可以在button父节点把限制取消勾选 2 在不动整个布局的情况下&#xff0c;只修改局部变量&#xff1a;忽略布局即可

Instagram引流技巧:如何充分利用社交媒体来增加独立站流量

在数字时代&#xff0c;社交媒体已成为推广产品、服务和内容的重要工具之一。Instagram&#xff0c;作为其中之一&#xff0c;以其视觉化特点和庞大的用户基础&#xff0c;为独立站和个人品牌提供了难得的机会。本文Nox聚星将和大家探讨如何充分利用Instagram&#xff0c;将其作…

【从瀑布模式到水母模式】ChatGPT如何赋能软件研发全流程

文章目录 &#x1f384;前言&#x1f354;本书概要&#x1f33a;内容简介&#x1f33a;作者简介&#x1f33a;专家推荐&#x1f6f8;读者对象&#x1f354;彩蛋 &#x1f384;前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地…

2核4G服务器 如何设计编码一款扛得住高并发高吞吐量的商品秒杀系统

题目 最近要参加一个秒杀商品系统比赛 【题目】设计并演示一款商品秒杀系统 【要求】设计并实现程序&#xff0c;模拟该商品秒杀系统的基本功能包括但不限于&#xff1a; 1.商品管理&#xff1a;每个商品都有唯一的ID、名称、库存数量和秒杀价格。 2.用户管理&#xff1a;每个…

MyBatis 基础用法详解

目录 什么是MyBatis 前置工作 创建MyBatis项目 MyBatis的使用 1.查询 1.1全查询 1.2传参查询 2.删除 3.修改 4.添加 什么是MyBatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设…

使用Python实现一个简单的斗地主发牌

使用Python实现一个简单的斗地主发牌 1.源代码实现2.实现效果 1.源代码实现 import random# 定义扑克牌的花色和大小 suits [♠, ♥, ♣, ♦] ranks [2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A]# 初始化一副扑克牌 deck [suit rank for suit in suits for rank in ranks]# …

怎么用Python写一个浏览器集群框架

这是做什么用的 框架用途 在采集大量新闻网站时&#xff0c;不可避免的遇到动态加载的网站&#xff0c;这给配模版的人增加了很大难度。本来配静态网站只需要两个技能点&#xff1a;xpath和正则&#xff0c;如果是动态网站的还得抓包&#xff0c;遇到加密的还得js逆向。 所以…

ChatGPT如何赋能探究深度学习、神经网络与卷积神经网络

计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不断地影响和改变着各个行业。 如今&#xff0c;我们正在见证人工智能技术…

【Overload游戏引擎细节分析】PBR材质Shader

PBR基于物理的渲染可以实现更加真实的效果&#xff0c;其Shader值得分析一下。但PBR需要较多的基础知识&#xff0c;不适合不会OpenGL的朋友。 一、PBR理论 PBR指基于物理的渲染&#xff0c;其理论较多&#xff0c;需要的基础知识也较多&#xff0c;我在这就不再写一遍了&#…