ЭлементHTML.ВставитьПеред

Методы · InsertBefore

Вставляет узел в список дочерних перед существующим дочерним узлом, заданным параметром <Узел>. Если вставляемый узел является узлом ФрагментДокумента, то все его дочерние узлы будут вставлены перед узлом, заданным параметром <Узел>, в том же порядке. Если узел, заданный параметром <НовыйУзел>, уже содержится в дереве документа, то он сначала удаляется из дочерних узлов прежнего родителя и вставляется в список дочерних узлов нового родителя.

Синтаксис

ВставитьПеред(<НовыйУзел>, <Узел>)
Полное описание, параметры и ограничения

ЭлементHTML.ВставитьПеред (HTMLElement.InsertBefore)

ЭлементHTML (HTMLElement)

ВставитьПеред (InsertBefore)

Доступен, начиная с версии 8.2.

Синтаксис:
ВставитьПеред(<НовыйУзел>, <Узел>)
Параметры:

<НовыйУзел> (обязательный)
Тип: АтрибутHTML, ЭлементHTML, ЭлементКнопкаHTML, ЭлементВводаHTML, ЭлементЗаголовокHTML, ЭлементРазметкаHTML, ЭлементПлавающийФреймHTML, ЭлементВставкаHTML, ЭлементФреймHTML, ЭлементНаборФреймовHTML, ЭлементМетаHTML, ЭлементОбъектHTML, ЭлементСкриптHTML, ЭлементТаблицаHTML, ЭлементСтрокаТаблицыHTML, ЭлементЯчейкаТаблицыHTML, ЭлементКолонкаТаблицыHTML, ЭлементЗаголовокТаблицыHTML, ЭлементБлокHTML, ЭлементЛинияHTML, ЭлементФорматированногоТекстаHTML, ЭлементКартинкаHTML, ЭлементСвязьHTML, ЭлементЯкорьHTML, ЭлементАплетHTML, ЭлементФормаHTML, ДокументHTML, ТекстHTML, КомментарийHTML.
Вставляемый узел HTML.

<Узел> (необязательный)
Тип: АтрибутHTML, ЭлементHTML, ЭлементКнопкаHTML, ЭлементВводаHTML, ЭлементЗаголовокHTML, ЭлементРазметкаHTML, ЭлементПлавающийФреймHTML, ЭлементВставкаHTML, ЭлементФреймHTML, ЭлементНаборФреймовHTML, ЭлементМетаHTML, ЭлементОбъектHTML, ЭлементСкриптHTML, ЭлементТаблицаHTML, ЭлементСтрокаТаблицыHTML, ЭлементЯчейкаТаблицыHTML, ЭлементКолонкаТаблицыHTML, ЭлементЗаголовокТаблицыHTML, ЭлементБлокHTML, ЭлементЛинияHTML, ЭлементФорматированногоТекстаHTML, ЭлементКартинкаHTML, ЭлементСвязьHTML, ЭлементЯкорьHTML, ЭлементАплетHTML, ЭлементФормаHTML, ДокументHTML, ТекстHTML, КомментарийHTML.
Узел, перед которым необходимо вставить узел, заданный в параметре <НовыйУзел>. Если параметр не задан, то узел добавляется к концу списка дочерних узлов.
Возвращаемое значение:
Тип: АтрибутHTML, ЭлементHTML, ЭлементКнопкаHTML, ЭлементВводаHTML, ЭлементЗаголовокHTML, ЭлементРазметкаHTML, ЭлементПлавающийФреймHTML, ЭлементВставкаHTML, ЭлементФреймHTML, ЭлементНаборФреймовHTML, ЭлементМетаHTML, ЭлементОбъектHTML, ЭлементСкриптHTML, ЭлементТаблицаHTML, ЭлементСтрокаТаблицыHTML, ЭлементЯчейкаТаблицыHTML, ЭлементКолонкаТаблицыHTML, ЭлементЗаголовокТаблицыHTML, ЭлементБлокHTML, ЭлементЛинияHTML, ЭлементФорматированногоТекстаHTML, ЭлементКартинкаHTML, ЭлементСвязьHTML, ЭлементЯкорьHTML, ЭлементАплетHTML, ЭлементФормаHTML, ДокументHTML, ТекстHTML, КомментарийHTML.

Описание:

