JS:防抖与节流的实现
应用场景:
防抖与节流在我们的日常开发中经常会遇到,我们可以看一下大概的应用场景:
防抖:
1.输入框做远程搜索时,用户不断的输入内容,我们可以用防抖来节约请求的资源;
2.window触发resize时,我们可以通过防抖来保证只在用户停止拖拽的时候触发相应的方法;
3.可以用来防止按钮的重复提交。
节流:
1.鼠标不断的点击触发click,保证单位时间内只触发一次;
2.监听滚动事件,判断是否滑动到底部自动加载更多。
区别:
防抖是在用户频繁操作时,操作间隙大于等待时间才执行下一次;
节流是用户频繁操作过程中,在单位时间内,周期性的执行函数;
代码实现:
防抖:
第一种实现方式:用户操作停止后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>防抖</title>
<style>
#main{
height: 100px;
background-color: #333;
}
</style>
</head>
<body>
<div id="main">
</div>
<script>
var count = 0;
function add(){
count++;
console.log(count)
console.log(this)
}
var main = document.getElementById("main");
main.onmousemove = debounce(add, 1000);
// 防抖
function debounce(func, wait){
var timeout;
return function(){
var self = this; //因为apply会改变this的指向性
clearTimeout(timeout)
timeout = setTimeout(function(){
// setTimeout属于window对象
// 直接使用func.apply(this) 会在add函数里面改变this为window,这里也可以用ES6的箭头函数
func.apply(self)
},wait)
}
}
</script>
</body>
</html>
效果:鼠标持续移动结束后等待1秒,执行函数
第二种:鼠标初次滑动就执行一次函数
function debounce(func, wait){
var timeout;
return function(){
//这里对this的指向性进行一个存储
var self = this;
clearTimeout(timeout)
var callNow = !timeout;
timeout = setTimeout(function(){
timeout = null;
},wait)
if(callNow){
func.apply(self)
}
}
}
节流:
function throttle(func, wait){
var prexious = 0; //用作标记
return function(){
var self = this;
var now = +new Date();
if(now - prexious > wait){
func.apply(self);
prexious = now;
}
}
}
效果展示:在频繁操作的过程中,每隔1秒执行一次函数