Можно использовать
debounce или throttle:
function debounce(f, ms) {
let timer = null;
return function (...args) {
const onComplete = () => {
f.apply(this, args);
timer = null;
}
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(onComplete, ms);
};
}
function throttle(func, ms) {
var isThrottled = false,
savedArgs,
savedThis;
function wrapper() {
if (isThrottled) { // (2)
savedArgs = arguments;
savedThis = this;
return;
}
func.apply(this, arguments); // (1)
isThrottled = true;
setTimeout(function() {
isThrottled = false; // (3)
if (savedArgs) {
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
}
return wrapper;
}
Код вашего хандлера при использовании
debounce будет такой:
function handler() {
// do something
}
var debouncedHandler = debounce(handler, 500);
document.querySelecror('.submit').addEventListener('click', debouncedHandler);
С
throttle аналогично.
Реализации
debounce и
throttle есть в lodash. Если используете эту библиотеку можно взять оттуда.