对防抖和节流的理解及其应用场景

在开发中,我们常常会去监听滚动事件或者用户输入框验证事件,如果事件处理没有频率限制,就会加重浏览器的负担,影响用户的体验感,

因此,我们可以采取防抖(debounce)和节流(throttle)来处理,减少调用事件的频率,达到较好的用户体验。

防抖(debounce):

  在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时,重新出发定时器。

  

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>Document</title>

<style>

.box {

width: 200px;

height: 200px;

overflow: auto;

}

</style>

</head>

<body>

<div class="box" id="container">

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

<p>防抖演示</p>

</div>

</body>

function debounce(fn, wait) {
  var timeout = null;// 使用闭包,缓存变量
  return function() {
        if(timeout !== null) {
          console.log(‘清除定时器啦‘)
          clearTimeout(timeout);  //清除这个定时器
        }
        timeout = setTimeout(fn, wait);
    }
  }
  // 处理函数
  function handle() {
      console.log(Math.random());
  }
  var container = document.getElementById(‘container‘)
  container.addEventListener(‘scroll‘, debounce(handle, 1000));

我们可以发现,当连续触发scroll事件,handle函数只会在1秒时间内执行一次,在如果继续滚动执行,就会清除定时器,重新计时。相当于就是多次执行,只执行一次。

节流(throttle):

  规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

 var throttle = function(func, delay) {
    var timer = null; // 使用闭包,缓存变量
    var prev = Date.now(); // 最开始进入滚动的时间
    return function() {
      var context = this;   // this指向window
      var args = arguments;
      var now = Date.now();
      var remain = delay - (now - prev); // 剩余时间
      clearTimeout(timer);
      // 如果剩余时间小于0,就立刻执行
      if (remain <= 0) {
        func.apply(context, args);
        prev = Date.now();
      } else {
        timer = setTimeout(func, remain);
      }
    }
  }
  function handle() {
      console.log(Math.random());
  }
  var container = document.getElementById(‘container‘)
  container.addEventListener(‘scroll‘, throttle(handle, 1000));

在节流函数内部使用开始时间prev、当前时间now和剩余时间remain,当剩余时间小于等于0意味着执行处理函数,这样保证第一次就能立即执行函数并且每隔delay时间执行一次;

如果还没到时间,就会在remaining之后触发,保证最后一次触发事件也能执行函数,如果在remaining时间内又触发了滚动事件,那么会取消当前的计数器并计算出新的remaing时间。

通过时间戳定时器的方法,我们实现了第一次立即执行,最后一次也执行,规定时间间隔执行的效果。

总结,看完了防抖和节流的分别介绍,我们来看看他们的区别:

  • 函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。

  防抖是将多次执行变为只执行一次,节流是将多次执行变为每隔一段时间执行。

结合应用场景

  防抖(debounce)

    search搜索联想,用户在不断输入值时,用防抖来节约请求资源。

    window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

  节流(throttle)

    鼠标不断点击触发,mousedown(单位时间内只触发一次)

    监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断

本文转载多出,为了让自己看得明白一点。

原文地址:https://www.cnblogs.com/ympjsc/p/11813691.html

时间: 2024-10-24 16:59:30

对防抖和节流的理解及其应用场景的相关文章

详谈js防抖和节流

本文由小芭乐发表 0. 引入 首先举一个例子: 模拟在输入框输入后做ajax查询请求,没有加入防抖和节流的效果,这里附上完整可执行代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>没有防抖</title> <style type="text/css"></sty

深入理解JS防抖与节流

参考博客:JS防抖和节流,感谢作者的用心分享 日常开发过程中,滚动事件做复杂计算频繁调用回调函数很可能会造成页面的卡顿,这时候我们更希望把多次计算合并成一次,只操作一个精确点,JS把这种方式称为debounce(防抖)和throttle(节流) 函数防抖 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时.也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次. function

防抖和节流

