js 防抖处理?
右下角有一个按钮来控制滑块位置, 具体代码如下
<style>
#rollBtn .sc-box {
bottom: 3rem;
right: 3rem;
background-color: rgba(var(--sc-primary-rgb), .5);
}
#rollBtn .sc-status-bottom {
transform: rotate(180deg);
}
</style>
<aside id="rollBtn">
<div class="sc-box position-fixed d-inline-block rounded-circle cursor-pointer p-3 transition-500 waves-effect waves-dark">
<img src="http://localhost:8002/assets/images/chevron-down.svg">
</div>
</aside>
<script>
function debounce(func, wait) {
let timeout;
return () => {
clearTimeout(timeout);
timeout = setTimeout(func, wait);
}
}
$('#rollBtn .sc-box').click(() => {
$("html").animate({
scrollTop: 1000
}, 1000);
});
</script>
但是当用户连续点击的时候页面就会卡死, 这个情况可以怎么进行防抖优化?debounce
是原先封装的方法, 但这个方法并不适用这个需求debounce
是延迟执行, 也就是如果调这个方法传1秒, 那我点击这个按钮后1秒才开始执行里面的方法想稍微改一下, 变成先执行, 后延迟1秒 (先执行$("html").animate
, 并且在执行1期间将$("html").animate
锁定1秒的时间)
回复
1个回答
test
2024-07-01
送你一个可以立即执行的debounce函数
/**
* @desc 函数防抖
* @param func 目标函数
* @param wait 延迟执行毫秒数
* @param immediate true - 立即执行, false - 延迟执行
*/
function debounce (func, wait = 1000, immediate = true) {
let timer;
return function() {
let context = this,
args = arguments;
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, wait);
if (callNow) func.apply(context, args);
} else {
timer = setTimeout(() => {
func.apply(context, args);
}, wait)
}
}
}
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容