防抖、节流的介绍

news2025/2/28 3:54:26

目录

一、什么时候要用到防抖节流

输入框连续输入的案例

滚动条案例

 二、什么是防抖、节流

  使用防抖来解决输入框案例造成的浪费现象: 

使用节流来解决滚动条案例造成的浪费现象: 

三、总结


一、什么时候要用到防抖节流

        针一类类快速连续触发和不可控的高频触发问题,可以用节流和防抖。如通过滚动条的滚动来发起请求、通过输入文字来发起请求这一类的行为,下面用两个例子具体的给大家展示。

  • 输入框连续输入的案例

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <span>输入文字发起请求:</span>
        <input type="text" id="input">
    </div>
    <script>
        // 通过id选择器获取到输入框实例对象
        const input = document.getElementById('input')
        // 给输入框对象绑定键盘输入事件
        input.oninput = function () {
            //利用定时器来模拟异步操作
            setTimeout(() => {
                // 使用日志输出来模拟ajax请求
                console.log("发起ajax请求" + ",时间戳为:" + new Date());
            }, 1000)
        }
    </script>
</body>

</html>

        通过运行的结果我们可以发现,输入123456,我们的请求也发送了6次。但实际上,我们并不关注输入1-5这5个字的结果,我们需要的是输入6之后的请求结果,那么前5次的请求都是无效的。如果请求需要的代价很大,就会造成较大的资源、带宽浪费甚至网页卡顿。对此我们就需要使用防抖的技术来解决这个问题。

  • 滚动条案例

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer {
            height: 300px;
        }

        .inner {
            height: 1000px;
            /* 使用overflow:auto来开启滚动条 */
            overflow: auto;
        }
    </style>
</head>

<body>
    <div class="outer">
        <div class="inner"></div>
    </div>
    <script>
        window.onscroll = function () {
            //利用定时器来模拟异步操作
            setTimeout(() => {
                // 使用日志输出来模拟ajax请求
                console.log("发起ajax请求");
            }, 1000)
        }
    </script>
</body>

</html>

        这里将滚轮从最高处滑动到最后,可以发现请求发送了41条,同样的我们关注的是最后一条的请求结果,因此也造成了大量的资源浪费,这种情况下就可以使用节流来进行操作。

        又或者大家经常用到的京东,我们通过鼠标悬浮在左侧的菜单项上,动态的渲染右侧显示的内容。也是可以使用到节流,因为我们关注的只是我最后鼠标放置位置展示右侧的内容,使用节流可以节省一定的网络资源。

 二、什么是防抖、节流

        (学习防抖和节流需要有闭包的知识基础)

  •  防抖,顾名思义,防止抖动。用于将用户的操作行为触发转换为程序行为触发,防止用户操作的结果抖动。一段时间内,事件在我们规定的间隔 n 秒内多次执行,回调只会执行一次。

  使用防抖来解决输入框案例造成的浪费现象: 

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <span>输入文字发起请求:</span>
        <input type="text" id="input">
    </div>
    <script>
        // 通过id选择器获取到输入框实例对象
        const input = document.getElementById('input')
        /* 防抖函数 */
        let debounce = function (callback, delay) {
            // 使用闭包的外部变量来定义定时器
            let timer;
            return function () {
                // 判断是否已经存在定时任务
                if (timer) {
                    /*
                     如果已有定时任务就将已有任务清楚,
                     再重新生成新的定时任务
                    */
                    clearTimeout(timer)
                }
                // 生成定时任务并赋值给timer
                timer = setTimeout(() => {
                    callback.call(this)
                }, delay)
            }
        }
        let ajax = function () {
            //利用定时器来模拟异步操作
            setTimeout(() => {
                // 使用日志输出来模拟ajax请求
                console.log("发起ajax请求" + ",时间戳为:" + new Date());
            }, 1000)
        }
        // 给输入框对象绑定键盘输入事件
        input.oninput = debounce(ajax, 1000)
    </script>
</body>

</html>

        流程:第一次输入的时候生成一个定时器,当到时间时发送请求。但在这个时间内如果用户再次输入文字的时候,将前一个定时器消除,重新生成一个新的定时器用新的参数发起请求,直到用户不再输入,定时任务完成将最后一次的请求发送给后端,获取到我们最终需要的数据。

        在下图里我们可以看到和最开始的案例已经有了不一样的结果,我们输入了6个字母最后只发送了一次的请求,恰巧是我们所需要的最后一次输入的结果。

  •  节流,顾名思义,控制流量。用于用户在与页面交互时控制事件发生的频率,一般场景是单位的时间或其它间隔内定时执行操作。一段时间内,事件在每次到达我们规定的间隔 n 秒时触发一次。

使用节流来解决滚动条案例造成的浪费现象: 

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .outer {
            height: 300px;
        }

        .inner {
            height: 1000px;
            /* 使用overflow:auto来开启滚动条 */
            overflow: auto;
        }
    </style>
