В ядре JavaScript 1С-Битрикс вся работа с событиями унифицирована через пространство имён BX. Помимо привычных BX.bind
и BX.unbind
, существует метод BX.unbindAll
, который снимает все обработчики, ранее зарегистрированные через BX-ядро, либо только с указанного элемента, если он передан как параметр. Это удобный способ мгновенно «обнулить» логику, связанную с DOM-узлом, и снизить риск утечек памяти при динамическом интерфейсе.

Сигнатура в официальной документации лаконична – void BX.unbindAll([element])
– однако применять её можно гибко и безопасно.
2. Почему важно «отвязывать» события
- Динамический контент: в большинстве проектов на Битрикс компоненты подгружаются и уничтожаются Ajax-ом. Если не убирать старые обработчики, каждое новое монтирование элемента плодит избыточные ссылки на функции.
- SPA-подход (Vue / React в Битрикс): при переходе между виртуальными страницами старый DOM удаляется, а обработчики остаются, что приводит к «зомби-слушателям».
- Оптимизация производительности: лишние обработчики вызывают лишние пересчёты стилей и перерисовки.
- Чистый код: единая точка «отвязки» делает логику жизненного цикла компонента прозрачной.
3. Простые примеры использования
3.1 Сброс обработчиков у конкретной кнопки
<!-- layout.html -->
<button id="saveBtn">Сохранить</button>
<button id="resetBtn">Сбросить логику</button>
<script>
BX.ready(() => {
// Назначаем обработчик «Сохранить»
const saveButton = BX('saveBtn');
BX.bind(saveButton, 'click', event => {
event.preventDefault();
alert('Данные сохранены!');
});
// По нажатию «Сбросить логику» удаляем ВСЕ обработчики у saveBtn
BX.bind(BX('resetBtn'), 'click', () => {
BX.unbindAll(saveButton);
BX.adjust(saveButton, {text: 'Логика снята'}); // визуальное подтверждение
});
});
</script>
3.2 Полная «чистка» перед выгрузкой страницы
window.addEventListener('beforeunload', () => {
// Снимаем обработчики, привязанные через BX.bind к любому элементу
BX.unbindAll();
});
Такой приём особенно полезен, когда страница содержит тяжёлые таймеры, навешанные через BX.bind
на document
или window
.
3.3 Работа внутри Vue-компонента (композитный сайт)
export default {
name: 'CartItem',
mounted() {
// Привязываем собственный обработчик
this.el = this.$el.querySelector('.delete-icon');
BX.bind(this.el, 'click', this.removeItem);
},
beforeDestroy() {
// Гарантированно убираем обработчики перед уничтожением DOM-узла
BX.unbindAll(this.el);
},
methods: {
removeItem() {
this.$emit('remove');
}
}
};
4. Групповые сценарии
Ситуация | Подход |
---|---|
Ajax-пагинация: контент контейнера полностью перерисовывается | BX.unbindAll(container); перед заменой HTML |
Модальные окна: одно и то же окно переиспользуется, а внутри появляются разные кнопки | BX.unbindAll(modal); при открытии, затем назначение актуальных событий |
Глобальные события (document , window ) |
Создайте обёртку-сервис, где вызывается BX.unbindAll() при app.destroy() |
5. Что НЕ делает BX.unbindAll
- Не затрагивает обработчики, добавленные через
addEventListener
напрямую или сторонними библиотеками — только те, что регистрировались черезBX.bind
. - Не убирает пользовательские события (
BX.addCustomEvent
). Для них используйтеBX.removeCustomEvent
. - Не отменяет делегированные события jQuery — поэтому, если проект смешивает jQuery и BX, убедитесь, что все критичные обработчики находятся под контролем BX.
6. Подводные камни и best practices
- Идём от большего к меньшему: не вызывайте
BX.unbindAll()
без аргументов внутри часто исполняемых функций — это снимет обработчики даже у элементов, которые ещё нужны. - Не смешивайте разные модели событий: если используете jQuery-цепочку, держите её в отдельном «кармане» и очищайте
$(element).off()
независимо. - Своевременное удаление: для больших SPA-страниц положите
BX.unbindAll()
вbeforeRouteLeave
(VueRouter) или аналогичный хук. - Логирование: в сложных случаях временно вставьте
чтобы увидеть, сколько обработчиков остаётся перед очисткой (требует включённого режима отладки ядра).console.log(BX.debugInfo.bindings);
7. Итог
BX.unbindAll
— простой инструмент, который помогает держать клиентский код проекта на 1С-Битрикс управляемым и производительным. Используйте его всякий раз, когда элемент удаляется из DOM или должен «забыть» все свои события. Правильно комбинируя BX.bind
, BX.unbind
, BX.unbindAll
и BX.removeCustomEvent
, вы получите чистую архитектуру фронтенда без утечек памяти и конфликтов логики.
Помните: «связал — отвяжи» — и ваш интерфейс останется быстрым, а отладка приятной.