目录
一、防抖(debounce)
1.1 基本概念
间隔时间内,多次触发事件,以最后一次为准。
1.2 应用场景
键盘输入框(oninput)、鼠标移动(onmousemove)、调整浏览器窗口大小(resize)等。
1.3 防抖思路
- 声明一个变量存储定时器id
- 每一次触发事件的时候,先不触发,开启定时器,间隔时间之后再触发
- 如果在间隔时间内,用户触发了其他事件,则结束上一次定时器,以最后一次为准
- 开启本次定时器
1.4 eg
<input type="text">
<script>
let input = document.querySelector("input");
let time = null;
// oninput:当用户向 <input> 中尝试输入时执行 JavaScript:
input.oninput = function () {
if (time !== null) {
/**
* clearTimeout() 方法可取消由 setTimeout() 方法设置的定时操作。
clearTimeout() 方法的参数必须是由 setTimeout() 返回的 ID 值。
注意: 要使用 clearTimeout() 方法, 在创建执行定时操作时要使用全局变量:
*/
clearTimeout(time);
}
time = setTimeout(() => {
console.log(this.value);
}, 500)
}
</script>
利用闭包封装
<input type="text">
<script>
let input = document.querySelector("input");
input.oninput = debounce(function () {
console.log(this.value);
}, 500);
// 利用闭包实现封装的防抖方法
function debounce(fn, delay) {
let time = null;
return function () {
if (time !== null) {
clearTimeout(time);
}
time = setTimeout(() => {
fn.call(this);
}, 500)
}
}
</script>
二、节流(throttle)
2.1 基本概念
间隔时间内函数只被触发一次。
2.2 作用
降低高频事件触发频率。
2.3 应用场景
高频事件:如鼠标移动(onmousemove)、鼠标滚动条(onscroll)等。
2.4 节流思路
- 声明变量存储本次触发的时间 time
- 每一次触发的时候,使用当前时间 - time,判断两次间隔是否超过节流时间
- 超过:触发,并且存储本次触发时间
- 不超过:不触发
2.5 eg
body {
height: 2000px;
}
<script>
let flag = true;
window.onscroll = function () {
if (flag) {
setTimeout(() => {
console.log("123");
flag = true;
}, 500);
}
flag = false;
}
</script>
利用闭包封装
<script>
window.onscroll = throttle(function () {
console.log("123");
}, 500);
// 封装
function throttle(fn, delay) {
let flag = true;
return function () {
if (flag) {
setTimeout(() => {
fn.call(this);
flag = true;
}, delay);
}
flag = false;
}
}
</script>
三、相同点与不同点
相同点:都是为了优化函数的执行频率,提高网页性能。
不同点:
防抖:优化用户主动触发的事件,多次触发以最后一次为准。
节流:优化 ‘事件本身’ 执行的频率,间隔时间指执行一次。