</head>

<body>
    <div class="outer">
        <div class="inner"></div>
    </div>
    <script>
        /* 通过判断flag来实现节流 */
        let throttle = function (callback, delay) {
            // 判断依据
            let flag = true
            return function () {
                // 如果flag为false便忽略这次操作
                if (flag) {
                    /*  设定定时器,当任务执行时将flag恢复false,
                        允许下一次的事件触发
                    */
                    setTimeout(() => {
                        callback.call(this)
                        flag = true
                    }, delay)
                }
                //在定时任务执行之前,flag始终为false
                flag = false
            }
        }
        /* 通过时间来判断 */
        let throttling = function (callback, delay) {
            // 设置一个记录的时间,用以判断是否忽略操作
            let time = 0;
            return function () {
                // 创建当前时间,用以判断是否超过设定好的延迟
                let now = new Date()
                // 如果两次事件触发时间差大于设定好的毫秒数,则触发新的请求
                if (now - time > delay) {
                    // 执行回调函数
                    callback.call(this)
                    // 将记录的时间设置为这一次执行任务的时间
                    time = now
                }
            }
        }
        let ajax = function () {
            //利用定时器来模拟异步操作
            setTimeout(() => {
                // 使用日志输出来模拟ajax请求
                console.log("发起ajax请求");
            }, 1000)
        }
        window.onscroll = throttling(ajax, 3000)
    </script>
</body>

</html>

流程:设定一个时间,当到达规定时间后执行回调函数。在这个时间里,另外的事件触发则不生效。直到事件触发的时间差大于设定好的延迟时间。

 将页面滑到底部,可以看到只执行了一次。

三、总结

        防抖的使用场景:

  • mousemove 鼠标滑动事件
  • input 输入事件

        节流的使用场景:

  • 商品搜索列表、商品橱窗等
  • 用户滑动时 定时 / 定滑动的高度 发送请求 

        防抖和节流之间的差别:

        防抖可能用于无法预知的用户主动行为,如用户输入内容去服务端动态搜索结果。用户打字的速度等是无法预知的,具有非规律性。

        节流可能用于一些非用户主动行为或者可预知的用户主动行为,如用户滑动商品橱窗时发送埋点请求、滑动固定的高度是已知的逻辑,具有规律性。

        防抖是关注于最后一次的事件触发,而节流则是在规定的时间里只执行一次。

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

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

相关文章

不会前端没事,用GWT Boot和Spring Boot构建Web程序

本文介绍了一种使用Java构建Web应用程序的方式&#xff0c;其中GWT或者J2CL是必不可少的&#xff0c;另外还有多个UI框架可以配套使用&#xff0c;比如Domino UI、VueGWT、GWT Material Design (GMD)&#xff0c;React4J、WebFX&#xff0c;还有一些活跃低的框架GWTBootstrap3、…

2023前端面试题及答案整理(Vue)

watch 和 computed 区别 watch 是监听动作&#xff0c;computed 是计算属性watch 没缓存&#xff0c;只要数据变化就执行。computed 有缓存&#xff0c;只在属性变化的时候才去计算。watch 可以执行异步操作&#xff0c;而 computed 不能watch 常用于一个数据影响多个数据&…

Vue项目部署上线全过程(保姆级教程)

Vue项目部署上线全过程&#xff08;保姆级教程&#xff09; 上线前准备 1.先在vue.config.js文件中配置反向代理解决跨域请求问题 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {proxy: {"…

web渗透测试学习路线

web渗透学习路线 文章目录*web渗透学习路线*前言一、web渗透测试是什么&#xff1f;二、web渗透步骤1.前期工作2.中期提高3.后期打牢总结前言 本文整理的学习路线&#xff0c;清晰明了&#xff0c;重点分明&#xff0c;能快速上手实践&#xff0c;相信想学的同学们都能轻松学完…

vue实现文件上传

这里使用的是vue2&#xff0c;ui用的是element ui &#xff0c;后期有时间会更新vue3版本的。前端文件上传使用的是ui框架中的Upload的图片列表缩略图&#xff0c;喜欢别的样式可以直接更改。看图注fileChange():方法可以直接获取到上传文件的状态及可以直接拿到图片的值可以新…

Redux中进行异步操作(网络请求)的方案

文章目录Redux中的异步操作组件中进行异步操作redux中进行异步操作Redux中的异步操作 在之前简单的案例中&#xff0c;redux中保存的counter是一个本地定义的数据 我们可以直接通过同步的操作来dispatch action&#xff0c;state就会被立即更新。 但是真实开发中&#xff0c;r…

Vue3 项目创建

安装 1、安装node vue 3需要node10以上版本 node官网下载地址以往的版本 | Node.js 2、安装vue/cli 如果已经全局安装过旧版本的vue-cli npm uninstall vue-cli -g //yarn global remove vue-cli 然后安装 npm install -g vue/cli //yarn global add vue/cli 为什…

