В библиотеке Cleave.js каждый экземпляр представляет собой привязку логики форматирования к конкретному DOM-элементу. В процессе работы он перехватывает события ввода, модифицирует отображаемое значение и поддерживает внутреннее состояние, связанное с маской и текущим вводом. При завершении использования экземпляра требуется корректное освобождение всех ресурсов, иначе сохраняются обработчики событий и ссылки на DOM, что приводит к утечкам памяти и неконтролируемому поведению интерфейса при динамическом обновлении страницы.
Основной механизм завершения работы инстанса реализуется через метод
destroy().
Экземпляр Cleave.js предоставляет публичный метод:
cleave.destroy();
После вызова происходит последовательное выполнение операций:
input,
keydown, focus, blur и др.);Важно, что сам DOM-элемент при этом не удаляется и остаётся в документе, но теряет поведение, добавляемое библиотекой.
После вызова destroy() поле ввода возвращается к
стандартному поведению браузера. Форматирование больше не применяется, а
вводимое значение перестаёт преобразовываться в режиме реального
времени.
Если в момент уничтожения внутри элемента находилось отформатированное значение, оно сохраняется как обычный текст без дополнительной обработки. Это означает, что визуальный вид остаётся неизменным, но логика Cleave.js больше не влияет на содержимое.
После уничтожения экземпляра возможна повторная инициализация на том же элементе:
cleave.destroy();
cleave = new Cleave(inputElement, options);
При этом создаётся новый экземпляр с полностью чистым состоянием. Старые ссылки и обработчики уже не участвуют в обработке событий, что предотвращает конфликт логики.
Повторная инициализация используется в динамических интерфейсах, где элементы формы пересоздаются или перенастраиваются в зависимости от состояния приложения.
При удалении DOM-узла вручную (например, при remove()
или перерисовке списка) экземпляр Cleave.js не освобождается
автоматически. Это связано с тем, что библиотека не отслеживает
жизненный цикл DOM вне своей области ответственности.
Если элемент удаляется без предварительного вызова
destroy(), остаются:
В долгоживущих приложениях это становится источником накопления неиспользуемых объектов.
При использовании Cleave.js на наборе полей формируется множество независимых инстансов. Каждый из них должен уничтожаться отдельно:
const instances = [];
inputs.forEach((el) => {
instances.push(new Cleave(el, options));
});
// позднее
instances.forEach((c) => c.destroy());
Такая модель особенно важна в интерфейсах, где элементы создаются и удаляются динамически, например в таблицах, списках или формах с повторяющимися блоками.
В системах, где DOM управляется фреймворками, жизненный цикл
экземпляра Cleave.js привязывается к жизненному циклу компонента. При
размонтировании компонента требуется обязательный вызов
destroy().
Типичная проблема возникает при повторном рендере: если экземпляр не уничтожается, а создаётся заново, на один и тот же input могут навешиваться несколько обработчиков, что приводит к дублированию форматирования и неконсистентному вводу.
Игнорирование удаления экземпляра приводит к накоплению ресурсов:
В долгосрочной перспективе это отражается на производительности интерфейса, особенно в приложениях с большим количеством форм и интерактивных элементов.
Повторный вызов destroy() на уже уничтоженном экземпляре
не вызывает повторного освобождения ресурсов, так как внутренние ссылки
уже разорваны. Однако структура объекта сохраняется, и дальнейшие вызовы
становятся фактически безопасными, не изменяя состояние DOM.
При этом повторное использование такого экземпляра для инициализации не предполагается — создаётся новый объект с чистой конфигурацией.