一、什么是防抖。
就是指 在设定的一段时间内中除了最后一次,前面的连续触发都不执行。
举例:设定1000毫秒执行,触发一次,1000毫秒后执行,但是如果你在剩500毫秒的时候又触发了,那就重新从1000毫秒计算。
形象举例:英雄联盟或者王者荣耀的回城
防抖应用场景
- 搜索框搜索输入、文本输入的验证
- 文本编辑器实时保存
示例:非立即执行版
1 2 3 4 5 6 7 8 9 10 11 12 13
| <button class="ipt" type="button" onkeyup="SomeJavaScriptCode">防抖</button> <script> let timerId = null document.querySelector('.ipt').onclick = function () { console.log('我被点了'); if (timerId !== null) { clearTimeout(timerId) } timerId = setTimeout(() => { console.log('我是防抖'); }, 1000) } </script>
|
立即执行版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <button class="ipt" type="button" onkeyup="SomeJavaScriptCode">防抖</button> <script> let timerId = null let flag = true document.querySelector('.ipt').onclick = function () { console.log('被点了'); clearTimeout(timerId) if (flag) { console.log('我是防抖'); flag = false } timerId = setTimeout(() => { flag = true }, 1000) } </script>
|
二、什么是节流。
就是指在设定的一段时间内连续触发事件也只执行一次。
举例:设定1000毫秒执行,在1000毫秒内触发多次,也是在1000毫秒后执行一次
形象举例:技能CD,等cd过后再点技能才能生效
节流使用场景
- 高频事件:快速点击、鼠标滑动、resize事件、scroll事件
- 下拉加载
- 视频播放记录时间等
示例:非立即执行版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <button class="ipt" type="button" onkeyup="SomeJavaScriptCode">节流</button> <script> let timerId = null document.querySelector('.ipt').onclick= function () { console.log('我被点了'); if (timerId !== null) { return } timerId = setTimeout(() => { console.log('我是节流'); timerId = null }, 1000) } </script> <button class="ipt" type="button" onkeyup="SomeJavaScriptCode">节流</button> <script> let timerId = null let flag = true document.querySelector('.ipt2').onclick = function () { if (flag) { console.log("我是节流"); flag=false timerId = setTimeout(() => { flag = true }, 1000) } console.log('我被点了'); } </script>
|
一般用lodash库,利用里面的debounce和throttle