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

Управление DOM-структурой в 1С-Битрикс: всё о BX.remove

Кратко: BX.remove() — это “скальпель” для фронтенд-разработчика на 1С-Битрикс. С его помощью можно грамотно очищать DOM от временных элементов, всплывающих подсказок, динамически созданных форм или модальных окон, не оставляя «мёртвых» ссылок и обработчиков событий.

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

1. Сигнатура и назначение

/**
 * Удаляет элемент из DOM-дерева.
 * @param {HTMLElement} node – узел, который нужно удалить.
 * @returns {null}
 */
BX.remove(node);
  • Возвращает всегда null.
  • Безопасно работает во всех поддерживаемых браузерах.
  • Удаляет сам элемент и его дочерние узлы, освобождая память.

2. Базовые кейсы

Ситуация Короткий рецепт
Скрыть сообщение об успешной отправке формы Создайте блок с id successMsg, по таймеру setTimeout(() => BX.remove(BX('successMsg')), 3000)
Очистить корзину после оформления заказа Переберите cartItems и для каждого вызовите BX.remove(item)
Закрыть модальное окно BX.remove(document.querySelector('.modal-overlay'))

3. Пример: интерактивный переключатель со сменой иконки


<div id="toggleBox" class="arrow--green" data-state="green">
  <span class="label">toggleClass</span>
  <img id="arrowIcon" src="/assets/icons/arrow-green.svg" alt="arrow">
</div>
<script>
BX.ready(function () {
  const box   = BX('toggleBox');
  const icon  = BX('arrowIcon');
  const states = [
    {cls: 'arrow--green', src: '/assets/icons/arrow-green.svg'},
    {cls: 'arrow--up',    src: '/assets/icons/arrow-up.svg'},
    {cls: 'arrow--down',  src: '/assets/icons/arrow-down.svg'}
  ];
  BX.bind(box, 'click', () => {
    // Определяем текущий индекс состояния
    const current = states.findIndex(s => BX.hasClass(box, s.cls));
    const next    = (current + 1) % states.length;
    // Снимаем все возможные классы и применяем следующий
    states.forEach(s => BX.removeClass(box, s.cls));
    BX.addClass(box, states[next].cls);
    // Обновляем иконку: удаляем старую и добавляем новую
    BX.remove(icon);
    box.appendChild(
      BX.create('img', {
        props: {
          id: 'arrowIcon',
          src: states[next].src,
          alt: 'arrow'
        }
      })
    );
  });
});
</script>
<style>
#toggleBox{
  margin:12px auto;
  width:95px;
  padding:6px 10px;
  text-align:center;
  border-radius:6px;
  box-shadow:0 0 8px rgba(0,0,0,.4);
  cursor:pointer;
  user-select:none;
  transition:background-color .3s;
}
.arrow--green{background:#a4d07b;color:#fff;}
.arrow--up   {background:#4a90e2;color:#fff;}
.arrow--down {background:#e94e77;color:#fff;}
#toggleBox img{width:18px;height:18px;vertical-align:middle;margin-left:4px;}
</style>

4. Комбинируем BX.remove с другими методами

4.1 Очистка слушателей событий

В старых проектах можно встретить «висящие» обработчики:

const btn = BX('submitBtn');
const handler = () => alert('click');
BX.bind(btn, 'click', handler);
// Позже нужно полностью убрать кнопку
BX.unbind(btn, 'click', handler); // снимаем обработчик
BX.remove(btn); // и только потом удаляем DOM-узел

Если вызвать BX.remove без BX.unbind, браузер всё равно уберёт элемент, но обработчик останется в памяти у старых браузеров — это риск утечки.

4.2 Создание → Работа → Удаление

const loader = BX.create('div', {
  props: {className: 'loader'},
  text: 'Загружаем...'
});
BX.append(loader, document.body);
// ... ждём завершения AJAX ...
BX.remove(loader);

5. Асинхронное удаление внутри Promise / async-функций

async function fetchData() {
  const overlay = BX.create('div', {props: {className: 'overlay'}});
  BX.append(overlay, document.body);
  try {
    const data = await BX.ajax.runComponentAction('my:component', 'load');
    console.log(data);
  } finally {
    BX.remove(overlay); // всегда уберётся, даже при ошибке
  }
}

finally гарантирует, что оверлей исчезнет вне зависимости от результата запроса.


6. Проверяем элемент перед удалением

Передавать в BX.remove null безопасно, но из-за лишних вызовов может страдать производительность. Сделайте дополнительную проверку, если функция бегает в цикле:

if (node && node.parentNode) {
  BX.remove(node);
}

7. Когда не использовать BX.remove

Вместо Используйте
Часто добавлять/убирать один и тот же блок BX.style(node, 'display', 'none') или BX.hide/BX.show
Нужно вернуть элемент обратно BX.detach(node) — снимет элемент, сохранив ссылку для повторной вставки

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

  1. Всегда снимайте обработчики (BX.unbind, BX.removeCustomEvent) перед удалением крупных виджетов.
  2. Используйте деградацию: если есть MutationObserver, проверяйте, удалился ли элемент автоматически.
  3. Для элементов, созданных внутри Vue/React-виджетов, пусть удалением управляет сам фреймворк; прямой вызов BX.remove может нарушить виртуальный DOM.
  4. Избегайте каскадного удаления “вглубь” больших веток — лучше удалите родителя, это быстрее.

Итоги

BX.remove() — небольшая, но незаменимая функция API ядра Bitrix, которая помогает держать DOM «чистым» и память браузера под контролем. Грамотное использование метода вместе с правильной работой с событиями и динамическими классами делает интерфейсы быстрее, а код — поддерживаемым. Попрактикуйтесь с примерами выше, и управление DOM-структурой в Bitrix перестанет быть «чёрной магией».

Теги:  BX.remove, DOM, фронтенд, разработка, JavaScript


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

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.