防抖和节流 àì夳堔傛蜴生んèń 2022-11-05 08:32 213阅读 0赞 # 防抖(debounce):当持续触发事件时,保证只执行最后一次事件处理函数 # > 在给DOM绑定事件时,有些事件我们是无法控制触发频率的。 如鼠标移动事件onmousemove, 滚动滚动条事件onscroll,窗口大小改变事件onresize,瞬间的操作都会导致这些事件会被高频触发。 如果事件的回调函数较为复杂,就会导致响应跟不上触发,出现页面卡顿,假死现象。 在实时检查输入时,如果我们绑定onkeyup事件发请求去服务端检查,用户输入过程中,事件的触发频率也会很高,会导致大量的请求发出,响应速度会大大跟不上触发。 如何实现防抖呢? 我们拿滚动事件举例子,用户的滚动会频繁触发滚动事件,很容易造成页面卡死。那么我们可以封装如下一个函数。每次想调用函数的时候,设置一个定时器让函数延迟执行。当连续触发的时候,前面每次定时器都会清除掉,都会停掉前面的定时器所以函数并不会运行,只会执行最后一次。 // 防抖 function debounce(fn) { let timeout = null; // 创建一个标记用来存放定时器的返回值 return function () { clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉 timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数 fn() }, 500); }; } function sayHi() { console.log('防抖成功'); } let box = document.getElementById('box') box.addEventListener('click', debounce(sayHi)) # 节流(throttle)::当持续触发事件时,保证一定时间段内只调用一次事件处理函数 # > 节流通俗解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内一滴一滴的往下滴。 如何实现节流? 当用户连续操作的时候,我们设置一个定时器,一段时间后执行函数,并且执行完把标记改为true,所以在函数没有执行完之前一直是false,可能有的同学认为连续操作那么函数连续运行,那么canRun这个标记不一直是true吗,并不是,注意这里是一个闭包结构,真正每次调用的其实是throttle里面return的函数并不是每次都调用throttle,所以canRun只是提供初始值,并不会每次都重新赋值为true。所以用户连续操作的时候,比如用户一秒钟连续操作了十次,但是对于我们这个代码来说,只可能每500毫秒执行一次,因为只有500ms之后canRun才为true,才能开启下一个定时器。所以哪怕用户一秒钟之内连续点了十次,其实也只是能执行两次。这就符合节流的本意。 function throttle(fn) { let canRun = true; // 通过闭包保存一个标记 return function () { if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return canRun = false; // 立即设置为false setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中 fn() // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉 canRun = true; }, 500); }; } function sayHi(e) { console.log('节流'); } window.addEventListener('resize', throttle(sayHi)); # 总结:防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行。 #
相关 防抖和节流 前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize、scroll、mousemove 等等,但有些时候我们并不希望在事件持续触发的过程中那么频繁地去... 梦里梦外;/ 2024年04月18日 21:02/ 0 赞/ 84 阅读
相关 防抖和节流 防抖:debounce(不停滑动鼠标时,数字不会累加,当停止滑动,1000ms之后数字才会累加) let num = 1; let div= docu 秒速五厘米/ 2023年07月17日 02:55/ 0 赞/ 24 阅读
相关 防抖和节流 之前代码: 滑动右侧A-Z导航条 handlerTouchMove(e) { if (this.touchStatus) { 怼烎@/ 2023年02月23日 03:58/ 0 赞/ 24 阅读
相关 防抖和节流 防抖 是为了防止频繁触发的操作,在指定时间内我们让用户的行为只触发一次在第一次点击时/最后一次点击时(只能识别一次) function debounce( 约定不等于承诺〃/ 2023年01月08日 02:06/ 0 赞/ 156 阅读
相关 防抖和节流 防抖(debounce):当持续触发事件时,保证只执行最后一次事件处理函数 > 在给DOM绑定事件时,有些事件我们是无法控制触发频率的。 如鼠标移动事件onmousemo àì夳堔傛蜴生んèń/ 2022年11月05日 08:32/ 0 赞/ 214 阅读
相关 防抖和节流 防抖 所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 触发高频事件后n秒内函数只会执行一次,如果n秒 待我称王封你为后i/ 2022年08月30日 11:37/ 0 赞/ 226 阅读
相关 防抖和节流 1. 防抖 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 \ 思路:每次触发事件时都取消之前的延时调用方法 function 朱雀/ 2022年03月18日 01:44/ 0 赞/ 315 阅读
相关 节流、防抖 节流和防抖主要处理事件处理函数高频调用,减少浏览器负担 节流:尽量减少触发次数,mint-ui上封装了一个方法 <script> var t 向右看齐/ 2022年01月30日 00:39/ 0 赞/ 351 阅读
相关 防抖和节流 防抖和节流 一、什么是防抖 二、防抖使用场景 1.输入框是按键触发请求时 三、什么是节流 四、节流的使用场景 1.鼠标连续 快来打我*/ 2021年09月07日 06:13/ 0 赞/ 495 阅读
相关 防抖节流 vue代码 防抖 // timer用于储存定时器 delayed(){ // 检测定时器 if(this.timer){ 妖狐艹你老母/ 2021年07月24日 18:39/ 0 赞/ 484 阅读
还没有评论,来说两句吧...