防抖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(){
//ajax
console.log('ajax');
}
$("#search").keypress(_.throttle(query,300));
防抖debounce和节流throttle的更多相关文章
- js 函数的防抖(debounce)与节流(throttle)
原文:函数防抖和节流: 序言: 我们在平时开发的时候,会有很多场景会频繁触发事件,比如说搜索框实时发请求,onmousemove, resize, onscroll等等,有些时候,我们并不能或者不想频 ...
- js 函数的防抖(debounce)与节流(throttle) 带 插件完整解析版 [helpers.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 函数防抖与节流是做什么的?下面进行通俗的讲解. 本文借鉴:h ...
- Java版的防抖(debounce)和节流(throttle)
概念 防抖(debounce) 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定时间到来之前,又触发了事件,就重新开始延时. 防抖,即如果短时间内大量触发同一事件,都会 ...
- js 防抖 debounce 与 节流 throttle
debounce(防抖) 与 throttle(节流) 主要是用于用户交互处理过程中的性能优化.都是为了避免在短时间内重复触发(比如scrollTop等导致的回流.http请求等)导致的资源浪费问题. ...
- 防抖(Debounce)与节流( throttle)区别
http://www.cnblogs.com/ShadowLoki/p/3712048.html http://blog.csdn.net/tina_ttl/article/details/51830 ...
- JavaScript 防抖(debounce)和节流(throttle)
防抖函数 触发高频事件后,n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 /** * * @param {*} fn :callback function * @param {* ...
- C#.Net下的防抖-Debounce和节流阀-Throttle功能实现
C#下的防抖-Debounce.节流阀-Throttle功能实现 防抖-Debounce 连续的多次调用,只有在调用停止之后的一段时间内不再调用,然后才执行一次处理过程. 节流阀-Throttle 连 ...
- [JavaScript] 函数节流(throttle)和函数防抖(debounce)
js 的函数节流(throttle)和函数防抖(debounce)概述 函数防抖(debounce) 一个事件频繁触发,但是我们不想让他触发的这么频繁,于是我们就设置一个定时器让这个事件在 xxx 秒 ...
- “浅入浅出”函数防抖(debounce)与节流(throttle)
函数防抖与节流是日常开发中经常用到的技巧,也是前端面试中的常客,但是发现自己工作一年多了,要么直接复用已有的代码或工具,要么抄袭<JS高级程序设计>书中所述"函数节流" ...
随机推荐
- sessionStorage与localStorage
客户端存储数据的两个对象为: localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. 他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目 ...
- 【BZOJ2616】SPOJ PERIODNI 笛卡尔树+树形DP
[BZOJ2616]SPOJ PERIODNI Description Input 第1行包括两个正整数N,K,表示了棋盘的列数和放的车数. 第2行包含N个正整数,表示了棋盘每列的高度. Output ...
- Groovy中的脚本与类
包名 当你在groovy中定义类的时候需要指定包名,这和java中类似不多介绍. 导入 groovy中的导入也跟java类似,有一下五种: 默认导入 groovy默认导入了一下几个包和类: impor ...
- 在iOS模拟器上安装程式的ios-sim
针对iOS装置进行开发时,绝大部分开发者采用的工具都是官方的Xcode.问题是负责图像设计和开发管理人员,却不一定熟悉Xcode的操作,这时ios-sim便是一个解决方案. 曾经从事iOS开发的朋友, ...
- TOMCAT------>web资源访问
1.web应用达成war包 通过命令行打war包:jar -cvf xxx.war xxx 因为放到webapps里电脑会自动识别,自动解压 2.relodeable="true" ...
- 2017 Multi-University Training Contest - Team 7
HDU6121 Build a tree 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题目意思:一棵 n 个点的完全 k 叉树,结点标号从 ...
- ubuntu android 设备识别 Setting up a Device for Development
参考: http://developer.android.com/tools/device.html lsusb Bus 001 Device 004: ID 18d1:9025 Google I ...
- TCP implements its own acknowledgment scheme to guarantee successful data delivery
wTCP本身已经确保传输的成功性. HTTP The Definitive Guide 4.2.4 Delayed Acknowledgments Because the Internet itsel ...
- python中lambda使用
一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...
- Android在使用WebView时,通过Javascript调用JAVA函数
webView = (WebView) findViewById(R.id.article_webview); //WebView启用Javascript脚本运行 webView.getSetting ...