В веб-разработке часто возникает необходимость контролировать частоту
выполнения функций, вызываемых событиями, такими как
scroll, resize или input.
Неконтролируемое выполнение функций при частых событиях может привести к
падению производительности, поэтому применяются техники
debounce и throttle. Эти методы
особенно актуальны при работе с библиотекой Isotope,
где динамическое фильтрование, сортировка и анимация элементов могут
создавать нагрузку на браузер.
Debounce — это техника, при которой функция вызывается только после того, как событие прекратилось на определённый промежуток времени. Другими словами, функция выполняется один раз после серии быстрых повторяющихся событий.
input), изменения
размера окна (resize) и фильтрации элементов.setTimeout и
clearTimeout.// Инициализация Isotope
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
// Debounce функция
function debounce(fn, delay) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => fn.apply(this, args), delay);
};
}
// Фильтрация с debounce
const filterItems = debounce(function(filterValue) {
iso.arrange({ filter: filterValue });
}, 300);
// Пример привязки к кнопкам фильтров
document.querySelectorAll('.filter-button-group button').forEach(button => {
button.addEventListener('click', () => {
const filterValue = button.getAttribute('data-filter');
filterItems(filterValue);
});
});
В этом примере при частых нажатиях на кнопки фильтров Isotope перестанет перерендеривать элементы мгновенно, а будет выполнять фильтрацию только после 300 мс паузы между событиями.
Throttle — это техника, при которой функция вызывается не чаще, чем раз в заданный промежуток времени, независимо от того, сколько раз событие произошло. В отличие от debounce, throttle гарантирует периодическое выполнение функции при непрерывных событиях.
scroll, mousemove.// Throttle функция
function throttle(fn, limit) {
let lastCall = 0;
return function(...args) {
const now = Date.now();
if (now - lastCall >= limit) {
lastCall = now;
fn.apply(this, args);
}
};
}
// Перестройка Isotope при скролле с throttle
const handleScroll = throttle(function() {
iso.layout();
}, 200);
window.addEventListener('scroll', handleScroll);
В этом примере метод layout Isotope будет выполняться не
чаще одного раза в 200 мс при прокрутке страницы, что предотвращает
падение производительности при активном скролле.
| Характеристика | Debounce | Throttle |
|---|---|---|
| Когда вызывается | После завершения серии событий | С периодичностью во время события |
| Применение | Ввод текста, фильтры, resize | Scroll, drag, mousemove |
| Основной эффект | Функция выполняется реже, только один раз | Функция выполняется с постоянным интервалом |
Debounce отлично подходит для динамической фильтрации элементов:
Throttle оптимален для перерасчёта расположения элементов при прокрутке или изменении размера окна:
layout, но с ограниченной частотой, что предотвращает
мерцание и лаги анимации.Можно комбинировать debounce и throttle для максимальной оптимизации:
arrange или layout напрямую на каждое
событие.scroll достаточно 100–250 мс, для фильтров 200–500 мс.apply или call внутри обёртки, чтобы сохранить
контекст и переданные аргументы.Эти техники значительно повышают отзывчивость интерфейса и позволяют библиотеке Isotope работать плавно даже с большим количеством элементов.