Вставляет узел в список дочерних перед существующим дочерним узлом, заданным параметром <Узел>.
Если вставляемый узел является узлом ФрагментДокумента, то все его дочерние узлы будут вставлены перед узлом, заданным параметром <Узел>, в том же порядке. Если узел, заданный параметром <НовыйУзел>, уже содержится в дереве документа, то он сначала удаляется из дочерних узлов прежнего родителя и вставляется в список дочерних узлов нового родителя.

Доступность:

Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Причины вызова исключения:
данный узел не допускает в качестве дочерних добавляемый узел или добавляемый узел является одним из предков данного или узел добавляется сам в себя или данный узел Документ и добавляется второй узел ОпределениеТипаДокумента или Элемент;

добавляемый узел был создан документом отличным от создавшего данный узел;

данный узел в режиме Только для чтения или если предыдущий родитель добавляемого узла в режиме Только для чтения;

узел, перед которым осуществляется вставка, не найден.

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Проверить ограничения корня и редактировать правильный HTML-контейнер

На собственном документе намеренно проверяем четыре документированных ошибки корневых операций, затем выполняем вставку, замену и удаление обычных дочерних элементов своего блока.

Где и как запускать

Полный серверный общий модуль УчебныйДокументHTML85. Свой HTML создаётся строкой и разбирается в памяти, без браузера и внешних источников.

Подготовка

  1. Используйте отдельную учебную базу 8.5.1.1343. Создайте общий модуль УчебныйДокументHTML85: Сервер — Да, Клиент — Нет, Глобальный — Нет, Вызов сервера — Нет, Привилегированный — Нет.

  2. Вставьте весь приведённый модуль одного урока. В своей управляемой учебной обработке создайте команду и клиентский обработчик, вызывающий свою процедуру с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйДокументHTML85.ВыполнитьПример();.

  3. Источник HTML полностью записан в коде: свой вымышленный заказ, покупатель, книга, ручка и элементы с явно заданными id. ЧтениеHTML и ПостроительDOM получают строку, а не URL или внешний файл.

  4. Разбор HTML в этом уроке не открывает браузер, не отправляет форму, не загружает картинки и не исполняет JavaScript. Файлы, сеть, печать, рабочие документы и регистры не используются.

  5. Каждый запуск создаёт новый собственный документ в памяти. Поставьте точку останова перед конечными Сообщить и исследуйте Документ, его ЭлементДокумента и указанные переменные урока в серверном отладчике.

  6. ДокументHTML — корневой объект дерева, а его ЭлементДокумента, Тело и отдельный блок — другие узлы. Одинаковые имена методов не означают одинаковые правила допустимых дочерних узлов.

  7. Результаты ниже ожидаемые. В 1С код не запускался; статическая сверка сигнатур и readonly не подтверждает все особенности реализации HTML DOM вашей среды. Выполните проверки только на своём учебном стенде.

