JS的防抖和节流

目录

防抖

搜索框带来的问题

实现的思路

案例

封装防抖函数

节流

滚动条加载带来的问题

实现的思路

案例

封装节流函数


防抖

搜索框带来的问题

需求:根据输入框内容来请求数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input id="searchTxt" type="search" placeholder="请输入关键字检索">
    <script>
        document.querySelector("#searchTxt").oninput = function(){
            console.log('发送请求,当前输入框值:',this.value)
        }
    </script>
</body>
</html>

上面的代码会带来一个问题:用户每输入一个关键字都会触发

现在是要求是用户停下来不输入的时候再触发一次,这个时候就需要用到防抖函数了

实现的思路

  1. 事件函数执行,先创建个定时器

  2. 逻辑代码放到定时器

  3. 当函数再次触发,清除定时器

  4. 创建一个新定时器即可

案例

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <input id="searchTxt" type="search" placeholder="请输入关键字检索">
     <script>
         let t = null
         document.querySelector("#searchTxt").oninput = function(){
             clearTimeout(t) //有定时器则清除
             t = setTimeout(() => {
                 console.log('发送请求,当前输入框值:',this.value)
             }, 1000);
         }
     </script>
 </body>
 </html>

封装防抖函数

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
 </head>
 <body>
     <input id="searchTxt" type="search" placeholder="请输入关键字检索">
     <script>
         document.querySelector("#searchTxt").oninput = debounce(function(){
             console.log('发送请求,当前输入框值:',this.value)
         })
         //封装一个公共的防抖函数
         function debounce(fn){//将函数逻辑放入fn中
             let t = null //此处利用闭包保存定时器
             return function(){
                 clearTimeout(t) //有定时器则清除
                 t = setTimeout(() => {
                     //箭头函数指向外面函数的this,而外面函数由input触发
                     fn.call(this) //利用call改变fn的this,否则fn的this为undefined
                 }, 1000);
             }
         }
     </script>
 </body>
 </html>

节流

滚动条加载带来的问题

需求:页面滚动时,加载数据列表

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
     <style>
         .box{
             height: 1000px;
         }
     </style>
 </head>
 <body>
     <div class="box">
 ​
     </div>
     <script>
         document.onscroll = function(){
             console.log('发送ajax,请求下一页数据')
         }
     </script>
 </body>
 </html>

上面的代码会带来一个问题:用户轻轻下拉滚动条,onscroll中的逻辑会触发很多次

现在是要求是降低触发事件的频率,这个时候就需要用到节流函数了。

实现的思路

  1. 事件函数执行,先判断是否有定时器,有则直接return

  2. 把逻辑代码放到定时器

  3. 定时器执行后,置空定时器变量

  4. 事件函数执行时,再创建一个新的定时器

案例

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
     <style>
         .box{
             height: 1000px;
         }
     </style>
 </head>
 <body>
     <div class="box"></div>
     <script>
         let t = null
         document.onscroll = function(){
             if(null != t) return //关键点1:有定时器则return
             t = setTimeout(() => {//关键点2:逻辑代码放到定时器中
                 console.log('发送ajax,请求下一页数据')
                 t = null  //关键点3:定时器执行完毕,置空定时器变量
             }, 500);
         }
     </script>
 </body>
 </html>

封装节流函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            height: 1000px;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        
        document.onscroll = throttle(function () {
            console.log('发送ajax,请求下一页数据',this)
        })

        //封装一个节流函数
        function throttle(fn) {
            return function(){	//真正的事件处理函数(this:事件源)
                //这里用的是fn.t变量的形式来保存定时器变量
                if(null != fn.t) return 
                fn.t = setTimeout(() => { 
                    fn.call(this)
//确保上面的函数中this关键字是事件源(如果用fu()调用,上面this就变成了window)
                    fn.t = null	
//置空,让事件再次触发的时候,重新创建一个定时器
                }, 500);
            }
        }
    </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ElementUI封装的下拉树选择可搜索单选多选清空功能

效果&#xff1a; 组件代码 /*** 树形下拉选择组件&#xff0c;下拉框展示树形结构&#xff0c;提供选择某节点功能&#xff0c;方便其他模块调用* author wy* date 2024-01-03 * 调用示例&#xff1a;* <tree-select * :height"400" // 下拉框中树形高度* …

mysql原理--事务

1.事务的起源 对于大部分程序员来说&#xff0c;他们的任务就是把现实世界的业务场景映射到数据库世界。比如银行为了存储人们的账户信息会建立一个 account 表&#xff1a; CREATE TABLE account (id INT NOT NULL AUTO_INCREMENT COMMENT 自增id,name VARCHAR(100) COMMENT …

JVM之内存模型、运行时的数据区域的划分、java的程序计数器作用等

JVM JVM内存模型运行时数据区域划分程序计数器&#xff08;Program Counter Register&#xff09; JVM内存模型 ​ 对于Java程序来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像C/C程序开发程序员这样每一个new操作去写对应的delete/free操作&#xff0c;不…