在前端开发中,有一部分用户行为会频繁的触发事件,而对于DOM操作,资源加载等耗费性能的处理,很可能会导致卡顿,甚至浏览器的崩溃.防抖和节流就是为了解决这一类的问题. window.onscroll = function () { //滚动条位置 let scrollTop = document.body.scrollTop || document.documentElement.scrollTop; console.log('滚动条位置:' + scrollTop); } 效果如下 从效果上,我

前端进击的巨人(八):浅谈函数防抖与节流

本篇课题,或许早已是烂大街的解读文章.不过春招系列面试下来,不少伙伴们还是似懂非懂地栽倒在(-面试官-)深意的笑容之下,权当温故知新. JavaScript的执行过程,是基于栈来进行的.复杂的程序代码被封装到函数中,程序执行时,函数不断被推入执行栈中.所以 "执行栈" 也称 "函数执行栈". 函数中封装的代码块,一般都有相对复杂的逻辑处理(计算/判断),例如函数中可能会涉及到 DOM 的渲染更新,复杂的计算与验证, Ajax 数据请求等等. 前端页面的操作权,大部分

闲聊前端性能----防抖、节流、重绘与回流。

在最近,小米9卖的特别火,在官方抢购的时候基本都是一点既空.这不禁让我想到了,官网是怎样控制顾客不停点击发起请求而不导致官网崩溃的呢?这由此引出了前端性能的优化中的----防抖和节流.在闲聊完后你就会发现有些时候在抢购商品的时候,你用鼠标在几秒钟不停的按了数十次,或许它仅仅是发送了你第一次点击抢购的那个请求.所以说 抢购时间内的第一次点击尤为关键! 下面来介绍一下什么是防抖!        防抖:任务频繁触发的情况下,只有任务触发的间隔超过制定的时间间隔的时候,任务才会被执行. 下面引用一下知乎

2019 面试准备 - JS 防抖与节流 (超级 重要!!!!!)

Hello 小伙伴们,如果觉得本文还不错,记得给个 star , 你们的 star 是我学习的动力!GitHub 地址 本文涉及知识点: 防抖与节流 重绘与回流 浏览器解析 URL DNS 域名解析 TCP 三次握手与四次挥手 浏览器渲染页面 在本文中,jsliang 会讲解通过自我探索后关于上述知识点的个人理解,如有纰漏.疏忽或者误解,欢迎各位小伙伴留言指出. 如果小伙伴对文章存有疑问,想快速得到回复. 或者小伙伴对 jsliang 个人的前端文档库感兴趣,也想将自己的前端知识整理出来. 欢迎

javascript中的防抖与节流。

1.什么是防抖?它有什么作用? 什么是防抖?相信行入门的小白,甚至做了一段时间的程序员也不太理解是什么意思,我也是听了公开课才了解一点,现在和大家分享一下我的理解! 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.比如,在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕,请求的次数多了浏览器会造成卡

JS防抖和节流

对防抖和节流的一些理解,做一次记录.(之前项目中的需求是在输入框中输入内容之后,调接口返回值,然后不知道还有节流这波操作,然后就写了判断当鼠标失去焦点的时候调接口,后来大佬说可以使用节流来实现) 防抖和节流算起来应该属于性能优化的知识,但是处理不当或者是放任不管就容易引起浏览器卡死.就是在绑定scroll.resize这类事件时,当他发生时,被触发的频率非常高,间隔很近.如果事件中涉及到大量的位置计算.DOM操作.元素重绘等工作且这些工作无法在下一个scroll事件触发前完成,就会造成浏览器调帧

【源码】防抖和节流源码分析

前言 防抖.节流主要用于频繁事件触发,例如鼠标移动.改变窗口大小等.lodash等函数库具备相对应的api, _.debounce ._.throttle. 核心技术:闭包. 区别: 防抖, 连续触发, 第一次和最后一次触发有效 节流, 一段时间内仅触发一次(第一次) 本文以防抖函数为例, 详细说明. 实现 原理, 计时器存储状态. function debounce(fn, delay) { return function() { console.log(fn.timer, count2);