44.节流与防抖

news2024/10/6 12:32:20

目录

1  防抖

1.1  概念

1.2  应用场景

1.3  lodash防抖

1.4  手写防抖

2  节流

2.1  概念

2.2  应用场景

2.3  lodash节流

2.4  手写节流

2.5  记录视频上一次的播放位置


1  防抖

1.1  概念

防抖就是让事件触发后延迟n秒后再执行回调函数,在这n秒内如果事件又被触发,则重新计时(再等n秒后触发)

  • 相当于英雄联盟按回城后需要等待几秒才能成功,如果进行了别的操作之后再按一下回城就重新计时

防抖的目的有两个

  • 怕用户按错了,按错了达到了一个不想要的结果前给你一个可以取消的时间,还是以回城举例,按了一下回城,等几秒,这几秒你发现按错了,你就可以移动一下或者进行别的什么操作取消回城
  • 频繁触发同一个事件只需要在确定结果后执行一遍回调函数,比如一些搜索框的建议,如果不做防抖,那么你的每一次输入都会给你一次建议,如果做防抖就会在你输入完毕后只给你一次建议

1.2  应用场景

输入框防抖,比如验证用户名是否可用,用户输入完成后过一段时间(1秒),我们再发起请求 附录5-淘宝搜索案例_Suyuoa的博客-CSDN博客

1.3  lodash防抖

我们使用lodash的debounce(),debounce()会返回一个新函数

加之前是这样的

这样在键盘抬起来的时候就会出现后面的字

加之后是这样的

最后一次键盘按键抬起来后等500ms后才会出现后面的字

1.4  手写防抖

手写防抖的常用方式是使用定时器,在事件开始的时候使用clearTimeout(),之后给回调函数setTimeout()

最后一次keyup 500ms后才会出现执行结果

我们简单封装一下方便复用

2  节流

2.1  概念

节流是在n秒内无论执行多少次也只当作执行一次,比如在moba游戏中,你一直右键点击敌人,但攻击的动作是由攻速限制的。比如你1s能打1次,你在1s内点多少次鼠标也只能打一次。

节流的目的主要就是降低事件的触发频率

节流的常用方式是搞一个节流阀(一个变量给布尔值),在轮播图中我们使用过

2.2  应用场景

在轮播图的左右点击按钮我们会用到节流,令其如果在n秒内点击了多次只切换一次 37.轮播图_Suyuoa的博客-CSDN博客

抢购的按钮,理论上点击一次发送一次,但是如果用户搞个连点器你的服务器吃不住

视频中介绍了一个图片跟随鼠标的节流例子也可以很直观的看出节流的区别,感兴趣可以看一下 12.案例-使用节流优化案例效果_哔哩哔哩_bilibili 在视频中的例子并不是一个布尔变量,而是一个定时器定了一个极短的时间(16ms)让人眼看不出来区别。

2.3  lodash节流

没加之前是这样的,每点击一下都+1

我们使用lodash中的throttle()加上节流,第一个参数是要执行的函数,第二个参数是多长时间才能开启下一次操作,我们这里设置间隔为1s,返回值为一个新函数

这样虽然可以点击,但前后点击1s才是有效点击

2.4  手写节流

经测试,每隔1s才能实现有效点击

也可以不使用throttle_flag只使用throttle_timer这个变量

  • 这里(在开启定时器的时候)不能使用clearTimeout()清除定时器,使用clearTimeout()清除过后,throttle_timer的值不是null

经测试效果与上面相同

2.5  记录视频上一次的播放位置

需要用到下面两个事件,简单理解一下就是 ontimeupdate 在视频播放的时候触发,onloadeddata 在视频打开的时候触发

video标签中的currentTime是一个可读写的属性,我们在播放的时候每隔1s记录视频当前的事件,之后在打开的时候把这个时间给回video标签(如果是第一次打开我们给默认的0)

由于ontimeupdate的更新频率过快(1s好多次),我们没必要这么快(1s一次就行),所以可以对其进行节流