使用vue,实现前端导入excel数据

文章目录 前言一、引入组件二、封装导入功能的组件 1.编写组件template2.获取数据3.调用接口把数据传给后端三、总结前言 继前边的vue的导出功能后&#xff0c;自己又去在网上搜了vue导入excel一些文章&#xff0c;自己通过对代码的整理和调整&#xff0c;实现了vue导入excel的…

Vue3报错:Property “xxx“ was accessed during render but is not defined on instance.

Vue3报错&#xff1a;Property “xxx” was accessed during render but is not defined on instance. 翻译&#xff1a;属性“xxx”在呈现期间被访问&#xff0c;但没有在实例上定义。 其实就是在模板上有&#xff0c;但是在script上没有定义 很多同学跟说这不是报错&#…

Vue2-基础知识

目录 一.vue简介 1.概念 2.特性 (1)数据驱动视图 (2)双向数据绑定 3.MVVM 4.基本使用步骤 5.调试工具 二.vue基础 1.指令 (1)内容渲染指令 (2)属性绑定指令 (3)事件绑定指令 (4)双向绑定指令 ​编辑(5)条件渲染指令 (6)列表渲染指令 2.过滤器 (1)概念 (2)分…

HTML5设计注册/登录界面

学习目标&#xff1a; 掌握 HTML5入门知识掌握 CSS入门知识学习内容&#xff1a; 掌握 HTML5基本语法掌握CSS基本语法HTML5网页设计掌握块级标签掌握行内标签表单的使用方法iput常用属性学习时间&#xff1a; 周一至周五早上 7 点—晚上9点周六上午 9 点-晚上9点周日下午 3 …

Redux的基本使用过程详解

文章目录Redux的使用过程Redux测试项目的搭建Redux的基本使用步骤Redux目录的结构划分React的三大原则Redux的使用过程 Redux测试项目的搭建 1.创建一个新的项目文件夹:learn-redux # 执行初始化操作 npm init -y或yarn init -y # 安装redux:npm install redux --save或yarn …

Tomcat使用教程(超详细)

文章目录Tomcat学习笔记1、Tomcat概述2、Tomcat的基本使用2.1 基本操作2.1.1 安装2.1.2 卸载2.1.3 配置2.1.4 启动2.1.5 部署2.1.6 关闭3、IDEA中使用Maven创建Web项目3.0 Web项目目录结构介绍3.1 使用骨架创建Web项目3.2 直接创建web项目4、Web项目部署4.1 集成本地的Tomcat4.…

别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)

目录 &#x1f30c;前言&#xff1a; &#x1f307;第一款、油猴插件 &#x1f307;第二款、Adblock Plus - 免费的广告拦截器 &#x1f307;第三款、谷歌清理大师&#xff08;CleanMaster&#xff09; &#x1f307;第四款、google翻译 &#x1f307;第五款、OneTab &a…

vue的双击事件(dbclick的使用)

双击事件(dblclick) vue事件中基于点击事件&#xff0c;有一个双击事件&#xff0c;通过dblclick事件触发。 语言&#xff1a;vue3/Ts 函数库&#xff1a;vueuse 1、需求分析 双击事件触发&#xff1b; 在双击时隐藏对应文字元素&#xff1b; 展示输入框&#xff1b; 输入…

Vue系列之插槽(slot)详解

文章の目录1、什么是插槽了2、插槽的分类3、默认插槽的使用3.1、语法3.2、示例4、具名插槽的使用4.1、什么是具名插槽4.2、语法4.3、示例4.4、缩写5、作用域插槽的使用5.1、什么是作用域插槽了5.2、语法5.3、示例6、动态插槽名6.1、什么是动态插槽名6.2、示例写在最后Vue 版本&…

Node.js | 从前端到全栈的必经之路

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;即将大三的学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三…

在uni-app中使用手机号一键登录

1、首先需要在dcloud开发者控制台开通一键登录 https://dev.dcloud.net.cn/uniLogin 开通一键登录服务, 获取关键最关键的两个参数 ApiKey 和 ApiSecret 真机调试无需添加应用&#xff0c;如需打包使用请添加。一键登录应用ID为离线打包时配置的appid 2、登录云服务空间&#x…

HTML零基础入门教程(详细)

首先我们先介绍一下网页&#xff1a; 网页时构成网站的基本元素&#xff0c;它通常由图片&#xff0c;链接&#xff0c;文字&#xff0c;声音&#xff0c;视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或.html后缀结尾的文件&#xff0c;因此我们把它俗称为HTML文…

webpack看这一篇就够了

文章目录今日学习目标1. webpack基本概念webpack能做什么2. webpack的基本使用2.0 创建项目2.1 解决多次引入资源文件2.2 webpack使用2.3_webpack 更新打包3. webpack的配置3.0_webpack-入口和出口3.1_打包流程图3.2_插件-自动生成html文件3.3_mode模式3.3_webpack开发服务器-为…