JS防抖和节流函数

news2024/9/24 8:03:33

节流和防抖函数的定义

  1. 防抖:只有在最后一次事件发生后的一定时间间隔内没有新的事件触发时,才执行相应的处理函数。
  2. 节流:在规定的时间间隔内最多只能执行一次相应的处理函数。

效果图

  • 示例图
    请添加图片描述

  • 示例图运行结果如下:
    请添加图片描述

代码

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover" />
    <title>JS防抖和节流函数</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .container {
            padding: 40px 16px 0;
            box-sizing: border-box;

        }

        h2 {
            text-align: center;
            margin: 20px 0 40px;
        }

        p {
            font-size: 15px;
            line-height: 24px;
        }

        .keynote {
            font-weight: 600;
            color: #00bfc6;
        }

        .line {
            padding: 10px 0;
            box-sizing: border-box;
        }

        /* 通用样式,增加一些内边距和字体样式 */
        input,
        button {
            padding: 10px 20px;
            font-size: 16px;
            font-family: Arial, sans-serif;
            border: none;
            /* 移除默认边框 */
            outline: none;
            /* 移除焦点时的轮廓线 */
            cursor: pointer;
            /* 鼠标悬停时显示手指形状,仅对button有效 */
        }

        #input {
            border: 1px solid #bbb;
            border-radius: 5px;
            transition: border-color 0.3s;
            margin-top: 40px;
        }

        #input:focus {
            border-color: #00bfc6;
        }

        #btn {
            background-color: #00bfc6;
            color: white;
            border-radius: 5px;
            transition: background-color 0.3s;
            height: 40px;
            line-height: 40px;
            padding-top: 0;
            padding-bottom: 0;
        }

        #btn:hover {
            background-color: #26e4eb;
        }
    </style>
</head>

<body>
    <div class="container">
        <h2>JS防抖和节流函数演示案例</h2>
        <div class="desc">
            <h3>1. 防抖</h3>
            <P class="keynote">只有在最后一次事件发生后的一定时间间隔内没有新的事件触发时,才执行相应的处理函数。</P>
            <p>例如:案例中的<b>输入框</b>,输入文字停止后一定时间之后才执行调接口的函数。</p>
            <div class="line"></div>
            <h3>1. 节流</h3>
            <P class="keynote">在规定的时间间隔内最多只能执行一次相应的处理函数。</P>
            <p>例如:案例中的<b>提交按钮</b>,1s内点击3次、4次,最后也只会触发一次提交的函数。</p>
        </div>
        <input id="input" type="text" placeholder="输入内容...">
        <button id="btn">提交</button>
    </div>
    <script>
        /**  
         * 防抖函数  
         * @param {Function} func 需要防抖的函数  
         * @param {number} wait 等待时间,单位毫秒  
         * @param {boolean} immediate 是否立即执行  
         * @return {Function} 返回防抖后的函数  
         */
        function debounce(func, wait, immediate = false) {
            let timeout;
            // 返回一个函数,这个函数会在一个时间间隔后执行  
            return function () {
                const context = this;
                const args = arguments;

                // 如果已经设置了延时器,则清除它  
                if (timeout !== undefined) {
                    clearTimeout(timeout);
                }

                if (immediate && !timeout) {
                    // 如果设置为立即执行,并且没有延时器,则直接执行函数  
                    func.apply(context, args);
                }

                // 否则,设置延时器,在指定时间后执行函数  
                timeout = setTimeout(() => {
                    timeout = undefined; // 清除延时器标识  
                    if (!immediate) {
                        func.apply(context, args);
                    }
                }, wait);
            };
        }
        /**  
        * 节流函数  
        * @param {Function} func 需要节流的函数  
        * @param {number} wait 等待时间,单位为毫秒  
        * @returns {Function} 返回一个新的函数,这个函数会在一个时间间隔内最多执行一次func  
        */
        function throttle(func, wait) {
            let lastRan = 0; // 上次执行时间
            let timeout; // 定时器
            return function () {
                const context = this;
                const args = arguments;
                const now = Date.now();
                // 如果当前时间与上次执行时间之差大于等待时间,或者还没有执行过
                if (!lastRan || (now - lastRan >= wait)) {
                    // 清除之前的定时器(如果有的话)
                    if (timeout) clearTimeout(timeout);
                    // 执行函数
                    func.apply(context, args);
                    // 更新上次执行时间
                    lastRan = now;
                } else if (!timeout) {
                    // 如果还没有设置定时器,则设置一个定时器在wait时间后执行
                    timeout = setTimeout(function () {
                        // 清除定时器引用
                        timeout = null;
                    }, wait - (now - lastRan));
                }
            };
        }
    </script>
    <script>
        // 防抖函数使用 - 开始
        const input = document.getElementById('input')
        const fn = debounce(getApi, 1000, false)
        input.addEventListener('input', () => {
            console.log('输入中');
            fn()
        })

        function getApi() {
            console.log('调用接口请求数据');
        }
        // 防抖函数使用 - 结束

        // 节流函数使用 - 开始
        const btn = document.getElementById('btn')
        const fn1 = throttle(handleSubmit, 1000)
        btn.addEventListener('click', () => {
            console.log('点击按钮');
            fn1()
        })
        function handleSubmit() {
            console.log('提交');
        }
        // 节流函数使用 - 结束
    </script>