<!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>
    <video src="./test.mp4" controls></video>
</body>
<script>
    function throttle(fn,time) {
        let throttle_timer = null
        return function() {
            if (!throttle_timer) {
                fn()
                throttle_timer = setTimeout(function() {throttle_timer = null},time)
            }
        }
    }

    const video = document.querySelector('video')
    video.addEventListener('timeupdate',throttle(function(){localStorage.setItem('video_time',video.currentTime)},1000))

    video.addEventListener('loadeddata',function() {video.currentTime = localStorage.getItem('video_time') || 0})
</script>
</html>

我们现在看到了2s的位置

刷新后发现视频从2s处开始播放

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

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

相关文章

014:Mapbox GL添加draw组件,绘制点、线、多边形、删除

第014个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制点、线、多边形,删除所选元素。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共78行)相关API参考:专栏目标示例效果 配置方…

用于平抑可再生能源功率波动的储能电站建模及评价(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

项目部署---手工部署项目

手工部署项目 在ideal中开发springboot项目并打成jar包 将jar包上传到Linux服务器 mkdir /usr/local/app 创建目录&#xff0c;将项目jar包放到此目录 ![](https://img-blog.csdnimg.cn/83cf26b151874637a2dfeda7dd05e4cf.jpeg) 启动SpringBoot程序 检查防火墙&#xff0c;…

电脑蓝屏问题排查

最近电脑安装了最新win10&#xff0c;更新最新的驱动以后&#xff0c;开机几分钟后&#xff0c;会蓝屏重启&#xff0c;报错为&#xff1a; DRIVER_POWER_STATE_FAILURE 下载蓝屏分析工具BlueScreenView 问题出在ntoskrnl.exe bing搜索给出了二种解决方案&#xff1a; 1&a…

软件测试应届生社招找工作面试会遇到哪些坑?(全网最全避坑指南)

目录 找工作的最佳时间 是否裸辞 我们要做哪些准备工作 准备一段自我介绍 准备一份pdf简历 社招找工作的渠道&#xff1a;内推 找工作的最佳时间 社招找工作的最佳时间是&#xff1a;金三银四。也就是春节后的三月份和四月份。 为什么是金三银四呢&#xff1f;因为每年的…

HTML5 Geolocation

文章目录HTML5 Geolocation定位用户的位置浏览器支持HTML5 - 使用地理定位处理错误和拒绝在地图中显示结果给定位置的信息getCurrentPosition() 方法 - 返回数据Geolocation 对象 - 其他有趣的方法HTML5 Geolocation HTML5 Geolocation&#xff08;地理定位&#xff09;用于定位…

【SQL Server】数据库开发指南(五)T-SQL 高级查询综合应用与实战

T-SQL 是 SQL Server 的专用版本&#xff0c;提供了一组强大的高级查询功能&#xff0c;包括聚合函数、子查询、连接、视图、窗口函数、共享表达式、递归查询等。这些功能使得 T-SQL 可以轻松处理大量数据&#xff0c;并支持各种复杂的查询和数据操作。本文将介绍 T-SQL 的一些…

Debian 10配置apt源常见问题

目录 一&#xff1a;配置本地apt源没有发现文件 解决方案 二&#xff1a;apt下载bind9报错E: Package bind9 has no installation candidate 方法一&#xff1a; 方法二&#xff1a;更新不报错但是安装依旧报错E: Package bind9 has no installation candidate 一&#xff…

密码加密——加盐算法(两种方式)

加盐算法 文章目录加盐算法手写一个加盐算法spring security密码安全是一件很重要的事情&#xff0c;所以一定要谨慎对待 常见的主要是3种方式 明文MD5加密加盐算法 首先明文肯定是不可取的&#xff0c;在数据库中明文存储密码风险实在是太大了 简单来说&#xff0c;使用MD…

DataGrip连接数据库设置(MySQL、Oracle、SQL Server)

一、DataGrip连接MySQL 1.1 配置信息 1.2 测试查询employees库中departments表信息 employees为测试库&#xff0c;具体来源&#xff0c;参考这篇文章 下载并导入MySQL示例数据库employees 。 1.3 测试查询employees库中employees表信息 二、DataGrip连接Oracle 将SID改为o…

「字节跳动实习期间」免费专栏发布+服务端知识架构

字节跳动实习期间专栏内容 主要放在字节跳动实习期间个人的一些笔记&#xff0c;通过整理放出&#xff0c;并保持不断迭代 同时这里并不会放涉及字节内部的文档和知识&#xff0c;只是博主整理的网上已有的知识 欢迎同学们关注专栏、互相学习、共同进步&#xff0c;我也会在…

vue-cli(vue脚手架方式搭建)

1.首先安装node前端环境,可以帮助我们去下载其他的组件 下载完成后,去自己的电脑找到node的文件路径,复制去配置环境变量,在path中配 环境搭配完成后,在cmd中进行测试 ,输入一下两个命令进行测试 2.在hbuilderX中创建一个vue-cli项目(标准的前段项目) 3.组件路由 (1)安装 v…

java基础学习-5

Java基础学习-5快乐算法二分查找小总结分块查找冒泡选择插入排序递归算法快速排序小总结ArraysLambda表达式小总结Lambda表达式的省略写法小练习集合进阶CollectionColection的遍历方式迭代器遍历小总结增强for循环Lambda表达式遍历小总结List集合List的遍历方式迭代器遍历增强…

【redis】集群

redis集群 集群有点难 大部分的实操命令没有记录 希望能二刷补上 18:46 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录redis集群前言一、集群是什么&#xff1f;二、集群能干嘛&#xff1f;三、集群算法-分片-槽…

redis——分布式

持久化RDBAOF主从同步全量同步增量同步哨兵sentinel作用服务状态监控选举master分片集群作用散列插槽 hash slot集群伸缩故障转移多级缓存持久化 RDB redis备份文件&#xff08;快照&#xff09; 可压缩&#xff0c;耗费cpu默认在服务停止时触发可以设置一定条件&#xff0c…

《C Primer Plus》第16章复习题与编程练习

《C Primer Plus》第16章复习题与编程练习复习题1. 下面的几组代码由一个或多个宏组成&#xff0c;其后是使用宏的源代码。在每种情况下代码的结果是什么&#xff1f;这些代码是否是有效代码&#xff1f;&#xff08;假设其中的变量已声明&#xff09;2. 修改复习题1中d部分的定…

Linux的chage命令

Linux系统中有安全验证机制&#xff0c;有一个密码过期管理功能&#xff0c;当该账户密码过期了&#xff0c;那么用户在登录系统的时候就会提示我们更改密码。当密码过期后&#xff0c;并不代表这个用户不用密码就能登录了&#xff0c;而是使用旧密码登录&#xff0c;然后跳转到…

靶机精讲之PWOOS1.0

主机发现 nmap扫描 端口发现扫描 UDP扫描 服务扫描 脚本扫描 查看链接 暴露的信息 mgmt manegement管理系统 web渗透 80端口 观察文件路径的变化 sql注入 手动注入 加‘有报错 查看有无文件包含 无 /etc/passwd(查看文件包含&#xff09; 有 10000端口 把有文件包含路径在…

C++程序设计——右值引用

一、右值引用概念 引用&#xff1a; C98中提出了引用的概念&#xff0c;引用即别名&#xff0c;引用变量与其引用实体共用同一块内存空间&#xff0c;而引用的底层是通过指针来实现&#xff0c;因此使用引用&#xff0c;可以提高程序的可读性。 右值引用(类型&& 右值…

校园商城项目自制面经

ware-仓库 目录 ES 为什么redis快 为什么ES搜索快&#xff1f; 怎么理解es的倒排索引 简单看SpringCache的api Feign怎么用的 gateWay实现前端和后端的跨域请求&#xff1a; 三级分类&#xff1a; 网站的数据上传&#xff1a; JSR303校验 自定义校验功能 ES&#xf…