1. // 防抖 与节流
    2. //概念 节流和防抖都是为了降低调用频率的一种方式
    3. //相同点就是都是需要设置一个回调函数及周期时间,区别在于:
    4. //防抖是停止触发后的100ms,执行一次(在此时间内,只要不停止触发,理论上就永远不会触发回调) 节流就是 在不断的触发过程中,每个100ms就执行一次。
    5. //节流 throttle
    6. //在高频触发回调函数时,节流操作使回调函数在每隔一段时间定期执行一次。时间间隔内再触发,不会重新执行。 核心在于让一个函数不要执行的太频繁,,减少一些过快的操作 类似与技能冷却
    7. //节流
    8. function throttle(fn, wait) {
    9. let time = 0;
    10. return () => {
    11. if (time) return; //在定时器时间范围内,不允许触发下面的方法,只有超过了时间范围后才能触发。一般用于scorll 、mousemove等事件
    12. timer = window.setTimeout(function() {
    13. fn();
    14. time = 0;
    15. }, wait)
    16. }
    17. }
    18. //防抖 监听浏览器窗口resize操作(只需要计算一次)键盘文本输入的验证-防抖(连续输入文字后发送请求进行验证,验证一次就好) 提交表单-防抖(多次点击变成一次)
    19. function debounce(fnc, wait) {
    20. let timer = 0;
    21. return () => {
    22. clearTimeout(timer);
    23. timer = window.setTimeout(function() {
    24. fnc();
    25. time = 0; //防抖只验证一次,当我无限滚动的时候 他都会先进行清空定时器,再进到定时器进行执行函数。当我最后一次滚动的时候,它的定时器还存在。所以要time=0;
    26. }, wait)
    27. }
    28. }
    29. let handleScrollTop = () => {
    30. const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    31. console.log('滚动条的位置:' + scrollTop);
    32. }
    33. //防抖:在停止滚动100ms后,才会输出滚动条的位置
    34. window.onscroll = debounce(handleScrollTop, 100);
    35. //节流:每100ms都会输出一次滚动条位置
    36. window.onscroll = throttle(handleScrollTop, 100)