大语言模型LLM微调技术:Prompt Tuning

1 预训练语言模型概述 1.1 预训练语言模型的发展历程 截止23年3月底&#xff0c;语言模型发展走过了三个阶段&#xff1a; 第一阶段 &#xff1a;设计一系列的自监督训练目标&#xff08;MLM、NSP等&#xff09;&#xff0c;设计新颖的模型架构&#xff08;Transformer&#…

在 docker 容器中配置双网卡,解决通讯的问题

目录 1. 查看当前网络信息 2. 创建自定义网络桥 3. 创建双网卡模式 4. 删除默认网卡 已经创建好了的 Docker 容器&#xff0c;要修改它的IP比较麻烦&#xff0c;网上找了几种不同的方法&#xff0c;经过试验都没有成功&#xff0c;下面通过配置双网上来解决 IP 的问题。…

vue3.x 的生命周期和钩子函数

什么是生命周期 Vue 是组件化编程&#xff0c;从一个组件诞生到消亡&#xff0c;会经历很多过程&#xff0c;这些过程就叫做生命周期。 你理解了什么是生命周期&#xff0c;你还了解一个概念“钩子函数”。 钩子函数&#xff1a; 伴随着生命周期&#xff0c;给用户使用的函数&…

TypeScript接口、对象

目录 1、TypeScript 接口 1.1、实例 1.2、联合类型和接口 1.3、接口和数组 1.4、接口和继承 1.5、单继承实例 1.6、多继承实例 2、TypeScript 对象 2.2、对象实例 2.3、TypeScript类型模板 2.4、鸭子类型&#xff08;Duck typing&#xff09; 1、TypeScript 接口 接口…

21.串的处理

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.nextLine();char[] c str.toCharArray();int n c.length;StringBuilder st new StringBuilder();int i 0;while(i<n)…

element-ui组件DatePicker日期选择器移动端兼容

element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…

git打tag以及拉取tag

场景&#xff1a;某次git代码发布后定版记录&#xff0c;将发版所在的commit时候代码打上tag记录&#xff0c;方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …

[Flutter]WebPlatform上运行遇到的问题总结

[Flutter]WebPlatform上运行遇到的问题总结 目录 [Flutter]WebPlatform上运行遇到的问题总结 写在开头 正文 Q1、file_version_info.dart Q2、不兼容判断 Q3、跨域问题 Q4、flutter clean &#xff0c;无法删除build文件夹 其他 写在结尾 写在开头 Flutter项目已能在…

初中数学:几何题的相关解题原则总结

一、多问类型的几何题 我们做题&#xff0c;应该都遇到过这类几何题目&#xff0c;就是&#xff0c;三个小问&#xff0c;每个小问对应一个几何图像&#xff0c;而且&#xff0c;渐渐复杂。这种题目&#xff0c;大多数有一个变化的条件&#xff0c;比如&#xff0c;动点、角度…

C语言的前置声明

前置声明主要用于类与类之间的循环引用&#xff0c;且只是针对类指针或者引用有效&#xff0c;对完整的类字段无效。如下代码所示&#xff1a; #include <iostream> using namespace std;class B; class C;class A { public:B *b;C c; ///< 错误写法C* c1; ///< 正…

mongodb基本命令操作

1.创建数据库 语法 use 数据库名字例如:创建hero数据库 use hero查询当前数据库 db如果想查询所有的数据库 show dbs发现并没有刚刚创建的数据库,如果要显示创建的数据库,需要向表中插入一条记录 db.hero.insert({name: "zs",age: 20,country: "china&quo…

【论文精读】A Survey on Large Language Model based Autonomous Agents

A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…

easyrecovery16 (硬盘数据恢复软件)免费版

EasyRecovery是由球著名数据厂商Kroll Ontrack出品的一款便捷实用&#xff0c;功能强大的硬盘数据恢复软件。它能够全面恢复删除丢失数据&#xff0c;支持包括文档、表格、图片、音视频等各种文件类型。支持恢复不同存储介质数据&#xff1a;硬盘、光盘、U盘/移动硬盘、数码相机…

Docker、Docker-compose安装

安装Docker 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …

一张图告诉你商标和版权的区别

版权和商标之间存在以下关系&#xff1a; 1.关联性&#xff1a;版权和商标权均为知识产权&#xff0c;受相关法律保护。 2.区别性&#xff1a;版权自动产生&#xff0c;且作用于已经完成的作品&#xff0c;而商标专用权需要注册取得&#xff0c;且作用于商标标识。 此外&…

算法通关村第二十关-黄金挑战图的常见算法

大家好我是苏麟 , 今天聊聊图的常见算法 . 图里的算法是很多的&#xff0c;这里我们介绍一些常见的图算法。这些算法一般都比较复杂&#xff0c;我们这里介绍这些算法的基本含义&#xff0c;适合面试的时候装*&#xff0c;如果手写&#xff0c;那就不用啦。 图分析算法&#xf…