Процедура ВыполнитьПример() Экспорт
    HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
    |<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
    |B-02: 1</pre>
    |<form id='order' name='order' action='' method='get'>
    |<input id='customer' name='customer' type='text' value='Учебный покупатель'>
    |<input id='accepted' name='accepted' type='checkbox' value='yes'>
    |<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
    |<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
    |<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
    |</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
    |</body></html>";
    Чтение = Новый ЧтениеHTML;
    Чтение.УстановитьСтроку(HTML);
    Попытка
        Построитель = Новый ПостроительDOM;
        Документ = Построитель.Прочитать(Чтение);
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
        ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
    КонецЕсли;
    Форма = Документ.ПолучитьЭлементПоИдентификатору("order");
    Если Форма = Неопределено Тогда
        ВызватьИсключение "В своём HTML нужна форма order";
    КонецЕсли;
    Если ТипЗнч(Форма) <> Тип("ЭлементФормаHTML") Тогда
        ВызватьИсключение "order должен быть собственной HTML-формой";
    КонецЕсли;
    Блок = Документ.СоздатьЭлемент("div");
    Блок.УстановитьАтрибут("id", "own-work");
    Форма.ДобавитьДочерний(Блок);
    Корень = Документ.ЭлементДокумента;
    НовыйКорень = Документ.СоздатьЭлемент("html");
    Отклонено = 0;
    Попытка
        Документ.ДобавитьДочерний(НовыйКорень);
    Исключение
        Отклонено = Отклонено + 1;
    КонецПопытки;
    Попытка
        Документ.ВставитьПеред(НовыйКорень, Корень);
    Исключение
        Отклонено = Отклонено + 1;
    КонецПопытки;
    Попытка
        Документ.ЗаменитьДочерний(Документ, Корень);
    Исключение
        Отклонено = Отклонено + 1;
    КонецПопытки;
    Попытка
        Документ.УдалитьДочерний(Документ);
    Исключение
        Отклонено = Отклонено + 1;
    КонецПопытки;
    Если Отклонено <> 4 Или Не Документ.ЭлементДокумента.УзелИдентичен(Корень) Тогда
        ВызватьИсключение "Реализация не подтвердила ожидаемые ограничения собственного корня";
    КонецЕсли;
    Книга = Документ.СоздатьЭлемент("span");
    Книга.ТекстовоеСодержимое = "Книга";
    Ручка = Документ.СоздатьЭлемент("span");
    Ручка.ТекстовоеСодержимое = "Ручка";
    Блок.ДобавитьДочерний(Книга);
    Блок.ВставитьПеред(Ручка, Книга);
    Сообщить(Блок.ДочерниеУзлы.Количество() = 2);
    Сообщить(Блок.ПервыйДочерний.УзелИдентичен(Ручка));
    Замена = Документ.СоздатьЭлемент("span");
    Замена.ТекстовоеСодержимое = "Блокнот";
    Блок.ЗаменитьДочерний(Замена, Книга);
    Сообщить(Блок.ДочерниеУзлы.Количество() = 2);
    Сообщить(Блок.ПоследнийДочерний.УзелИдентичен(Замена));
    Блок.УдалитьДочерний(Ручка);
    Сообщить(Блок.ДочерниеУзлы.Количество() = 1);
    Сообщить(Блок.ТекстовоеСодержимое = "Блокнот");

КонецПроцедуры

Разбор по шагам

  1. Свой документ уже имеет один корневой html. Отдельный новый html создан той же фабрикой документа, поэтому ошибка второго корня не маскируется ошибкой другого документа-владельца.

  2. ДобавитьДочерний и ВставитьПеред на уровне ДокументHTML намеренно пытаются добавить второй элемент корня. Это отрицательные проверки документированного ограничения, не рецепт создания страницы.

  3. ЗаменитьДочерний(Документ,Корень) пытается поместить документ внутрь самого себя; УдалитьДочерний(Документ) ищет ребёнка, которым документ не является. Оба вызова намеренно проверяют исключения.

  4. Каждое исключение учитывается; четыре отказа и сохранение прежнего корня проверяются до позитивной части. Сырые сообщения ошибок не интерпретируются как доказательство конкретного языка или одинакового текста ошибки.

  5. Для нормальной работы используется собственный div внутри тела: добавляем Книга и вставляем Ручка перед ней. Обе созданы тем же ДокументHTML.

  6. Заменяем только дочернюю Книга на свой Блокнот, затем удаляем только Ручка из правильного родительского блока.

  7. Проверяем порядок, число детей и конечную надпись. Меняется дерево в памяти; файлы и любые пользовательские окна не трогаются.

Как проверить результат

  1. Отрицательная часть ожидает четыре исключения и неизменный корень; при иной реализации урок выдаёт явную ошибку вместо ложного успеха.

  2. Шесть конечных сравнений позитивной части Истина. После всех изменений один ребёнок с текстом Блокнот.

  3. Не переносите отрицательные вызовы в прикладной код. Для обычных элементов используйте реальные родительские контейнеры и узлы собственного документа.

Ожидаемый результат

Ограничения корневого узла отделены от корректных операций со своим обычным HTML-контейнером.

На что обратить внимание

  1. Этот урок намеренно содержит отрицательные вызовы внутри Попытка. Они проверяют ошибки API; сами по себе не считаются успешной правкой документа.

  2. Метод с тем же именем у ДокументHTML и ЭлементHTML может иметь разные ограничения на дочерние узлы.

  3. Не создавайте второй корень, не вставляйте узел сам в себя и не удаляйте ребёнка у неверного родителя.

  4. Узлы другого документа нужно отдельно переносить документированным механизмом; этот урок не придумывает аргументы для противоречивой страницы АдаптироватьУзел.

  5. Статические проверки не доказали фактические исключения платформы. Проверьте именно ожидаемые отказы на своём учебном стенде.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Вставить пояснение между двумя текстовыми фрагментами

