案例:鼠标移动在div中移动时,页面上的数据对应增加相应的数字

非防抖版本

  • 效果图:

非防抖版本.gif

  • 实现代码:
    1. <div id="adder">0</div>
    2. <script>
    3. const div = document.getElementById('adder')
    4. // 鼠标移动,加 66
    5. let num = 66
    6. // 封装函数
    7. let divClick = function () {
    8. div.innerHTML = parseInt(div.innerHTML) + num
    9. }
    10. // 监听鼠标移动事件
    11. div.onmousemove = divClick
    12. </script>

    由实现效果可以看到只要鼠标移动就会更新数据,此时更新数据过于频繁,通过防抖限制

防抖-非立即执行版本

由效果图可见,鼠标移动后,鼠标停止1秒后才会增加数据

  • 效果图

非立即执行版本.gif

  • 实现代码

    1. <div id="adder">0</div>
    2. <script>
    3. const div = document.getElementById('adder')
    4. // 封装操作函数,这里可以把num作为参数传入
    5. let divClick = function (num) {
    6. div.innerHTML = parseInt(div.innerHTML) + num
    7. }
    8. // 封装防抖函数
    9. function debounce(fn, delay, ...arg) { // 参数:1.操作函数 2.延迟时间 3.函数参数
    10. let timer = null // 定义变量用来存储定时器
    11. return function () {
    12. timer && clearTimeout(timer) // 如果定时器存在,就清空定时器
    13. // 生成定时器
    14. timer = setTimeout(() => { // 此处使用箭头函数,this指向调用防抖函数的对象
    15. fn.apply(this, arg) // apply调用函数,传入this与参数数组
    16. }, delay)
    17. }
    18. }
    19. // 监听鼠标移动事件,调用debounce函数
    20. div.onmousemove = debounce(divClick,1000,8) // 1秒内鼠标移动,只增加一次数据,每次加8

    防抖-立即执行版本

    鼠标一移动就立即执行,之后一直移动都不增加数据,鼠标停止1秒后,再次移动,才会增加数据

  • 效果图

立即执行版本.gif

  • 实现代码

    1. <div id="adder">0</div>
    2. <script>
    3. const div = document.getElementById('adder')
    4. // 封装函数,这里可以把num作为参数传入
    5. let divClick = function (num) {
    6. div.innerHTML = parseInt(div.innerHTML) + num
    7. }
    8. // 定义防抖函数
    9. function debounce(fn, delay, ...arg) {
    10. let timer = null // 定义变量来存储定时器
    11. return function () {
    12. // apply调用函数,传入this 与 参数数组
    13. timer || fn.apply(this, arg) //如果定时器为空,就执行函数
    14. timer && clearTimeout(timer) // 如果定时器存在,就清空定时器
    15. timer = setTimeout(() => {
    16. timer = null // delay秒后将定时器设置为空
    17. }, delay)
    18. }
    19. }
    20. // 监听鼠标移动事件,调用debounce函数
    21. div.onmousemove = debounce(divClick, 1000, 8) // 1秒内鼠标移动,只增加一次数据,每次加8
    22. </script>

    防抖-合并版本

    通过参数控制:是否立即执行

  • 实现代码

    1. <div id="adder">0</div>
    2. <script>
    3. const div = document.getElementById('adder')
    4. // 封装函数,这里可以把num作为参数传入
    5. let divClick = function (num) {
    6. div.innerHTML = parseInt(div.innerHTML) + num
    7. }
    8. // 封装防抖函数
    9. function debounce(fn, delay, isImmediate, ...arg) {
    10. let timer = null
    11. return function () {
    12. timer && clearTimeout(timer)
    13. // 判断是否需要立即执行
    14. if (isImmediate) {
    15. timer || fn.apply(this, arg)
    16. timer = setTimeout(() => {
    17. timer = null
    18. }, delay)
    19. } else {
    20. timer = setTimeout(() => {
    21. fn.apply(this, arg)
    22. }, delay)
    23. }
    24. }
    25. }
    26. // 监听鼠标移动事件,调用debounce函数
    27. // 1秒内鼠标移动,只增加一次数据,每次加8,不立即执行
    28. div.onmousemove = debounce(divClick, 1000, false, 8)
    29. </script>