众所周知,函数节流(throttle)是 JS 中一个非常常见的优化手段,可以有效的避免函数过于频繁的执行。
function throttle(func, delay) {
let canRun = true;
return function() {
if (canRun) {
func.apply(this, arguments);
canRun = false;
setTimeout(() => {
canRun = true;
}, delay);
}
};
}
// 模拟一个保存操作的函数
function saveData() {
console.log("数据已保存");
}
// 创建节流函数
var throttledSave = throttle(saveData, 300); // 300ms为节流的时间间隔
// 绑定按钮点击事件
document.getElementById('saveBtn').addEventListener('click', throttledSave);
其实除了 JS 方式, CSS 也可以非常轻易的实现这样一个功能,无需任何框架库,一起看看吧!
CSS 实现和 JS 的思维不同,需要从另一个角度去看待这个问题。
比如这里需要对点击事件进行限制,可以使用pointer-events
;
然后是时间的限制,每次点击后需要自动禁用300ms,可以使用animation
;
除此之外,还需要有点击行为,所以必然和伪类:active
有关联。
假设有一个按钮,绑定了一个点击事件,这时连续点击按钮就会不断地触发:
<button onclick="console.log('保存')">保存</button>
完整代码如下,很好地限制了点击频率:
button{
/*动画缓动函数:设置成了step-end阶梯曲线,它可以很方便的控制pointer-events的变化时间点。*/
animation: throttle 2s step-end forwards;
}
button:active{
animation: none;
}
@keyframes throttle {
from {
pointer-events: none;
}
to {
pointer-events: all;
}
}