Полный цикл в digital

Создание DOM элемента в библиотеке BX

В ядре JavaScript-библиотеки 1С-Битрикс у функции BX.create особая роль, это универсальный конструктор DOM-узлов, который за один вызов позволяет:

  • задать тэг,
  • назначить свойства props и атрибуты attrs
  • навесить CSS-стили style
  • описать dataset
  • подключить обработчики событий events
  • вставить дочерние элементы, или текст/HTML-содержимое
// Короткая форма
DOMNode BX.create(tag [, data [, context]]);
//Расширенная форма — вся конфигурация в одном объекте
DOMNode BX.create(data [, context]);
  • tag строка с tagName узла, если он не указан, свойство tag обязательно должно присутствовать в объекте data
  • data описательный объект
  • context DOM-контекст например, iframe.contentDocument, внутри которого создаётся элемент. По умолчанию document

Объект data, поля и особенности

Поле Что задаёт Пример
tag Имя тега (если не передано первым параметром) 'div'
props DOM-свойства (className, value, checked…) {className: 'btn', htmlFor: 'name'}
attrs HTML-атрибуты {readonly: 'readonly', 'data-id': 42}
style Инлайн-стили объектом {backgroundColor: '#ffe'}
dataset Значения data-* {userId: 15}data-user-id="15"
events Обработчики событий {click: handler}
children Массив дочерних узлов [ BX.create('span', …) ]
text Текстовое содержимое узла 'Hello'
html HTML-строка внутри узла '<b>Hi</b>'

text, html и children взаимоисключают друг друга. Если указать более одного поля, отработает только первое найденное.

Текстовое поле только для чтения

const readonlyInput = BX.create('input', {
    attrs: { readonly: 'readonly', placeholder: 'Только для чтения' },
    props: { className: 'form-control' }
});

Кнопка с событием

function onComplete() {
    console.log('Клик по', BX.proxy_context); // BX.proxy_context → текущий элемент
}
const completeBtn = BX.create('span', {
    attrs: { title: 'Завершить задачу' },
    props: { className: 'task-view-button' },
    dataset: { taskId: 123 },
    text: 'Завершить',
    events: { click: BX.proxy(onComplete, this) }
});

Составная форма, построение целой формы на лету

const popupFields = BX.create({
    tag: 'div',
    props: { className: 'formFieldsContainer' },
    children: [
        BX.create({
            tag: 'div',
            props: { className: 'form-group' },
            children: [
                BX.create({
                    tag: 'label',
                    attrs: { for: 'reviewName' },
                    text: 'Ваше имя'
                }),
                BX.create({
                    tag: 'input',
                    attrs: {
                        id: 'reviewName',
                        type: 'text',
                        placeholder: 'Ваше имя',
                        name: 'reviewName'
                    },
                    props: { className: 'form-control' }
                })
            ]
        }),
        BX.create({
            tag: 'div',
            props: { className: 'form-group' },
            children: [
                BX.create({
                    tag: 'label',
                    attrs: { for: 'reviewSite' },
                    text: 'Адрес сайта'
                }),
                BX.create({
                    tag: 'input',
                    attrs: {
                        id: 'reviewSite',
                        name: 'reviewSite',
                        type: 'text',
                        placeholder: 'Адрес сайта'
                    },
                    props: { className: 'form-control' }
                })
            ]
        }),
        BX.create({
            tag: 'div',
            props: { className: 'form-group' },
            children: [
                BX.create({
                    tag: 'label',
                    attrs: { for: 'reviewText' },
                    text: 'Ваш отзыв'
                }),
                BX.create({
                    tag: 'textarea',
                    attrs: {
                        id: 'reviewText',
                        name: 'reviewText',
                        rows: 3
                    },
                    props: { className: 'form-control' }
                })
            ]
        })
    ]
});

Вставка в документ

// «container» — id существующего блока
BX.append(popupFields, BX('container'));

Работа с context

Если нужно строить DOM-элементы внутри iframe передаём второй/третий параметр:

const iframeDoc = BX('reportFrame').contentDocument;
const reportBtn  = BX.create('button', {
    text: 'Сформировать',
    props: { className: 'btn btn-success' }
}, iframeDoc);
BX.append(reportBtn, iframeDoc.body);
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!