Блог разработчика 1С-Битрикс

Управление DOM-структурой в 1С-Битрикс: мощь BX.cleanNode

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

Управление DOM-структурой. BX.cleanNode

Сигнатура

/**
 * Очищает дочерние узлы, а при необходимости — и сам узел.
 *
 * @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, если узел был удалён.

Почему это важно

  1. Избавляемся от тяжелого «мусора». После динамической подгрузки контента браузер хранит старые ноды и слушатели событий — это утечки памяти.
  2. Повышаем отзывчивость интерфейса. Чем меньше лишних элементов в дереве, тем быстрее работают выборки (querySelectorAll) и рендер.
  3. Снижаем риски конфликтов. При повторной инициализации виджетов мы гарантируем чистое «поле» и избегаем дублирования 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(); // стартовая загрузка
});

Лучшие практики

  1. Отключайте слушатели заранее
    Если на элемент были подвешены BX.bind-события извне, удалите их вручную (BX.unbindAll(node)) перед BX.cleanNode, чтобы освободить память.
  2. Не злоупотребляйте innerHTML = ''
    Простая строка «обнуления» оставляет «висящие» слушатели событий. BX.cleanNode решает проблему корректно.
  3. Проверяйте существование узла
    В SPA-модулях возможно, что вызов случится после навигации, когда контейнер уже удалён; используйте короткое условие:
  4. const box = BX('container');
    if (box) BX.cleanNode(box);
  5. Флаг true — с осторожностью
    Удалив сам узел, вы теряете ссылку на него. Присвойте переменной null, чтобы избежать дальнейших обращений:
  6. myBlock = BX.cleanNode(myBlock, true); // myBlock теперь null

Итог

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

  • при повторной отрисовке блоков;
  • для удаления временных индикаторов;
  • в AJAX-компонентах и SPA-подходах;
  • для корректного освобождения ресурсов и улучшения производительности.

Внедрив BX.cleanNode в свои скрипты, вы избавитесь от лишних элементов, ускорите работу интерфейса и снизите количество багов, связанных с дублированием контента или событий. Экономия времени — очевидна, ведь функция уже встроена в Bitrix JavaScript-ядро и готова к работе «из коробки». Удачной оптимизации!

Теги:  DOM, BX.cleanNode, JavaScript, оптимизация, производительность, очистка узлов


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная