1. 定义:函数防抖:时间n秒后触发,不管在这个时间段中执行多少次事件,该事件只针对最后一次触发
  2. 使用场景:上拉刷新 scroll事件 resize事件 文本的输入验证

1-抖动

  1. <button id="btn">函数防抖</button>
  2. <script>
  3. var btn = document.getElementById("btn");
  4. btn.onclick = function(){
  5. setTimeout(()=>{
  6. console.log("loading");
  7. timer = null;
  8. },500)
  9. }
  10. </script>

2-原生javascript-button实现防抖

  1. <!-- 函数防抖:时间n秒后触发,不管在这个时间段中执行多少次时间,该事件只针对最后一次触发 -->
  2. <button id="btn">函数防抖</button>
  3. <script>
  4. var timer;
  5. var btn = document.getElementById("btn");
  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>

input实现防抖

  1. ##input
  2. <input type="text" id="input">
  3. <script>
  4. var timer;
  5. var input = document.getElementById("input");
  6. input.addEventListener("keyup",()=>{
  7. if(timer){
  8. clearTimeout(timer)
  9. }
  10. timer = setTimeout(()=>{
  11. console.log(input.value);
  12. timer = null;
  13. },500)
  14. })
  15. </script>

3-封装函数防抖(闭包)

  1. <input type="text" id="input">
  2. <script>
  3. //使用
  4. var input = document.getElementById("input");
  5. input.addEventListener("keyup",debounce(function(){
  6. console.log(this.value);
  7. }))
  8. //封装
  9. //
  10. function debounce(fn,delay=500){
  11. let timer = null;
  12. return function(){
  13. console.log(this);
  14. if(timer){
  15. clearTimeout(timer);
  16. }
  17. timer = setTimeout(()=>{
  18. console.log(this)
  19. //改变this关键字指向
  20. fn.apply(this);
  21. },delay);
  22. }
  23. }
  24. </script>