防抖debounce和节流throttle

大纲

一、出现缘由

二、什么是防抖debounce和节流throttle

三、应用场景

3.1防抖

3.2节流

一、出现缘由

前端开发中,有一部分用户行为会频繁触发事件,而对于DOM操作,资源加载等耗费性能的处理,很可能导致卡顿,甚至浏览器崩溃,防抖和节流就是为了这一类的问题出现的前端优化技术。

二、什么是防抖debounce和节流throttle

防抖debounce是函数在规定延迟时间内不被调用,才能再次被调用,如果在规定时间内调用,延迟重新开始计算;

节流throttle是在规定的延迟时间间隔后,函数才执行一次,以固定的频率被触发。

三、简单实现

3.1防抖

连续触发事件的时候,不会有任何反应,停止触发事件的多少秒,就会执行,在延迟时间内执行函数,就重新开始一个定时器。

 

function debounce(func,delay=300,timer=null){return (...args){clearTimeout(timer);timer=setTimeout(func.bind(null,...args,delay);)}
}
function query(){//ajax
}
input.addEventListener('keyup',debounce(query))

 

  

 

3.2节流

触发事件的时候,执行一个函数,在之后的一段时间内进这个函数,会被return,真正的逻辑不能执行,定时器在一定时间后重置开关,再进来就能再次执行真正的逻辑了。

 

function throttle(func,delay=60){let lock=false;return (...args)=>{if(lock)reutrn;function(..args);lock=true;setTimeout(()=>lock=false,delay);}
}
function query(){//ajax
}
decument.addEventListener('scroll',throttle(query));

 

  

 

四、应用场景

3.1防抖throttle的应用场景

防抖适用于window.onscroll事件,等到拉动动作结束后再触发一个事件,或者拖拽

 

    _.throttle=function(func,wait,options){var context,args,result;var timeout=null;var previous0;if(!options)options={}var later=function(){previous=options.leading===false:0:new Date();timeout=null;result=func.apply(context,args);if(!timeout)context=args=null;}return fucntion(){var now=new Date();if(!previous && option.leading===false)previous=now;var remaining=wait-(now-previous);context=this;args=arguments;if (remaining <= 0 || remaining > wait) {if (timeout) {clearTimeout(timeout);timeout = null;}previous = now;result = func.apply(context, args);if (!timeout) context = args = null;} else if (!timeout && options.trailing !== false) {timeout = setTimeout(later, remaining);}return result;}}

 

  

 

3.2节流throttle的应用场景

下面具体讲一个例子

假设我们网站有一个搜索框,用户输入文本我们自动会联想匹配除一些结果供用户选择,我首先想到的做法是监听keypress事件或change事件,然后ajax请求数据,但是当用户快速输入的时候,就会瞬间触发一连串的请求,这无疑不是我们想要的,我们想要的是用户停止输入的时候才去触发查询的请求,这时候函数防抖可以帮助我们。

 

