防抖和节流是前端中常见的两个概念,通常用于前端的优化。
防抖: 就是指触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。(延时器 重新计时) 节流: 就是指连续触发事件但是在设定的一段时间内中只执行一次函数。(定时器)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<input type="text" class="ipt">
<button class="btn">按钮</button>
<script>
// 防抖:出发时间后,延迟一段时间,再执行回调,如果在此期间,事件又被触发,则重新计时
// 核心:延时器 重新计时
let timerId = null // 声明一个延时器
document.querySelector('.ipt').addEventListener('input', function (){
let text = this.value
clearTimeout(timerId) // 用户再输入,清掉延时器,重新开启一个新的
timerId = setTimeout(() => {
axios.get('http://www.liulongbin.top:3006/api/sug').then(res => {
console.log(res);
})
}, 1000)
})
// 节流:单位时间内,频繁触发同一个操作,只触发一次。(定时器实现)
// 当触发事件的时候,如果没有设置执行回调函数的定时器,就创建一个。当定时器中的回调函数被执行的时候, 将指向定时器引用的timeout设置为null,那么下一此再执行时,又会重新触发并设置一个定时器。
let timer = null
document.querySelector('.btn').addEventListener('click', function () {
if(!timer) {
timer = setTimeout(() => {
timer = null
axios.get('http://www.liulongbin.top:3006/api/sug').then(res => {
console.log(res)
})
},1000)
}
})
</script>
</body>
</html>