</body>

</html>

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

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

相关文章

远程升级,你成功了吗?

最近又遇到了远程升级失败的情况&#xff0c;而且是不明原因的多次接连失败。。。 事情是这样的&#xff1a;最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试&#xff0c;发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况&#xf…

【深度学习】03-神经网络3-1梯度下降网络优化方法

每一条线是一个权重&#xff0c;每个神经元由一个加权和还有一个 激活函数组成。每一层可以理解是一个函数&#xff0c;最终形成一个复合函数&#xff0c;因此求梯度的时候&#xff0c;是一层一层的求解&#xff0c;所以叫做反向传播。 只会考虑当前数据之前的数据&#xff0c;…

潮玩宇宙大逃杀宝石游戏搭建开发

潮玩宇宙大逃杀的开发主要涉及以下方面&#xff1a; 1. 游戏概念和设计&#xff1a; 核心概念定义&#xff1a;确定以潮玩为主题的宇宙背景、游戏的基本规则和目标。例如&#xff0c;玩家在宇宙场景中参与大逃杀竞技&#xff0c;目标是成为最后存活的玩家。 玩法模式设计&a…

k8s上安装prometheus

一、下载对应的kube-prometheus源码 github地址&#xff1a;GitHub - prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes 1&#xff09;进入目录 [rootk8s-master ~]# cd kube-prometheus [rootk8s-master…

商城小程序源码搭建部署,商城购物小程序开发流程(php框架)

关于商城小程序 商城小程序作为一种基于移动互联网的在线购物平台&#xff0c;商家可以上架所销售的产品&#xff0c;定价&#xff0c;以及营运营的在线售货平台。买家无需下载应用&#xff0c;在小程序搜索打开即可浏览下单商品。 技术栈 前端: vue uniapp 后端&#xff1a…

嵌入式Linux学习笔记(7)-Socket网络编程

一、什么是Socket网络编程 Socket是一种抽象的编程接口&#xff0c;可以用于在不同主机之间进行数据通信。Socket API提供了一系列函数来创建、连接、发送和接收数据等操作。嵌入式 Linux 系统中的 Socket 网络编程是指在嵌入式系统中使用 Socket API 进行网络通信。 Socket 网…

HTTP协议1.1请求头和keep-alive

请求头分类 End-to-end&#xff08;端对端&#xff09; 必须全部带给目标服务器&#xff0c;不会被中途变化或去掉 Hop-by-hop&#xff08;逐跳头&#xff09; 比如客户端发请求&#xff0c;要路过代理(例如Nginx)&#xff0c;头可以被自动删掉&#xff0c;来到真正服务器上…

vue/配置axios(前后端数据连通/api接口的调用)

