Кратко: BX.cleanNode()
— это инструмент для удаления потомков (и самого узла при необходимости) из DOM-дерева прямо из коробки 1С-Битрикс. Функция незаменима, когда нужно быстро «обнулить» контейнер перед повторным выводом данных, освободить память, избавиться от привязанных слушателей событий и избежать «захламления» интерфейса.

Сигнатура
/**
* Очищает дочерние узлы, а при необходимости — и сам узел.
*
* @param {Node} node — целевой DOM-узел
* @param {Boolean} [selfDestroy=false] — удалить ли сам узел
* @returns {Node|null} — исходный узел или null, если он уничтожен
*/
BX.cleanNode(node, selfDestroy);
node
— любой DOM-элемент (например, полученный черезBX("id")
илиdocument.querySelector
).selfDestroy
— еслиtrue
, то удаляется и сам узел; по умолчаниюfalse
.- Возвращаемое значение:
- исходный узел, если он остался в DOM;
null
, если узел был удалён.
Почему это важно
- Избавляемся от тяжелого «мусора». После динамической подгрузки контента браузер хранит старые ноды и слушатели событий — это утечки памяти.
- Повышаем отзывчивость интерфейса. Чем меньше лишних элементов в дереве, тем быстрее работают выборки (
querySelectorAll
) и рендер. - Снижаем риски конфликтов. При повторной инициализации виджетов мы гарантируем чистое «поле» и избегаем дублирования ID.
Быстрый пример «на пальцах»
<!-- HTML -->
<button id="clearBtn" class="btn">Очистить таблицу</button>
<table id="ordersTable" class="orders">
<!-- Сюда AJAX-компонент будет добавлять строки -->
</table>
// JS
BX.ready(() => {
const clearBtn = BX('clearBtn');
const ordersTable = BX('ordersTable');
BX.bind(clearBtn, 'click', () => {
BX.cleanNode(ordersTable); // убираем ВСЕ TR внутри <table>
});
});
После клика таблица полностью очищается, а сам <table>
остаётся в DOM, так что мы можем сразу же отрисовать новые строки.
Полезные сценарии с подробными примерами
1. «Стереть и снова нарисовать»
Сценарий: у нас одно и то же модальное окно, куда приходит разный контент, загружаемый через AJAX.
<div id="modalContent" class="modal-content"></div>
<button id="loadUser" class="btn">Профиль</button>
<button id="loadOrder" class="btn">Заказ</button>
BX.ready(() => {
const box = BX('modalContent');
const btnUser = BX('loadUser');
const btnOrder = BX('loadOrder');
const loadFragment = (url) => {
BX.ajax.loadJSON(url, {}, (response) => {
BX.cleanNode(box); // очищаем старые данные
BX.append(BX.create('div', { // встраиваем новые
html: response.html
}), box);
});
};
BX.bind(btnUser, 'click', () => loadFragment('/ajax/profile.php'));
BX.bind(btnOrder, 'click', () => loadFragment('/ajax/order.php'));
});
2. «Удалить элемент целиком»
Сценарий: пользователь нажимает «Удалить виджет», и мы убираем блок вместе с содержимым.
<div id="widget" class="widget">
<button id="closeWidget" class="close">×</button>
<p>Полезное содержимое…</p>
</div>
BX.ready(() => {
BX.bind(BX('closeWidget'), 'click', function () {
// Уничтожаем кнопку, родителя и все вложенные ноды
BX.cleanNode(this.parentNode, true);
});
});
this.parentNode
указывает на <div id="widget">
, а флаг true
избавляет нас от всего блока «под корень».
3. «Сбрасываем форму перед повторной инициализацией»
Сценарий: форма собирается из кастомных полей. Нам нужно обновить её «на лету».
<form id="dynamicForm"></form>
<button id="rebuild" class="btn">Перестроить форму</button>
BX.ready(() => {
const form = BX('dynamicForm');
const renderFields = () => {
// Простейшая генерация полей
const fields = [
BX.create('input', { attrs: { type: 'text', name: 'title', placeholder: 'Заголовок' } }),
BX.create('textarea', { attrs: { name: 'desc', placeholder: 'Описание' } }),
BX.create('input', { attrs: { type: 'submit', value: 'Сохранить' }, props: { className: 'btn' } })
];
BX.append(BXFragment(...fields), form);
};
BX.bind(BX('rebuild'), 'click', () => {
BX.cleanNode(form); // убираем старые поля
renderFields(); // рисуем новые
});
renderFields(); // первичный вывод
});
4. «Чистый компонент после showMore
»
Сценарий: на длинном списке статей есть кнопка «Показать ещё». После каждой дозагрузки мы чистим индикатор загрузки.
<ul id="articlesList"></ul>
<button id="showMore" class="btn">Ещё</button>
<span id="loader" class="loader" hidden>⌛</span>
BX.ready(() => {
const list = BX('articlesList');
const more = BX('showMore');
const loader = BX('loader');
const fetchArticles = (page = 1) => {
loader.hidden = false;
BX.ajax({
url: '/ajax/articles.php',
data: { page },
method: 'GET',
dataType: 'json',
onsuccess(response) {
loader.hidden = true;
BX.cleanNode(loader); // индикатор больше не нужен
BX.append(BX.create('div', { html: response.html }), list);
}
});
};
BX.bind(more, 'click', function () {
this.dataset.page = (+this.dataset.page || 1) + 1;
fetchArticles(this.dataset.page);
});
fetchArticles(); // стартовая загрузка
});
Лучшие практики
- Отключайте слушатели заранее
Если на элемент были подвешеныBX.bind
-события извне, удалите их вручную (BX.unbindAll(node)
) передBX.cleanNode
, чтобы освободить память. - Не злоупотребляйте
innerHTML = ''
Простая строка «обнуления» оставляет «висящие» слушатели событий.BX.cleanNode
решает проблему корректно. - Проверяйте существование узла
В SPA-модулях возможно, что вызов случится после навигации, когда контейнер уже удалён; используйте короткое условие: - Флаг
true
— с осторожностью
Удалив сам узел, вы теряете ссылку на него. Присвойте переменнойnull
, чтобы избежать дальнейших обращений:
const box = BX('container');
if (box) BX.cleanNode(box);
myBlock = BX.cleanNode(myBlock, true); // myBlock теперь null
Итог
BX.cleanNode()
— это лёгкий способ держать DOM «чистым» и предсказуемым в проектах на 1С-Битрикс. Используйте функцию:
- при повторной отрисовке блоков;
- для удаления временных индикаторов;
- в AJAX-компонентах и SPA-подходах;
- для корректного освобождения ресурсов и улучшения производительности.
Внедрив BX.cleanNode
в свои скрипты, вы избавитесь от лишних элементов, ускорите работу интерфейса и снизите количество багов, связанных с дублированием контента или событий. Экономия времени — очевидна, ведь функция уже встроена в Bitrix JavaScript-ядро и готова к работе «из коробки». Удачной оптимизации!