JS的防抖函数理解、手动封装

2023-11-13

1. 认识防抖函数

  • 当事件触发时,相应的函数并不会立即触发,而是会等待一定的时间;
  • 当事件密集触发时,函数的触发会被频繁的推迟;
  • 只有等待了一段时间也没有事件触发,才会真正的执行响应函数;

举个例子,防抖函数的引用场景:

  • 输入框中频繁的输入内容,搜索或者提交信息; 
  • 频繁的点击按钮,触发某个事件;
  • 监听浏览器滚动事件,完成某些特 定操作;
  • 用户缩放浏览器的resize事件;

在输入框频繁输入内容时,并不会输入一次就触发一次对应需要的操作,而是等待一定时间,待用户在这段时间内没有输入时,才会触发事件,就是通过防抖函数,实现在输入等待一段时间后,触发事件,不会频繁触发输入框的输入事件,这样很浪费性能,造成服务器的请求压力;

手写简单实现防抖函数:

function debounce(fn, delay) {
  // 定义一个定时器,保存上一次的定时器
  let timer = null
  const _debounce = function (...args) {
    // 取消上一次的定时器
    if(timer) clearTimeout(timer)
    // 延迟执行
    timer = setTimeout(() => {
      // 外部传入的真正要执行的函数
      fn.apply(this, args)
    }, delay)
  }
  return _debounce
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS的防抖函数理解、手动封装 的相关文章

  • 如何在同一命名空间内从函数 B 调用函数 A?

    假设我有命名空间 var Namespace A function alert Hello B function Call A from here do other stuff 在这个命名空间中 我想让A成为B的辅助函数 也就是说 A 永远
  • 如何在chartjs中绘制多个时间序列,其中每个时间序列都有不同的时间

    例如 我有两个时间序列 s1 2017 01 06 18 39 30 100 2017 01 07 18 39 28 101 and s2 2017 01 07 18 00 00 90 2017 01 08 18 00 00 105 我想在
  • 如何以 JavaScript 编程方式获取旋转的 svg 文本边界

    我正在动态渲染 SVG 图像并创建旋转文本 如果旋转的文本与其他文本重叠 我需要删除该文本 但我无法测量旋转的文本来创建边界并检查下一个标签文本区域 我创建了 3 个 SVG 元素来解释 SVG 1 显示重叠的文本 SVG 2 显示重叠的旋
  • 在承诺中运行同步函数

    我是 JS 和异步操作的新手 在使用express的nodeJS路由器中 我使用mongoose从mongo聚合了一些数据 该数据是每隔 15 分钟从不同站点收集的天气数据 我使用猫鼬聚合管道处理数据 以获取每小时数据并按每个站点进行分组
  • ExtJS 4 用于选择所选值的组合框事件

    由于某种原因 我需要知道用户何时从组合框中选择了值 即使它已经被选择 仅当用户选择未选择的项目时 选择 事件才起作用 我在组合框或选择器的文档中没有看到任何类似 itemclick 的事件 有任何想法吗 ComboBox uses 绑定列表
  • 如何抑制 IE9 window.close() 确认消息

    应用 window close 函数后 IE9 会引发 您正在查看的网页正在尝试关闭 消息 有没有办法在不更改应用程序代码的情况下 而是通过更改一些特定于 IE 的注册表项来抑制此消息 如果窗口不是由脚本打开的 IE 不允许在没有确认的情况
  • 基于 json 文件动态显示选择、复选框、日期选择器等

    对我之前的问题的补充 我根据 json 文件动态显示输入字段 现在我想根据它们的组显示选择项 复选框和日期选择器 我如何解决这个问题 我需要将这些元素推入computeJSON 但写入例如选择options item selection不管
  • 检测 SVGAnimatedString 的类名

    我在构建 SVG 地图时遇到问题 触发的功能 g 上的 onmouseover 不起作用 我当时用的 window onmouseover function e console log e target className 查看类名是否有问
  • 如何将js文件从同一文件夹导入chrome扩展中的background.js

    我在导入与 background js 脚本库 位于同一库中的文件 score js 时遇到问题 我对 js 和 chrome 扩展都很陌生 我研究了 require js 并做了这个 背景 html h1 Tab Manager h1
  • webpack 加载器并包含

    我是 webpack 的新手 我正在尝试了解加载器及其属性 例如测试 加载器 包含等 这是我在 google 中找到的 webpack config js 的示例片段 module loaders test js loader babel
  • 如何用方向键移动div

    我想使用 jQuery 用箭头键移动 div 所以右 左 下 上 找到了我想要完成的演示here http atomicrobotdesign com blog htmlcss move objects around the canvas
  • 在浏览器中打开的 .mhtml 文件中填写输入

    我想对 mhtml 文件运行 e2e 测试 即填写表格 在 mhtml 文件上查看和提取数据效果非常好 但我无法填写任何内容input字段 既不是手动也不是通过木偶操作者 你可以用这个试试 mhtml 文件 https gist githu
  • 如何从 WinRT StreamSocket 读取所有可用数据并清空 inputStream?

    我想在向套接字写入新数据之前读取当前正在等待套接字的所有数据 WinRT中的读取方法都是异步的 所以我不能简单地while直到套接字为空 由于我确实想丢弃套接字上的数据 因此我不想使用读取器 而是直接从套接字读取数据IInputStream
  • AngularJS 中的嵌套模块

    我有 2 个不同的 AngularJs 模块 一个 widgetContainer 和一个 widget 小部件可以显示为独立的应用程序 也可以包含在小部件容器中 一个 widgetContainer 包含 0 N 个 widget 如果我
  • 原型链、构造函数、继承

    我正在玩 javascript 原型 我是新手 所以我有一个小问题 我正在用这个article http mckoss com jscript object htm作为指导 我已经定义了产品和书籍 目的是什么Book prototype c
  • 允许在 Safari 上聊天应用程序使用 audio.play()

    由于苹果禁用了自动播放音频的功能HTMLMedia Element play https developer mozilla org en US docs Web API HTMLMediaElement play在没有用户交互的 java
  • 图像未显示在从 HTML 创建的 PDF 上

    我想动态创建 PDF 这意味着我将从 Google Drive 获取文件 然后将它们放入 HTML 代码中 并尝试从中创建 PDF 一切工作正常 除了图像没有显示 我现在正在做的是 从 HTML 字符串创建 HtmlOutput 获取该 H
  • ParseFromString 在 IE 中抛出错误,但在 Chrome 中不会抛出错误

    我正在使用传单的 KML 插件 该插件在 Google Chrome 中运行良好 然而 在 IE 中 它会在以下代码中引发错误 parser new DOMParser console log url outputs path to kml
  • 如何使用 Typescript 设置 Material-UI for React?

    我在将 Material UI 添加到我的 React 项目中时遇到了一些问题 该项目是用 Typescript 编程的 根据教程 我首先添加react tab event plugin import injectTapEventPlugi
  • 如何在画布中旋转图表同时保持数字垂直?

    我正在尝试围绕其中心旋转画布中的图表 同时保持字母直立 我正在尝试使用 ctx rotate 但它使用画布的左侧作为中心来旋转整个图表 以下链接提供了视觉效果 我希望它看起来像绿色 而不是红色 就像我的代码当前所做的那样 视觉解释 http

随机推荐

  • DEBUG

    UnicodeDecodeError utf 8 codec can t decode byte 0x80 in position 3131 invalid start byte解决办法 阿里drl binpacking使用TensorFl
  • paddlenlp调用ERNIE、使用ERNIEKIT

    目录 paddle调用ERNIE 安装paddle和paddlenlp 下载 加载ERNIE预训练模型 tokenizer 获取文本语义特征向量表示 ERNIEKIT实践 安装 配置nltk 下载ERNIEKIT源码 运行ERNIEKIT
  • C#的基础语法---15种基本数据类型

    1 c 的基本单元是class class 类 即指同一类对象的抽象化概念 类里面的所有东西叫做类成员 属性 方法 事件 2 属性类型 C 中的数据类型一共15种 整数型 8种 位 代表整数的取值范围 2的位数次方 求出来 1就是最大值 符
  • 深入浅出讲解IDS(入侵检测系统)

    一 什么是IDS IDS是英文 intrusion Detection Systems 的缩写 中文意思是 入侵检测系统 入侵检测系统 是一种对网络传输进行即时监视 在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备 专业上来讲 I
  • 我的创作纪念日-学习不止,笃行不怠

    机缘 平时的学习都会看很多视频教程 有一些会带ppt或者文稿 很多都没有 基本上都是猴子搬玉米 边学边忘 缺乏总结 就想尝试在CSDN上边学边记录 做总结 效果不错 在 CSDN 上学习并记录总结的具体方法如下 注册 CSDN 账号并登录
  • wsl2 安装ubuntu已经开启vt(虚拟化)仍然报错0x80370102

    一条命令 Enable WindowsOptionalFeature Online FeatureName VirtualMachinePlatform
  • 丰田一页纸极简思考法excel1+logic3

    公司书柜中无意get到的 因为当时对 思维 比较感兴趣 然后这本本图表内容多 书薄字少 就想着借出来看了 中午饭空的时间用了大概一个小时的样子 可以读一大半 废话了这么多 分享下这本书的内容吧 在丰田公司 有一个不成文的要求 不论是会议纪要
  • C语言中setjmp和longjmp函数

    C语言中setjmp和longjmp函数 setjmp和longjmp是C语言独有的 只有将它们结合起来使用 才能达到程序控制流有效转移的目的 按照程序员的预先设计的意图 去实现对程序中可能出现的异常进行集中处理 先来看一下这两个函数的定义
  • truncate mysql批量删除表的数据

    模板拼接执行语句 SELECT CONCAT truncate TABLE table schema TABLE NAME FROM INFORMATION SCHEMA TABLES WHERE table schema IN db na
  • 一文读懂如何配置Linux权限

    配置 var tmp fstab权限 Linux中权限是指控制用户或进程对文件或目录的访问 修改或执行的权限 Linux中有3种权限 读取权限 read 写入权限 write 执行权限 execute 权限是用数字表示的 有三位 每一位表示
  • Unity 控制摄像机镜头的上下左右移动

    private float FollowPosx FollowPosy private float moveAmount 5 控制镜头的移动速度 Update is called once per frame void Update if
  • linux 线程优先级设置

    include
  • 用iframe完美嵌入

  • SpringBoot秒杀系统实战13-秒杀商品详情页+秒杀倒计时功能实现

    程序鹏 于 2020 05 08 00 00 00 发布 1326 收藏 4 分类专栏 Spring Boot 秒杀系统 文章标签 java spring boot web 版权 Spring Boot 同时被 2 个专栏收录 29 篇文章
  • LeetCode【28】实现 strStr()

    题目 实现 strStr 函数 给定一个 haystack 字符串和一个 needle 字符串 在 haystack 字符串中找出 needle 字符串出现的第一个位置 从0开始 如果不存在 则返回 1 示例 1 输入 haystack h
  • 使用Python的requests库发送HTTPS请求时的SSL证书验证问题

    问题描述 使用python的requests库去发送https请求 有时候不设置verify False不报错 有时候又报错 问题原因 使用Python的requests库发送HTTPS请求时 设置verify False参数可以跳过SSL
  • java设置有时效的变量_java设置全局变量

    图片来源于网络 如有侵权请联系删除 前言 java系统自带的api很多 而设置全局变量也是有在System对象中一个具体的方法 而Springboot启动类一层层递进的过程中就有使用该方法来存储全局变量 1 实例 在Springboot中的
  • MAC Unity安装教程

    缘起 这边app要做一个简单调研 验证是否可以利用unity改善app中h5页面需要展示的3d和复杂报表效果 于是就此开始了调研 这边只是想简单将unity集成到工程中 然后想办法嵌入h5来进行展示测试 安装地址 https unity3d
  • Java:字符串中a出现的次数

    1 问题描述 求字符串 abcguegduauwdakolaa 中a出现的次数 2 题解 2 1 题解一 思路 每次返回当前下标 使用indexOf求当前下标的后一位到字符串结束出现的第一个a的下标 String s abcguegduau
  • JS的防抖函数理解、手动封装

    1 认识防抖函数 当事件触发时 相应的函数并不会立即触发 而是会等待一定的时间 当事件密集触发时 函数的触发会被频繁的推迟 只有等待了一段时间也没有事件触发 才会真正的执行响应函数 举个例子 防抖函数的引用场景 输入框中频繁的输入内容 搜索