防抖
防抖:在频繁动作的事件中,让事件结束后再等待一段时间后执行。
/*
* 滚动完后,多少秒执行一次
* 通过 锁 和 闭包思路解决
*/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 100vw;
height: 20vh;
background: cyan;
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
<script>
// 函数防抖: 在这个事件触发完后的一段时间执行。
document.querySelector('div').onmousemove = debounce(function () {
console.log(1);
console.log(this);
}, 300)
function debounce(fun, delay) {
let time = null;
let _this = this;
let args = arguments;
console.log(_this);
return function () {
// 进来先清空
clearTimeout(time);
time = setTimeout(() => {
console.log(_this);
fun.apply(_this, args)
}, delay)
}
}
</script>
节流
节流:在执行的事件中每隔一段时间执行一次。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 100vw;
height: 20vh;
background: cyan;
display: flex;
justify-content: center;
align-items: center;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
<script>
// 节流: 让这个函数在触发过程中每间隔一段直接执行一次
function throttle(fun, delay) {
let bool = true;
return function () {
// 关闭停止
if (!bool) return
bool = false;
setTimeout(() => {
fun.apply(this, arguments)
bool = true
}, delay)
}
}
let num = 0;
document.querySelector('div').onmousemove = throttle(function () {
this.innerHTML = num++
}, 1000)
</script>