_.throttle=function(func,wait,immediate){var timeout,args,context,timestamp,result;var later=function(){  //如果没有超过等待时间,就接着设置一个定时器,时间是delay的时间减去方法执行的时间var last=new Date().getTime() - timestamp;if(last<wait && last>=0){timeout=setTimeout(later,wait-last);}else{   //如果已经过wait时间了,就直接清除定时器,给result赋值clearTimeout(timeout);if(!immediate){result=func.apply(context.args);if(!timeout)context=args=null;}}}return function(){context=this;args=arguments;timestamp=new Date().getTime();var callNow=immediate && timeout;    //如果是立即执行或者之前执行过还没过延迟时间if(!timeout)timeout=setTimeout(later,wait);   //如果之前没执行过,现在开始定时任务,如果执行过,timeout存在,就返回个空的result.if(callNow){   //如果是立即执行,就立即执行fn,这时候console.log(1);result=func.apply(context,args);context=args=null;}return result;}}function query(){//ajaxconsole.log('ajax');}$("#search").keypress(_.throttle(query,300));

 

  

 

转载于:https://www.cnblogs.com/learnings/p/9543782.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同vlan之间如何ping通_【丰润达.安防百科】如何实现交换机不同VLAN、不同网段之间互访?...

交换机如何实现不同网段的互访&#xff1f;这个交换机完全可以实现&#xff0c;在实际项目中&#xff0c;交换机实现不同网段的互访用的也比较多&#xff0c;那么今天我们一起来看下。▎同一个vlan中&#xff0c;不同网段的主机如何互通同一个vlan&#xff0c;不同网段的主机如…

oracle字段加约束,Oracle数据库的字段约束创建和维护示例

创建Oracle数据库的字段约束&#xff1a;非空约束唯一约束对字段的取值的约束默认值外键约束create table tab_class(class_id number primary key,class_name varchar2(10) not null unique);create table tab_stu(stu_id number,--学生姓名&#xff0c;不能为空&#xff0c;不…

实例5:python

#输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 l [] for i in range(3): x int(input(‘integer:\n’)) l.append(x) l.sort() print (l)

python识别节假日_Python3自动签到 定时任务 判断节假日的实例

不废话&#xff0c;直接上代码Python3.6签到代码&#xff0c;只需修改url&#xff0c;账号&#xff0c;密码即可&#xff0c;此处是登录时无验证登录&#xff0c;有验证码的自行补充# -*- coding:utf-8 -*-import jsonimport urllib.requestimport datetime# 模拟浏览器打开网站…

[BZOJ 5074] 小B的数字

题目传送-BZOJ5074 题意&#xff1a; T组数据 你有一个数组\(A\)&#xff0c;要求一个数组\(B\)\(B\)中的数都是2的正整数次幂。 令\(x\prod_{i1}^nB_i\),有\(x|B_i^{A_i},i\in1,2,3,...,n\)成立\(T \le 10,n \le 100000\) 题解&#xff1a; 首先\(B\)可以直接转化为每个元素的…

matlab数学实验第七章课后答案,matlab数学实验第七章答案

参考答案如下[单选,共用题干题] 患者男性&#xff0c;数学实验35岁&#xff0c;数学实验4天前因不慎划破皮肤后出现高热、皮肤瘀斑来院。查体&#xff1a;体温39.1℃&#xff0c;血压110&#xff0f;70mmHg&#xff0c;呼吸30次&#xff0f;分&#xff0c;心率107次&#xff0f…

Python List sort()方法

描述 sort() 函数用于对原列表进行排序&#xff0c;如果指定参数&#xff0c;则使用比较函数指定的比较函数。 语法 sort()方法语法&#xff1a; list.sort(cmpNone, keyNone, reverseFalse) 参数 • cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。 • key –…

oracle sql-1,Oracle – Oracle SQL(1)

Oracle – Oracle SQL(1)1. 简介(1) SQL : Structured Query Language&#xff0c;结构化查询语言&#xff0c;专门用于数据存取、数据更新及数据库管理等操作。(2) Oracle SQLDDL: Data Define Language数据定义语言包括CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME等命令…

背景图层和普通图层的区别_008Photoshop四赞图层(图层样式)

图层过滤器图层滤镜&#xff0c;比如你只想看到像素图层&#xff0c;选择像素图层过滤器&#xff0c;这时就只能看到背景图层了(在图层面板)&#xff0c;如果再点击像素图层过滤器&#xff0c;其他图层又出现了。选中调整图层过滤器&#xff0c;就只能看到图层结构里的调整图层…

洛谷P3628 [APIO2010]特别行动队(斜率优化)

传送门 先写出转移方程$$dp[i]max\{dp[j]a*(sum[i]-sum[j])^2b*(sum[i]-sum[j])c\}$$ 假设$j$比$k$更优&#xff0c;则有$$dp[j]a*(sum[i]-sum[j])^2b*(sum[i]-sum[j])c>dp[k]a*(sum[i]-sum[k])^2b*(sum[i]-sum[k])c$$ 展开&#xff0c;并消去同类项之后得$$dp[j]-2*a*sum[i…

实例6:python

#斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;0、1、1、2、3、5、8、13、21、34、……。 #F0 0 (n0) #F1 1 (n1) #Fn F[n-1] Fn-2 #!/usr/bin/python -- coding: UTF-8 -- #def fib(…

简述oracle的主要数据库对象,Oracle数据库数据对象分析

Oracle数据库数据对象分析Oracle数据库数据对象中最基本的是表和视图&#xff0c;其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。表和视图Oracle中表是数据存储的基本结构。…

vue devtools面板没有显示_vue 基础入门(四)

vue 基础入门(四)1.全局配置Vue.config 是一个对象&#xff0c;包含 Vue 的全局配置。可以在启动应用之前修改下列 property&#xff1a;1.1 silent类型&#xff1a;boolean默认值&#xff1a;false用法&#xff1a;Vue.config.silent true❝取消 Vue 所有的日志与警告。❞1.2…

SpaceVim 语言模块 lua

原文连接&#xff1a; https://spacevim.org/cn/layers/lang/lua/ 模块简介启用模块快捷键 交互式编程运行当前脚本模块简介 这一模块为在 SpaceVim 中进行 lua 开发提供了支持&#xff0c;包括代码补全、语法检查、代码格式化、交互式编程以及调试等特性。 启用模块 可通过在配…

python之def

1.def &#xff08;define的前三个字母&#xff09;是一个关键字&#xff0c;用来声明函数。 2.def 声明函数的格式为&#xff1a; def 函数名(参数1&#xff0c;参数2&#xff0c;…&#xff0c;参数n)&#xff1a; 函数体 例如&#xff1a; def fib(n): print ‘n ’, n if n…

php pdo 00000,php-即使有错误,PDO错误代码也总是00000

我使用PHP 7.1.23测试了以下代码&#xff1a;$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);$sth $pdo->prepare(select now() and this is a bad sql where a - b from c);if ($sth false) {echo "error on prepare()\n";print_r($pdo->errorInf…

vue 生命周期_Vue生命周期小白看了都会的

最近一直在学习Vue&#xff0c;而vue生命周期是我们不可能绕开的一个很核心的知识点&#xff0c;今天来简单的梳理一下大概的内容。一、钩子函数在一开始学习的时候&#xff0c;总有钩子函数这个名词冒出来&#xff0c;而且在vue官网文档中也频繁出现&#xff0c;也相信给很多初…

Mac/Ubuntu 上编译、搭建 WebRtc/licode 服务器

1.下代码 git clone https://github.com/ging/licode.git cd licode 2.安装依赖 2.1 配置ubuntu开发环境&#xff1a; 2.1.1 安装C/C开发环境 1. sudo apt-get -y install build-essential //安装主要编译工具 gcc, g, make 2. sudo apt-get -y install autoconf automake1.9 3…

实例7:python

#将一个列表的数据复制到另一个列表中。 #程序分析&#xff1a;使用列表[:]。 #程序源代码&#xff1a; #!/usr/bin/python -- coding: UTF-8 -- #a [1, 2, 3] #b a[:] #print (b) #import copy #a [1, 2, 3] #bcopy.copy(a) #print(b) #[1, 2, 3] #使用 Python3 的参…

Python3 字典 copy()方法

描述 Python 字典 copy() 函数返回一个字典的浅复制。 语法 copy()方法语法&#xff1a; dict.copy() 参数 • NA。 返回值 返回一个字典的浅复制。 实例 以下实例展示了 copy()函数的使用方法&#xff1a; 实例 #!/usr/bin/python3 dict1 {‘Name’: ‘Runoob’, ‘Age’: 7,…