Библиотека Waypoints отслеживает позиции элементов на странице и выполняет функции при достижении определённых точек прокрутки. Важная особенность — Waypoints вычисляет координаты элементов один раз при инициализации. Если DOM меняется после этого (добавление, удаление, изменение размеров элементов), позиции точек могут устареть. Без обновления Waypoints срабатывания могут происходить некорректно или вовсе не происходить.
Обновление нужно в следующих случаях:
Если игнорировать обновление, Waypoints будет использовать старые
значения offset и top, что приведёт к ошибкам
при срабатывании событий.
Waypoints предоставляет встроенные методы для корректного пересчёта точек:
Waypoint.refreshAll()Метод пересчитывает координаты всех существующих Waypoints. Используется при массовых изменениях DOM.
Пример:
// После динамического добавления элементов
Waypoint.refreshAll();
Особенности:
Waypoint.disable() и Waypoint.enable()Для точечных изменений можно временно отключить Waypoint, а затем включить после перестроения DOM:
var waypoint = new Waypoint({
element: document.getElementById('section1'),
handler: function(direction) {
console.log('Section reached: ' + direction);
}
});
waypoint.disable(); // отключение
// изменения DOM
waypoint.enable(); // повторное включение
Используется для предотвращения ложных срабатываний во время активных изменений на странице.
Для автоматического пересчёта можно использовать MutationObserver:
const observer = new MutationObserver(function(mutationsList, observer) {
Waypoint.refreshAll();
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
characterData: true
});
Пояснение:
childList: true — отслеживает добавление или удаление
узлов.subtree: true — включает все вложенные элементы.attributes: true — отслеживает изменения
атрибутов.characterData: true — отслеживает текстовые
изменения.Такой подход позволяет Waypoints автоматически корректировать свои
позиции без ручного вызова refreshAll после каждого
изменения DOM.
При динамической загрузке контента:
fetch('/api/content')
.then(res => res.text())
.then(html => {
const container = document.getElementById('content');
container.innerHTML += html;
Waypoint.refreshAll(); // пересчёт Waypoints после вставки нового контента
});
Важно: вызов refreshAll() после добавления
элементов в DOM гарантирует правильное срабатывание
событий.
refreshAll слишком часто
при мелких изменениях, чтобы не перегружать браузер.refreshAll один раз после завершения всех
модификаций.enable() / disable() вместо
массового пересчёта.requestAnimationFrame или setTimeout для
асинхронного вызова refreshAll, чтобы избежать блокировки
интерфейса.Waypoints интегрируется с jQuery. При изменении DOM через jQuery методы работают аналогично:
$('#container').append('<div class="section"></div>');
Waypoint.refreshAll();
Можно также использовать события jQuery для отслеживания вставки элементов:
$('#container').on('DOMNodeInserted', function() {
Waypoint.refreshAll();
});
Однако MutationObserver предпочтительнее, так как
DOMNodeInserted устарел и может работать медленнее.
Waypoint.refreshAll() после завершения
изменений.disable() /
enable() для точечных Waypoints.Эти методы позволяют поддерживать корректное поведение Waypoints на страницах с динамическим контентом и сложной версткой.