当前位置:网站首页>js防抖函数和函数节流的应用场景
js防抖函数和函数节流的应用场景
2022-08-02 09:22:00 【猿码当先】
防抖函数
防抖函数的定义:当事件触发完成之后再延迟触发,并且只触发一次,如果在触发之前再次触发,则会再次刷新延迟。
防抖函数的妙就妙在在触发后,会延迟触发,如果下次触发在这延迟时间中触发,则会重新设置延迟,大大的提高了效率
function debounce(callback,time = 300){
let t = 0;
return function(){
clearTimeout(t);
t = setTimeOut(callback,time);
}
}
防抖函数应用在滚动条滑动事件
先来看不定义防抖函数时——定义一个滚动条滚动事件--当鼠标滑动时,判断滚动条距离顶部的距离,若小于某个值则隐藏,若大于某个值则显示
window.onscroll = function(){
let num = document.body.scrollTop || document.documentElement.scrollTop;
console.log("调用一次");
if(parseInt(num) > 300){
document.getElementById("imgs").style = "display:block";
}else{
document.getElementById("imgs").style = "display:none";
}
};
可以看到,鼠标轻轻一滑动,函数就会被调用这么多次。调用n次,就会有不知的n*n次判断,显然,这样的效率太低了。
再来看一下用到防抖函数。
//防抖函数
function debounce(callback,time=300){
let t;
return function(){
clearTimeout(t);
t = setTimeout(callback,time);
}
}
window.onscroll = debounce(returntop,300);
//
function returntop(){
console.log("调用一次");
let num = document.body.scrollTop || document.documentElement.scrollTop;
if(parseInt(num) > 300){
document.getElementById("imgs").style = "display:block";
}else{
document.getElementById("imgs").style = "display:none";
}
}
window.onscroll = debounce(returntop,300);
给鼠标滚动事件绑定函数debounce(returntop,300)
而在代码执行的过程中,debounce函数先会被调用一次。这样,实则鼠标滚动事件绑定的函数是debounce函数返回的函数。
这样一来,每当鼠标滑动一次之后,会在time时间之后,再进行判断回到顶部图标是否要隐藏还是展示,若是在time时间内再次滑动,则会清除上次的延迟,再来一个新的延迟。这样,代码的效率将会大大提升。
防抖函数还可以应用于搜索框(如百度),文本编辑器的自动保存。原理与上相同。
函数节流
函数节流原理:如果连续连续触发时间,每隔一段时间才会触发一次,中间连续的触发不会被执行。
function throlle(callback,time=300){
let oldtime = new Date().getTime();
return function(){
let now = new Date().getTime();
if(now - oldtime > time){
callback();
oldtime = now;
}
}
}
应用在登录按钮——如果不设置函数节流,那么当用户连续点击登录时,后台就要接受n次,这样后台服务器的压力就会大大的激增。
若给登录按钮点击事件绑定函数节流,
例:document.getElementById("").οnclick= throlle(login,5000);
function login(){...}
给登录函数绑定节流函数,点击事件绑定其实是throlle函数返回的函数,执行代码时thtolle函数先被调用,获取一个时间戳,若是点击事件发生,则再获取一个时间戳,若是两值之差大于time则才会调用login函数,若小于则login函数不会被执行,这样就避免了用户连续点击登录给服务器带来的压力。
函数节流同样也可以应用到滚动条监听事件。
区别
函数节流不管事件触发有多频繁,都会保证在规定事件内一定会执行一次真正的事件处理函数,而防抖函数只是在最后一次事件后才触发一次函数。
边栏推荐
猜你喜欢
Bigder:41/100生产bug有哪些分类
线程池的使用及ThreadPoolExecutor源码分析
uvm-phase机制
In the whole development of chi V853 board tried to compile QT test
李航《统计学习方法》笔记之朴素贝叶斯法
干货|如何在海量文件系统中选择合适自己的文件系统
自定义View实现波浪荡漾效果
曲折的tensorflow安装过程(Tensorflow 安装问题的解决)
Tencent T8 architect, teach you to learn small and medium R&D team architecture practice PDF, senior architect shortcut
李航《统计学习方法》笔记之感知机perceptron
随机推荐
In the whole development of chi V853 board tried to compile QT test
新起点丨MeterSphere开源持续测试平台v2.0发布
Jenkins--基础--6.2--Pipeline--语法--声明式
Implementation of mysql connection pool
Overview of Edge Computing Open Source Projects
【微信小程序2】事件绑定
CFdiv2-The Number of Imposters-(两种点集图上染色问题总结)
了解下C# 多线程
node封装一个图片拼接插件
Jenkins--基础--6.3--Pipeline--语法--脚本式
ABAP 和json转换的方法
net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。
裁员趋势下的大厂面试:“字节跳动”
Re22:读论文 HetSANN An Attention-based Graph Neural Network for Heterogeneous Structural Learning
Jenkins--部署--3.1--代码提交自动触发jenkins--方式1
瑞吉外卖项目剩余功能补充
[Must read] Mylander valuation analysis, electrical stimulation products for pelvic and postpartum rehabilitation
C语言volatile关键字、内嵌汇编volatile与编译器的爱恨情仇
恋爱十不要
Nodejs3day(express简介,express创建基本Web服务器,托管静态资源,nodemon下载及出现的问题,中间件,编写GET,POST,JSONP接口)