Книга: Выразительный JavaScript
Устранение помех (debouncing)
Устранение помех (debouncing)
У некоторых событий есть возможность выполняться быстро и много раз подряд (например, "mousemove"
и "scroll"
). При обработке таких событий надо быть осторожным и не делать ничего «тяжёлого», или ваш обработчик займёт столько времени на выполнение, что взаимодействие с документом будет медленным и прерывистым.
Если в таком обработчике надо сделать что-то нетривиальное, можно использовать setTimeout
, чтобы гарантировать, что вы делаете это не слишком часто. Это обычно называют «устранением помех» в событии. К этому существует несколько слегка различающихся подходов.
В первом примере надо сделать что-то, когда пользователь печатает, но не надо делать это сразу после запуска каждого события нажатия на клавиши. Когда они быстро печатают, нам надо подождать, когда возникнет пауза. Вместо немедленного выполнения действия в обработчике, мы устанавливаем таймаут. Также мы очищаем предыдущий таймаут, если он был, так что если события близко одно от другого (ближе, чем задержка таймера), предыдущее событие будет отменено.
<textarea>Напишите тут что-нибудь...</textarea>
<script>
var textarea = document.querySelector("textarea");
var timeout;
textarea.addEventListener("keydown", function() {
clearTimeout(timeout);
timeout = setTimeout(function() {
console.log("Вы остановились.");
}, 500);
});
</script>
Если задать undefined
для clearTimeout
, или вызвать его с таймаутом, который уже произошёл, то ничего не произойдёт. Таким образом, не надо осторожничать при его вызове, и мы просто поступаем так для каждого события.
Можно использовать немного другой подход, если нам надо разделить ответы минимальными промежутками времени, но при этом запускать их в то время, когда происходят события, а не после. К примеру, надо реагировать на события "mousemove"
, показывая текущие координаты мыши, но только каждые 250 миллисекунд.
<script>
function displayCoords(event) {
document.body.textContent =
"Мышь на " + event.pageX + ", " + event.pageY;
}
var scheduled = false, lastEvent;
addEventListener("mousemove", function(event) {
lastEvent = event;
if (!scheduled) {
scheduled = true;
setTimeout(function() {
scheduled = false;
displayCoords(lastEvent);
}, 250);
}
});
</script>
- Обработчики событий
- События и узлы DOM
- Объекты событий
- Распространение (propagation)
- Действия по умолчанию
- События от кнопок клавиатуры
- Кнопки мыши
- Движение мыши
- События прокрутки
- События, связанные с фокусом
- Событие загрузки
- График выполнения скрипта
- Установка таймеров
- Устранение помех (debouncing)
- Итог
- Упражнения
- Часть III Диагностика и устранение неисправностей
- Устранение неисправностей МП
- Поиск и устранение неисправностей модулей памяти
- Диагностика и устранение проблем при подключении к Интернету
- Устранение проблем, возникающих во время навигации
- Урок 8.4. Устранение проблем в работе Windows
- Устранение конфликтов имен WSDL с помощью свойства MessageName
- Устранение неисправностей
- Устранение затора
- Изменения, связанные с устранением неявных допущений относительно предполагаемых размеров элементов данных
- Устранение неполадок
- Устранение связей (Decoupling)