首页 > 其他分享 >能不能实现事件的防抖和节流?

能不能实现事件的防抖和节流?

时间:2024-12-17 17:09:39浏览次数:9  
标签:function 防抖 节流 args let 事件 context now fn

节流

节流的核心思想: 如果在定时器的时间范围内再次触发,则不予理睬,等当前定时器完成,才能启动下一个定时器任务。这就好比公交车,10 分钟一趟,10 分钟内有多少人在公交站等我不管,10 分钟一到我就要发车走人!

代码如下:

function throttle(fn, interval) {
  let flag = true;
  return function(...args) {
    let context = this;
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn.apply(context, args);
      flag = true;
    }, interval);
  };
};

写成下面的方式也是表达一样的意思:

const throttle = function(fn, interval) {
  let last = 0;
  return function (...args) {
    let context = this;
    let now = +new Date();
    // 还没到时间
    if(now - last < interval) return;
    last = now;
    fn.apply(this, args)
  }
}

防抖

核心思想: 每次事件触发则删除原来的定时器,建立新的定时器。跟王者荣耀回城功能类似,你反复触发回城功能,那么只认最后一次,从最后一次触发开始计时。

 
function debounce(fn, delay) {
  let timer = null;
  return function (...args) {
    let context = this;
    if(timer) clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  }
}

双剑合璧——加强版节流

现在我们可以把防抖节流放到一起,为什么呢?因为防抖有时候触发的太频繁会导致一次响应都没有,我们希望到了固定的时间必须给用户一个响应,事实上很多前端库就是采取了这样的思路。

function throttle(fn, delay) {
  let last = 0, timer = null;
  return function (...args) {
    let context = this;
    let now = new Date();
    if(now - last < delay){
      clearTimeout(timer);
      setTimeout(function() {
        last = now;
        fn.apply(context, args);
      }, delay);
    } else {
      // 这个时候表示时间到了,必须给响应
      last = now;
      fn.apply(context, args);
    }
  }
}

 

标签:function,防抖,节流,args,let,事件,context,now,fn
From: https://www.cnblogs.com/cdyun/p/18612966

相关文章

  • SpringBoot 自定义事件
    在SpringBoot中,自定义事件和监听器是一种强大的机制,允许你在应用程序的不同部分之间进行解耦通信。你可以定义自定义事件,并在需要的时候发布这些事件,同时让其他组件通过监听器来响应这些事件。以下是如何在SpringBoot中创建和使用自定义事件的基本步骤:1.定义自定义事件......
  • Delphi 在窗体界面显示之后执行事件 AfterShow
    正常情况下,需要在启动之后直接执行某事件,一般会将函数放在Create或者OnShow里面。但是,这种情况下,当事件耗时较久是,界面会迟迟不肯出现,只能等待Create喝OnShow执行完毕之后才会显示。为了能够在界面能够先出现,然后运行需要的事件,可以使用消息的机制自定义添加一个AfterShow的函数......
  • Qt事件系统
    一、Qt事件简介:1、事件是对应用程序内部或者外部产生的事情或者动作的通称。2、Qt程序是事件驱动的,Qt事件的产生和处理是程序运行的主线,存在于程序的整个生命周期。3、Qt事件被封装为对象,所有的Qt事件均继承自抽象类QEvent。4、常见的事件如下:(1)键盘事件:QKeyEv......
  • 两招玩转阿里云系统事件监控
    作者:田异常(昔今)背景介绍在当今快速发展的数字化时代,IT系统和应用程序对业务运营至关重要。为了确保顺畅的性能、可靠性和安全性,IT团队依靠监控事件来实时检测、分析和响应问题。监控事件是指任何影响IT系统正常运作的事件,例如服务器崩溃、网络中断或应用程序错误。这些事件......
  • 浏览器中的剪切板是如何监听复制事件的?
    在前端开发中,监听浏览器剪切板的复制事件主要通过JavaScript的某些API和功能来实现。以下是具体的方法和步骤:使用ClipboardAPI:ClipboardAPI提供了读取和写入剪切板内容的能力。虽然直接读取剪切板内容可能受到浏览器的安全限制,但监听复制事件并修改剪切板内容是可行的。......
  • 添加原生事件如果不移除为什么会内存泄露?
    在前端开发中,添加原生事件监听器后不移除可能会导致内存泄漏。这主要是因为事件监听器会占用内存,并且如果不手动移除,它们会一直存在,即使相关的DOM元素已经被销毁或不再需要。以下是几个关键点来解释为什么这会导致内存泄漏:持续占用内存:当给DOM元素添加事件监听器时,浏览器会为该......
  • SQL优化之《预警事件统计》
    在做一件什么事情:在首页大屏上,可以通过各种维度展示事件统计信息。sql如下:点击查看代码SELECTcount(*)count,camera_codegroupNameFROMalarm_eventWHEREalarm_event.illegal_tag="24"ANDalarm_event.organization_code......
  • 鸿蒙交互事件开发01——点击/拖拽/触摸事件
    1概  述事件是人机交互的基础,鸿蒙开发中,事件分为两大类:a)通用事件;b)手势事件。......
  • GameMaker Studio开发:高级动作系统_动作事件的高级应用:触发与响应
    动作事件的高级应用:触发与响应在上一节中,我们讨论了如何在GameMakerStudio中设置基本的动作事件。这一节,我们将深入探讨如何利用这些事件进行更高级的触发与响应机制,以实现更复杂的游戏逻辑。通过学习本节内容,您将能够:理解不同类型的事件及其触发条件。掌握如何在事件......
  • 委托(Delegate)与事件(Event)-(上篇)
    C#中的委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数传递给其他方法,并且可以用来实现回调机制。委托是C#中实现事件处理、异步编程以及面向对象设计模式的重要工具之一。在C#中,委托被定义为引用类型,所有的委托都派生自System.Delegate类。一、定义委托定义一个......