Для этого нужен дебоузер:
function debounce(callback, timeout, _this) {
var timer;
return function(e) {
var _that = this;
if (timer)
clearTimeout(timer);
timer = setTimeout(function() {
callback.call(_this || _that, e);
}, timeout);
}
}
Используется так:
// we'll attach the function created by "debounce" to each of the target
// user input events; this function only fires once 2 seconds have passed
// with no additional input; it can be attached to any number of desired
// events
var userAction = debounce(function(e) {
console.log("silence");
}, 2000);
document.addEventListener("mousemove", userAction, false);
document.addEventListener("click", userAction, false);
document.addEventListener("scroll", userAction, false);
Первое пользовательское действие (перемещение мыши, щелчок или прокрутка) запускает функцию (присоединенную к таймеру), которая сбрасывается каждый раз, когда происходит другое пользовательское действие. Основной обратный вызов не срабатывает, пока не истечет указанное количество времени без каких-либо действий.
Обратите внимание, что не нужны глобальные флаги или переменные тайм-аута. Глобальная область получает только ваш отклоненный обратный вызов. Остерегайтесь решений, которые требуют поддержания глобального состояния ; о них будет сложно рассуждать в контексте более крупного приложения.
Обратите внимание, что это решение является полностью общим . Остерегайтесь решений, применимых только к вашему крайне узкому варианту использования.