Waypoints.refreshAll

Метод Waypoints.refreshAll является ключевым инструментом в библиотеке Waypoints для управления точками прокрутки на веб-странице. Он используется для пересчёта позиций всех существующих Waypoint-объектов, что критически важно при динамическом изменении контента на странице.


Основная функция

Waypoints.refreshAll() выполняет обход всех созданных экземпляров Waypoint и обновляет их координаты. Это необходимо, потому что Waypoints вычисляет позицию элемента на момент инициализации. Если DOM изменяется после этого (например, добавляются новые блоки, меняется размер изображений или динамически подгружается контент), старые координаты становятся некорректными, что может приводить к неправильному срабатыванию коллбеков.

// Обновление всех Waypoints на странице
Waypoint.refreshAll();

Когда необходимо использовать

  1. Динамическая загрузка контента При добавлении новых элементов в DOM после начальной загрузки страницы их Waypoints не будут работать корректно до вызова refreshAll.

  2. Изменение размеров элементов Изменение высоты блоков, изображений или других элементов может сместить точки срабатывания Waypoint. Пересчет гарантирует корректную активацию коллбеков.

  3. Анимации и эффекты на странице Если элементы появляются, исчезают или изменяют размер через анимацию, refreshAll обеспечивает правильное срабатывание Waypoint после завершения визуальных изменений.


Пример использования

// Создание Waypoint для элемента
var waypoint = new Waypoint({
  element: document.getElementById('section1'),
  handler: function(direction) {
    console.log('Waypoint сработал при прокрутке', direction);
  },
  offset: '50%' // срабатывание при середине экрана
});

// Динамическое добавление нового контента
var newSection = document.createElement('div');
newSection.id = 'section2';
newSection.style.height = '500px';
document.body.appendChild(newSection);

// Создание нового Waypoint для добавленного блока
new Waypoint({
  element: newSection,
  handler: function(direction) {
    console.log('Новый Waypoint сработал', direction);
  }
});

// Пересчет всех Waypoints
Waypoint.refreshAll();

В этом примере без вызова Waypoint.refreshAll() точка для section2 могла бы быть рассчитана некорректно, особенно если новые блоки добавляются не в конец документа или страница уже прокручена.


Поведение при множественных Waypoints

Библиотека хранит все Waypoint-объекты в глобальном массиве. Метод refreshAll вызывает внутренний метод refresh() для каждого из них. Это значит, что независимо от того, сколько Waypoints создано, один вызов refreshAll обновит все позиции одновременно.


Отличие от Waypoint.refresh()

  • Waypoint.refresh() обновляет только один конкретный Waypoint, вызывается на экземпляре объекта:

    waypoint.refresh();
  • Waypoint.refreshAll() обновляет все существующие Waypoints, что удобно при массовых изменениях DOM:

    Waypoint.refreshAll();

Использование refreshAll экономит время и предотвращает необходимость перебирать каждый Waypoint вручную.


Практические советы

  • Вызывать после завершения всех изменений DOM, чтобы избежать лишних пересчетов.

  • При большом количестве Waypoints частые вызовы refreshAll могут влиять на производительность, поэтому оптимально вызывать его один раз после внесения всех изменений.

  • Можно использовать с таймаутом или дебаунсом для асинхронных загрузок:

    setTimeout(function() {
      Waypoint.refreshAll();
    }, 500);
  • Совместим с Sticky Elements, Infinite Scroll и другими динамическими эффектами, где элементы могут появляться или исчезать после первоначальной загрузки.


Внутренний механизм

Метод refreshAll проходит по массиву _waypoints и для каждого элемента выполняет пересчет позиции относительно top offset документа и текущей прокрутки. Результатом является корректная привязка коллбеков к новым координатам элементов.

Это обеспечивает стабильность работы Waypoints на страницах с адаптивной версткой, где высота блоков может изменяться на разных разрешениях экрана.


Итоговые рекомендации

  • Использовать Waypoint.refreshAll() после динамических изменений DOM.
  • Не злоупотреблять частыми вызовами на больших страницах.
  • Сочетать с методами Waypoint.refresh() для выборочного пересчета, если известно, какие элементы изменились.
  • Подходит для современных SPA и ленивой загрузки контента, где Waypoints создаются динамически.