位置: IT常识 - 正文

防抖、节流的介绍(防抖节流实现原理)

编辑:rootadmin
防抖、节流的介绍

目录

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

输入框连续输入的案例

滚动条案例

 二、什么是防抖、节流

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

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

三、总结


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

推荐整理分享防抖、节流的介绍(防抖节流实现原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:防抖和节流的作用,防抖、节流,节流防抖 js,防抖和节流用在什么地方,防抖节流的区别和使用场景,防抖和节流用在什么地方,防抖,节流的介质有哪些,防抖、节流,内容如对您有帮助,希望把文章链接给更多的朋友!

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

输入框连续输入的案例<!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 输入事件

        节流的使用场景:

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

        防抖和节流之间的差别:

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

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

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

本文链接地址:https://www.jiuchutong.com/zhishi/300777.html 转载请保留说明!

上一篇:电脑找不到应用程序怎么解决? win11explorer.exe找不到应用程序解决办法(电脑找不到应用程序的图标怎么删除)

下一篇:ChatGPT的N种用法(持续更新中。。。)(chat的用法及短语)

  • vivox70pro+支持面部解锁吗(vivox70pro支持双卡双待吗)

    vivox70pro+支持面部解锁吗(vivox70pro支持双卡双待吗)

  • 微信消息提示音的修改方法是什么(微信消息提示音怎么改)

    微信消息提示音的修改方法是什么(微信消息提示音怎么改)

  • 淘宝直播电脑怎么和手机同步(淘宝直播电脑怎么开播)

    淘宝直播电脑怎么和手机同步(淘宝直播电脑怎么开播)

  • oppoa11有没有红外线功能(oppoa11有没有红外感应)

    oppoa11有没有红外线功能(oppoa11有没有红外感应)

  • surface pro7能代替笔记本电脑吗(surfacepro7可以当显示器吗)

    surface pro7能代替笔记本电脑吗(surfacepro7可以当显示器吗)

  • 百家号视频审核要多久(百家号视频审核中可以撤回吗)

    百家号视频审核要多久(百家号视频审核中可以撤回吗)

  • 手机双清是清哪些数据(手机双清是什么)

    手机双清是清哪些数据(手机双清是什么)

  • 淘宝主图视频怎么上传不了(淘宝主图视频怎么下载)

    淘宝主图视频怎么上传不了(淘宝主图视频怎么下载)

  • 华为soc芯片是什么意思(华为soc芯片概念股)

    华为soc芯片是什么意思(华为soc芯片概念股)

  • 网络丢包严重网速正常(网络丢包严重是什么意思)

    网络丢包严重网速正常(网络丢包严重是什么意思)

  • 怎样关闭qq看点推送的消息(如何能关闭qq看点)

    怎样关闭qq看点推送的消息(如何能关闭qq看点)

  • 如何进入中国知网免费入口(如何进入中国知网进行文献查阅)

    如何进入中国知网免费入口(如何进入中国知网进行文献查阅)

  • ip地址分为几类(查询网址域名ip地址)

    ip地址分为几类(查询网址域名ip地址)

  • 软件加密怎么弄(软件加密怎么加密)

    软件加密怎么弄(软件加密怎么加密)

  • 退款关闭什么意思(退款关闭意思退款成功了吗)

    退款关闭什么意思(退款关闭意思退款成功了吗)

  • 拼多多拒收会退款吗(拼多多拒收退回怎么处理)

    拼多多拒收会退款吗(拼多多拒收退回怎么处理)

  • 如何制作带pe功能的u盘(自制pe工具箱)

    如何制作带pe功能的u盘(自制pe工具箱)

  • 转转被永久封禁以后还可以操作吗?(转转被永久封禁交易中的订单怎么办)

    转转被永久封禁以后还可以操作吗?(转转被永久封禁交易中的订单怎么办)

  • qq群发祝福删掉怎么找(qq群发祝福删掉了怎么办)

    qq群发祝福删掉怎么找(qq群发祝福删掉了怎么办)

  • 小米ai音箱可以改名字吗(小米ai音箱可以当电脑音响吗)

    小米ai音箱可以改名字吗(小米ai音箱可以当电脑音响吗)

  • oppor15手机电话拉黑名单了,怎么找出来(oppor15手机电话本怎么储存卡上)

    oppor15手机电话拉黑名单了,怎么找出来(oppor15手机电话本怎么储存卡上)

  • 电脑共享文件在哪里找(电脑共享文件在主机与分享的区别)

    电脑共享文件在哪里找(电脑共享文件在主机与分享的区别)

  • vivox21可以刷门禁吗(vivo可以刷门卡吗)

    vivox21可以刷门禁吗(vivo可以刷门卡吗)

  • 手机为啥显示无sim卡(手机为啥显示无服务)

    手机为啥显示无sim卡(手机为啥显示无服务)

  • p30是不是5g(p30是不是双卡)

    p30是不是5g(p30是不是双卡)

  • 此值与此单元格定义的数据验证限制不匹配(此值与此单元格数据验证限制不匹配)

    此值与此单元格定义的数据验证限制不匹配(此值与此单元格数据验证限制不匹配)

  • PATH环境变量(配置path环境变量)

    PATH环境变量(配置path环境变量)

  • 没有独立显卡没有NVIDIA 如何安装pytorch(没有独立显卡没有核显能开机吗)

    没有独立显卡没有NVIDIA 如何安装pytorch(没有独立显卡没有核显能开机吗)

  • 税款所属期
  • 劳务费个人所得税税率表2023最新
  • 土地增值税纳税义务人
  • 公司优秀党员事迹材料
  • 会计二级科目是哪个
  • 行政单位调拨的固定资产申请报告
  • 公司所得税费用怎么算报多少钱
  • 当地外包公司是干什么的
  • 季度不超过9万
  • 增值税即征即退2023政策
  • 一般纳税人转登记为小规模纳税人
  • 存货清查会计分录例题盘亏
  • 丢失发票已报税证明单取消
  • 工程节点奖金
  • 年终对应交税费的减免税款怎样处理?
  • 外资企业银行贷款限制
  • 滞销款的最好销售办法
  • 收取员工宿舍租金收入要交增值税吗
  • 公司更名期间账户可以使用吗?
  • 个人非货币性资产投资的税务筹划
  • 如何查询以前申诉进度
  • 补发住房补贴征求意见
  • 总公司和分公司的关系证明
  • 发票有几个
  • 酒店客房收入怎么算
  • linux批量删除
  • 以前年度应收账款错误如何调整
  • 处置控制的子公司有哪些
  • word的拼写检查总是变成法语
  • kb4586853更新
  • 百度地图api的基本使用
  • 微信php开发教程
  • php显示文件目录及路径
  • php动态页面实例
  • 子公司财务管理策略有哪些
  • 企业以物易物如何确认收入
  • php格式转换
  • react的高阶组件理解
  • 自产产品对外捐赠销项税额怎么计算
  • node更新到最新版本
  • java后端代码例子
  • thinkphp3.0
  • 员工奖励现金如何做账
  • 职工薪酬在利润表哪里看
  • 哪些企业不需要做安评
  • 业务预算包括直销费用吗
  • 如何算基数
  • 现金账怎么登记
  • 公司收到注册资本金需要做哪些呢
  • 个人增值税发票税率
  • 什么企业的应急预案需要备案
  • 劳务合同如果不发工资怎么办
  • 医院哪些地方需要有明显的禁烟标识
  • 结转本年利润的账务处理
  • 退休人员返聘签订什么合同
  • 3%减按2%征收增值税是什么意思
  • 增值税出口退税款缴纳企业所得税吗
  • 农业开发公司的名称有哪些
  • 认缴制下实收资本可以一直为零吗
  • 投标保证金退回是不是没中标
  • 培训费怎么算个人所得税
  • 工程检测公司的账务处理流程
  • 根据企业会计准则第11号规定,下列关于等待期
  • 请问购买
  • mysql5.5.27安装教程与配置
  • windows installation disc
  • XP系统网上邻居不见了有哪些找回方法
  • windows2003 IIS6.0 asp配置技巧
  • 如何限制网速不让孩子玩游戏
  • debian linux教程
  • 浮动浮动
  • unity获取手机型号
  • unity人物面板
  • js 页面加载
  • JavaScript中getUTCMinutes()方法的使用详解
  • js中splice方法
  • javascript对象定义
  • 吉林省政府公开电话
  • 南京税务局几点下班?
  • 小规模纳税人30万免税政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设