ВставитьПеред получает конкретный существующий дочерний узел, а не числовой индекс и не узел из чужого документа.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Используйте учебную базу платформы 8.5.1.1343 и серверную процедуру учебного общего модуля. Каждый пример выполняйте отдельно.

  2. Все данные заказа вымышлены и находятся в строке. ЧтениеHTML разбирает данные, но не является браузером: форма не отправляется, ссылки не открываются, картинки не скачиваются.

  3. Никакие файлы, адреса сайтов, токены и документы информационной базы не нужны. Не заменяйте учебную строку произвольным внешним HTML без отдельной проверки безопасности.

  4. Индексы коллекций начинаются с нуля. Перед обращением к найденному узлу проверяйте Неопределено; перед специальными свойствами элемента проверяйте его тип.

HTML = "<html><head><title>Учебный заказ</title><meta id='meta' name='description' content='Вымышленный заказ'></head>
|<body id='body'><p id='note'>Заказ существует только в памяти</p><pre id='code'>A-01: 3
|B-02: 1</pre>
|<form id='order' name='order' action='' method='get'>
|<input id='customer' name='customer' type='text' value='Учебный покупатель'>
|<input id='accepted' name='accepted' type='checkbox' value='yes'>
|<button id='preview' name='preview' type='button' value='preview'>Предпросмотр</button></form>
|<table id='items' summary='Книга и ручка'><caption id='caption'>Товары</caption><colgroup><col id='column'></colgroup><tbody>
|<tr id='book'><td id='book-name'>Книга</td><td>3</td></tr><tr id='pen'><td>Ручка</td><td>1</td></tr>
|</tbody></table><a id='help' name='help' href='#note'>Пояснение</a><img id='logo' alt='Учебная картинка без источника'>
|</body></html>";
Чтение = Новый ЧтениеHTML;
Чтение.УстановитьСтроку(HTML);
Попытка
    Построитель = Новый ПостроительDOM;
    Документ = Построитель.Прочитать(Чтение);
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументHTML") Тогда
    ВызватьИсключение "Ожидался ДокументHTML, а не XML-документ";
КонецЕсли;
Форма = Документ.ПолучитьЭлементПоИдентификатору("order");
Если Форма = Неопределено Тогда
    ВызватьИсключение "Не найден учебный элемент order";
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("ЭлементФормаHTML") Тогда
    ВызватьИсключение "Неожиданный тип учебного элемента order";
КонецЕсли;
Блок = Документ.СоздатьЭлемент("guide-section");
Если ТипЗнч(Блок) <> Тип("ЭлементHTML") Тогда
    ВызватьИсключение "Учебный контейнер должен иметь общий тип ЭлементHTML";
КонецЕсли;
Форма.ДобавитьДочерний(Блок);
Первый = Документ.СоздатьТекстовыйУзел("Книга");
Последний = Документ.СоздатьТекстовыйУзел("3");
Разделитель = Документ.СоздатьТекстовыйУзел(": ");
Блок.ДобавитьДочерний(Первый);
Блок.ДобавитьДочерний(Последний);
Блок.ВставитьПеред(Разделитель, Последний);
Сообщить(Блок.ТекстовоеСодержимое = "Книга: 3");
Сообщить(Блок.ДочерниеУзлы.Количество() = 3);
Сообщить(Разделитель.ПредыдущийСоседний = Первый);
Сообщить(Разделитель.СледующийСоседний = Последний);

Разбор по шагам

  1. Готовим три собственных текста одного документа.

  2. Сначала в контейнере находятся Книга и 3.

  3. Передаём существующий Последний как ориентир вставки, не число 1.

  4. Проверяем текст, число узлов и соседство нового разделителя.

Как проверить результат

  1. Четыре сравнения дают Истина: строка Книга: 3, три узла и правильные соседи.

  2. После дополнительного Нормализовать число текстовых узлов может сократиться, но само пояснение останется тем же.

Ожидаемый результат

Показана адресная вставка относительно известного дочернего узла.

На что обратить внимание

  1. Ориентир должен принадлежать указанному родителю.

  2. Позиция в дереве не равна порядковому номеру заказа в базе.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.