1.创建apis文件 2.写入调用的api地址且暴露出去。 import httpInstance from /utils/http;export function getHomeNav() {return httpInstance({url: http://10.0.11.91:91/dailyreport/getdailyreportall,}) }3.创建文件编写拦截器 代码部分 //axios基础封装 import axio…

Thinkphp5x远程命令执行 靶场攻略

环境配置 靶场&#xff1a;vulhub/thinkphp/5-rce docker-compose up -d #启动环境 漏洞复现 1.访问靶场&#xff1a;http://172.16.1.198:8080/ 2.远程命令执⾏ POC&#xff1a; ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system…

Bytebase 2.23.0 - 支持 Entra (Azure AD) 用户/组同步

&#x1f680; 新功能 支持从 Entra ID&#xff08;前 Azure AD&#xff09;同步用户和群组。 支持 CockroachDB。 支持项目级别的默认备份设置&#xff0c;包含自动启用和跳过错误选项。 SQL 编辑器支持实时语法检查。 支持配置密码限制策略。 &#x1f514; 重大变更 分类…

初试AngularJS前端框架

文章目录 一、框架概述二、实例演示&#xff08;一&#xff09;创建网页&#xff08;二&#xff09;编写代码&#xff08;三&#xff09;浏览网页&#xff08;四&#xff09;运行结果 三、实战小结 一、框架概述 AngularJS 是一个由 Google 维护的开源前端 JavaScript 框架&am…

输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。

输电线塔目标检测数据集yolo格式 该数据集包括2644张输电线塔高清图像&#xff0c;该数据集已经过yolo格式标注&#xff0c;具有完整的txt标注文件和yaml配置文件。 输电线塔目标检测数据集 数据集名称 输电线塔目标检测数据集&#xff08;Transmission Tower Object Detecti…

从视觉到现实:掌握计算机视觉技术学习路线的十大步骤

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于【计算机视…

【第十五章:Sentosa_DSML社区版-机器学习之关联规则】

目录 15.1 频繁模式增长 15.2 PrefixSpan 【第十五章&#xff1a;Sentosa_DSML社区版-机器学习之关联规则】 机器学习关联规则是一种用于发现数据集中项之间有趣关系的方法。它基于统计和概率理论&#xff0c;通过分析大量数据来识别项之间的频繁共现模式。 15.1 频繁模式增…

Linux-DHCP服务器搭建

环境 服务端&#xff1a;192.168.85.136 客户端&#xff1a;192.168.85.138 1. DHCP工作原理 DHCP动态分配IP地址。 2. DHCP服务器安装 2.1前提准备 # systemctl disable --now firewalld // 关闭firewalld自启动 # setenforce 0 # vim /etc/selinux/config SELINU…

学生管理系统模块化编程

项目介绍&#xff1a;Java基础mysql的一个简单练习 一.数据库 二.项目结构 lib下的jar包下载地址&#xff1a;Maven Repository: mysql mysql-connector-java (mvnrepository.com) 1.db.properties drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/student?u…

【Unity3d Shader】毛玻璃效果

毛玻璃也叫​磨砂玻璃​:是用物理或化学方法处理过的一种表面粗糙不平整的半透明玻璃。 毛玻璃成像原理:毛玻璃表面不平整,光线通过毛玻璃被反射后向四面八方射出去(因为毛玻璃表面不是光滑的平面,使光产生了漫反射),折射到视网膜上已经是不完整的像,于是就看不清楚(…

基于OpenCV的单目测距

随着计算机视觉技术的发展&#xff0c;单目测距作为一种重要的视觉测量手段&#xff0c;在众多领域得到了广泛的应用。本文将探讨基于OpenCV的单目测距原理、局限性、实际应用场景以及一些优化方案。 单目测距的原理 单目测距是指利用一台摄像机拍摄到的单一图像来进行距离测量…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源&#xff0c;风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设&#xff0c;现有风机124台&#xff0c;总装机容量约20万千瓦。请建立数学模型&#xff0c;解决以下…

【Python报错已解决】ValueError: cannot convert float NaN to integer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…