Метод destroy в библиотеке Waypoints используется для
полного удаления экземпляра waypoint и очистки всех связанных с ним
ресурсов. После вызова этого метода waypoint перестаёт отслеживать
прокрутку, не вызывает обработчики и исключается из внутренней системы
управления триггерами.
Это ключевой инструмент для управления жизненным циклом waypoint-объектов, особенно в динамических интерфейсах, где элементы создаются и удаляются во время работы приложения.
waypoint.destroy()
Метод не принимает аргументов и не возвращает значения.
При вызове destroy выполняется несколько действий:
group)context)Фактически объект становится неактивным и не может быть использован повторно.
var waypoint = new Waypoint({
element: document.getElementById('section'),
handler: function(direction) {
console.log('Секция достигнута');
}
});
// Удаление waypoint
waypoint.destroy();
После вызова destroy обработчик больше не будет
вызываться при прокрутке.
В одностраничных приложениях (SPA) часто возникает необходимость удалять waypoint при смене состояния интерфейса.
Пример:
function initWaypoint() {
return new Waypoint({
element: document.querySelector('.block'),
handler: function() {
console.log('Сработало');
}
});
}
var waypoint = initWaypoint();
// Позже, при удалении блока из DOM
document.querySelector('.block').remove();
waypoint.destroy();
Если не вызвать destroy, библиотека продолжит хранить
ссылку на несуществующий элемент, что может привести к утечкам памяти и
лишним вычислениям.
Повторный вызов destroy для одного и того же
waypoint:
waypoint.destroy();
waypoint.destroy();
Не вызывает ошибок, но не имеет эффекта после первого вызова. Объект уже удалён из всех внутренних структур.
Каждый waypoint принадлежит:
group) — объединяет waypoint с одинаковыми
параметрамиcontext) — определяет область прокруткиМетод destroy:
Если в группе или контексте больше не остаётся waypoint, соответствующие структуры также могут быть очищены.
В ситуациях, когда создаётся множество waypoint, удобно хранить их в массиве:
var waypoints = [];
document.querySelectorAll('.item').forEach(function(el) {
var wp = new Waypoint({
element: el,
handler: function() {
console.log('Item');
}
});
waypoints.push(wp);
});
// Удаление всех waypoint
waypoints.forEach(function(wp) {
wp.destroy();
});
Это гарантирует корректную очистку всех экземпляров.
Важно различать методы:
disable() — временно отключает waypointdestroy() — полностью удаляет waypointПример:
waypoint.disable(); // можно снова включить
waypoint.enable();
waypoint.destroy(); // восстановить нельзя
После destroy повторная активация невозможна — требуется
создание нового экземпляра.
Допустимо вызывать destroy прямо внутри обработчика:
var waypoint = new Waypoint({
element: document.getElementById('target'),
handler: function() {
console.log('Сработало один раз');
this.destroy();
}
});
В этом случае waypoint выполнит обработчик один раз и сразу удалится.
element.remove();
Без:
waypoint.destroy();
Проблема:
new Waypoint({
element: el,
handler: fn
});
Без сохранения:
var waypoint = ...
В дальнейшем невозможно вызвать destroy, что затрудняет
управление жизненным циклом.
waypoint.destroy();
waypoint.enable(); // не сработает
После уничтожения объект становится невалидным.
Рекомендуется:
destroy при удалении элементовПример в псевдокоде компонента:
function mount() {
this.waypoint = new Waypoint({...});
}
function unmount() {
this.waypoint.destroy();
}
Корректное использование destroy:
Особенно важно в интерфейсах с большим количеством waypoint.
После вызова destroy: