定义:事件在n秒后触发,不管在这个时间节点中执行多少次事件,只触发最后一次事件
对比场景:游戏中的回城 DNF中的抬枪

使用场景:

  1. 上拉刷新、下拉加载--scroll事件
  2. resize
  3. 文本的输入验证(连续输入文字后发送Ajax请求进行验证)
  4. 请求验证码

1、原生JavaScript-button实现防抖

  1. <!-- 什么叫函数防抖:事件在n秒后触发,不管在这个时间段中执行多少次事件,该事件只针对最后一次触发 -->
  2. <button id="btn">函数防抖</button>
  3. <script>
  4. var btn = document.getElementById("btn")
  5. var timer
  6. btn.onclick = function(){
  7. if(timer){
  8. clearTimeout(timer)
  9. }
  10. timer = setTimeout(()=>{
  11. console.log("loading");
  12. timer = null
  13. },500)
  14. }
  15. </script>

2、input实现防抖

  1. <input type="text" id="input">
  2. <script>
  3. var input = document.getElementById("input")
  4. // 抖动的代码
  5. /* input.addEventListener("keyup",()=>{
  6. setTimeout(()=>{
  7. console.log(input.value);
  8. },1000)
  9. }) */
  10. input.addEventListener("keyup",()=>{
  11. console.log(timer);
  12. if(timer){
  13. clearTimeout(timer)
  14. }
  15. timer = setTimeout(()=>{
  16. console.log(input.value);
  17. timer = null//可加可不加
  18. },1000)
  19. })
  20. </script>

3、封装防抖

  1. <input type="text" id="input">
  2. <script>
  3. var input = document.getElementById("input")
  4. input.addEventListener("keyup",()=>{
  5. debounce(()=>console.log(input.value))
  6. })
  7. // 封装一个防抖函数
  8. function debounce(fn,delay=500){
  9. let timer
  10. if(timer){
  11. clearTimeout(timer)
  12. }
  13. timer = setTimeout(()=>{
  14. fn()
  15. },delay)
  16. }
  17. </script>

4、闭包封装的防抖

  1. <input type="text" id="input">
  2. <script>
  3. var input = document.getElementById("input")
  4. input.addEventListener("keyup",debounce(()=>{
  5. console.log(input.value);
  6. }))
  7. // 封装一个防抖函数
  8. // 闭包:1、返回值是一个函数;2、返回函数使用返回函数外面定义的局部变量
  9. // 闭包的好处,不会造成全局的污染
  10. function debounce(fn,delay=500){
  11. let timer
  12. return function(){
  13. if(timer){
  14. clearTimeout(timer)
  15. }
  16. timer = setTimeout(()=>{
  17. fn()
  18. },delay)
  19. }
  20. }
  21. </script>

5、apply改变this指向问题的封装防抖

  1. <input type="text" id="input">
  2. <script>
  3. var input = document.getElementById("input")
  4. input.addEventListener("keyup",debounce(function(){
  5. console.log(this.value);
  6. }))
  7. // 封装一个防抖函数
  8. // 闭包:1、返回值是一个函数;2、返回函数使用返回函数外面定义的局部变量
  9. // 闭包的好处,不会造成全局的污染
  10. function debounce(fn,delay=500){
  11. let timer
  12. return function(){
  13. console.log(this);
  14. if(timer){
  15. clearTimeout(timer)
  16. }
  17. timer = setTimeout(()=>{
  18. console.log(this);
  19. fn.apply(this)
  20. },delay)
  21. }
  22. }
  23. // function才能用call,apply
  24. </script>