问题定义

问题: 如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办?
函数节流 throttle - 图1


问题描述

函数节流(throttle)

概念: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。


参考代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. </body>
  11. <script>
  12. /**
  13. * throttle函数节流,返回一个被节流了的函数,使用闭包。
  14. * 这个函数包含两个参数(fn, timeout), fn是被重复调用的函数,timeout是要节流的时间。
  15. * 1. 第一次调用立即执行
  16. * 2. 之后的调用在timeout之内则不执行,之外则执行
  17. */
  18. function throttle(fn, timeout) {
  19. const _self = fn;
  20. let firstTime = true;
  21. let timer = null;
  22. // 闭包
  23. return function() {
  24. const _me = this;
  25. const args = arguments;
  26. // 1. 判断是否是第一次调用
  27. if (firstTime) {
  28. _self.apply(_me, args);
  29. firstTime = false;
  30. }
  31. // 如果有timer直接返回即可.
  32. if(timer) {
  33. return false;
  34. }
  35. // 2. timer记录是否有已经在做的调用,如果没有则用timeout调用
  36. timer = setTimeout(function() {
  37. clearTimeout(timeout);
  38. timer = null;
  39. _self.apply(_me, args);
  40. }, timeout || 500);
  41. }
  42. }
  43. window.onresize = throttle(function(){
  44. console.log(1);
  45. }, 2000);
  46. </script>
  47. </html>

参考文章