优化 --- 防抖技术
1. 什么是防抖
单位时间内,如果频繁触发事件,只执行最后一次
2. 使用场景
- 搜索框输入,只需用户最后一次输入完,再发送请求
- 手机号、邮箱验证的检测
3. 案例
3.1 鼠标划过盒子,数字+1
由于鼠标滑动1像素,就算是触发了鼠标移动事件,这样就会不断地执行这个事件的回调函数,如果里面存在大量消耗性能的代码,如DOM操作,数据处理等,可能造成卡顿
1. lodash.js 处理防抖
在事件被最后一次被触发后,再执行回调函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 200px;
height: 200px;
background-color: gray;
margin: 200px auto;
}
.box p {
text-align: center;
line-height: 200px;
}
</style>
</head>
<body>
<div class="box"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
<script>
let count = 0
const box = document.querySelector(".box")
function counter() {
count++
box.innerHTML = `<p>${count}</p>`
}
// 在事件被最后一次被触发后,等待500ms执行回调函数
box.addEventListener("mousemove", _.debounce(counter, 500))
</script>
</body>
</html>
2. 手写防抖
防抖的核心就是利用 setTimeout 来实现
- 声明一个定时器变量
- 当鼠标每次滑动先判断是否有定时器,如果有定时器就先清除以前的定时器,开启新的定时器,并将这个定时器存储在定时器变量中
- 如果没有定时器,就开启新的定时器,并将这个定时器存储在定时器变量中
let count = 0
const box = document.querySelector(".box")
// 防抖函数
function debounce(fn, t) {
let timer
// 由于 debounce(counter, 500) 会立刻调用debounce 函数,所以需要返回一个匿名函数的地址
return function () {
if (timer) clearTimeout(timer)
timer = setTimeout(fn, t)
}
}
function counter() {
count++
box.innerHTML = `<p>${count}</p>`
}
box.addEventListener("mousemove", debounce(counter, 500))
python防脱发技巧

浙公网安备 33010602011771号