复习: 手写防抖和节流函数
防抖
定义
当持续触发事件,一定事件内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前 ,又一次触发了事件 ,就重新开始延时。
通俗曰:多次事件触发的时间间隔未超过规定的时间间隔,就永远不会触发该事件。
手写代码
<body>
<input type="text">
</body>
<script>
const debounce = function(func, delay) {
let timer;
return function(args) {
clearInterval(timer)
timer = setTimeout(function(){
func(args)
}, delay)
}
}
const input = document.querySelector(input)
const inputFunc = function(value) {
console.log(`${
value}`);
}
const inputDebounce = debounce(inputFunc, 1000)
input.addEventListener(keyup,function(e) {
inputDebounce(e.target.value)
})
</script>
第一次延时触发后,在延时时间内,又一次触发事件,则将第一次的延时操作清除,重新将第二次的触发事件进行延时。
只有在一次延时操作内,没有再次的事件触发,这次的事件才能被完整触发。
应用
搜索框的联想建议,避免频发发送后台请求。
节流
定义
当持续触发事件的时候,保证一段时间内,只调用一次事件处理函数。
通俗曰:多次事件触发在一个延时时间单位内,只触发多次事件的第一个。
手写代码
<body>
<button id="button">点击</button>
</body>
<script>
function throttle(fun, delay) {
let timerOut;
return function() {
if(!timerOut) {
timerOut = setTimeout(function(){
fun()
timerOut = null
}, delay)
}
}
}
const btn = document.querySelector(#button)
function handle() {
console.log(Math.random());
}
btn.onclick = throttle(handle, 1000)
</script>
在第一次的延时操作时间内,再次触发第二次操作,将不予理会,等到第一次延时时间完毕,第一次事件触发完成,这时再次触发才会有效。
应用
避免频繁提交表单。
区别
通俗曰:
防抖:多次事件触发的间隔时间不超过延时时间,就一直不会触发。
最后一次事件最终触发
节流:一次事件在延时时间内等待触发,其他的事件一直无法触发。
只触发延时操作内,第一个事件。
上一篇:
IDEA上Java项目控制台中文乱码
