ЭлементСкриптHTML.ПервыйДочерний

Свойства · FirstChild

Тип: ЭлементСкриптHTML, Неопределено. Первый дочерний узел HTML или Неопределено, если дочерних узлов нет.

Полное описание, параметры и ограничения

ЭлементСкриптHTML.ПервыйДочерний (HTMLScriptElement.FirstChild)

ЭлементСкриптHTML (HTMLScriptElement)

ПервыйДочерний (FirstChild)

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

Использование:
Только чтение.
Описание:
Тип: ЭлементСкриптHTML, Неопределено.
Первый дочерний узел HTML или Неопределено, если дочерних узлов нет.
Доступность:

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

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

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

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

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

Проверить паспорт и границы пустых HTML-элементов

Для каждого созданного элемента читаем имена, тип, текст и атрибуты. До перехода к детям проверяем, существуют ли они.

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

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

Подготовка

  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-документ";
КонецЕсли;
Ожидаемые = Новый Соответствие;
Ожидаемые.Вставить("guide-section", "ЭлементHTML");
Ожидаемые.Вставить("div", "ЭлементБлокHTML");
Ожидаемые.Вставить("pre", "ЭлементФорматированногоТекстаHTML");
Ожидаемые.Вставить("form", "ЭлементФормаHTML");
Ожидаемые.Вставить("input", "ЭлементВводаHTML");
Ожидаемые.Вставить("button", "ЭлементКнопкаHTML");
Ожидаемые.Вставить("table", "ЭлементТаблицаHTML");
Ожидаемые.Вставить("tr", "ЭлементСтрокаТаблицыHTML");
Ожидаемые.Вставить("td", "ЭлементЯчейкаТаблицыHTML");
Ожидаемые.Вставить("col", "ЭлементКолонкаТаблицыHTML");
Ожидаемые.Вставить("caption", "ЭлементЗаголовокТаблицыHTML");
Ожидаемые.Вставить("a", "ЭлементЯкорьHTML");
Ожидаемые.Вставить("img", "ЭлементКартинкаHTML");
Ожидаемые.Вставить("meta", "ЭлементМетаHTML");
Ожидаемые.Вставить("link", "ЭлементСвязьHTML");
Ожидаемые.Вставить("head", "ЭлементЗаголовокHTML");
Ожидаемые.Вставить("html", "ЭлементРазметкаHTML");
Ожидаемые.Вставить("hr", "ЭлементЛинияHTML");
Ожидаемые.Вставить("script", "ЭлементСкриптHTML");
Ожидаемые.Вставить("iframe", "ЭлементПлавающийФреймHTML");
Ожидаемые.Вставить("frame", "ЭлементФреймHTML");
Ожидаемые.Вставить("frameset", "ЭлементНаборФреймовHTML");
Ожидаемые.Вставить("embed", "ЭлементВставкаHTML");
Ожидаемые.Вставить("object", "ЭлементОбъектHTML");
Ожидаемые.Вставить("applet", "ЭлементАплетHTML");
Для Каждого Пара Из Ожидаемые Цикл
    Узел = Документ.СоздатьЭлемент(Пара.Ключ);
    Если ТипЗнч(Узел) <> Тип(Пара.Значение) Тогда
        ВызватьИсключение "Фактический тип фабрики отличается для " + Пара.Ключ;
    КонецЕсли;
    Сообщить(СтрШаблон("%1: %2 / %3 / %4", Пара.Ключ,
        Узел.ИмяУзла, Узел.ИмяЭлемента, Узел.ТипУзла));
    Сообщить(СтрШаблон("Локальное имя: %1; префикс: %2", Узел.ЛокальноеИмя, Узел.Префикс));
    Сообщить("Значение узла: " + Строка(Узел.ЗначениеУзла));
    Сообщить("Текст: " + Узел.ТекстовоеСодержимое);
    Сообщить(Узел.ДочерниеУзлы.Количество() = 0);
    Сообщить(Не Узел.ЕстьДочерниеУзлы());
    Сообщить(Узел.ПервыйДочерний = Неопределено);
    Сообщить(Узел.ПоследнийДочерний = Неопределено);
    Сообщить(Узел.ПредыдущийСоседний = Неопределено);
    Сообщить(Узел.СледующийСоседний = Неопределено);
    Сообщить(Узел.ЕстьАтрибуты() = (Узел.Атрибуты.Количество() > 0));
КонецЦикла;

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

  1. Пустые элементы созданы отдельно, а не найдены в заполненном внешнем документе.

  2. ИмяУзла обозначает тег; ЗначениеУзла не заменяет значение input или текст кнопки.

  3. Узел не вставлен в дерево, поэтому у него нет соседей; у пустого элемента нет детей.

  4. Фактическое количество атрибутов сопоставляем с ЕстьАтрибуты, не предполагая отсутствие значений по умолчанию.

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

  1. В каждом блоке семь сравнений Истина: пустые дети, границы и согласованность признака атрибутов.

  2. Вывод имён и значений изучите отдельно: регистр тегов и представление Неопределено не объявлены бизнес-данными.

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

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

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

  1. Не обращайтесь к ПервыйДочерний.Данные без проверки наличия ребёнка.

  2. У ЭлементТелоHTML в экспортированной справке другой набор свойств, поэтому он исключён из списка.

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

Вставить, заменить и удалить собственные служебные узлы контейнеров

В контейнерных элементах работаем с безопасными HTML-комментариями. Не добавляем детей в пустые теги input, img, col, meta, link, hr, frame и embed.

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

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

Подготовка

  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-документ";
КонецЕсли;
Ожидаемые = Новый Соответствие;
Ожидаемые.Вставить("guide-section", "ЭлементHTML");
Ожидаемые.Вставить("div", "ЭлементБлокHTML");
Ожидаемые.Вставить("pre", "ЭлементФорматированногоТекстаHTML");
Ожидаемые.Вставить("form", "ЭлементФормаHTML");
Ожидаемые.Вставить("button", "ЭлементКнопкаHTML");
Ожидаемые.Вставить("table", "ЭлементТаблицаHTML");
Ожидаемые.Вставить("tr", "ЭлементСтрокаТаблицыHTML");
Ожидаемые.Вставить("td", "ЭлементЯчейкаТаблицыHTML");
Ожидаемые.Вставить("caption", "ЭлементЗаголовокТаблицыHTML");
Ожидаемые.Вставить("a", "ЭлементЯкорьHTML");
Ожидаемые.Вставить("head", "ЭлементЗаголовокHTML");
Ожидаемые.Вставить("html", "ЭлементРазметкаHTML");
Ожидаемые.Вставить("script", "ЭлементСкриптHTML");
Ожидаемые.Вставить("iframe", "ЭлементПлавающийФреймHTML");
Ожидаемые.Вставить("frameset", "ЭлементНаборФреймовHTML");
Ожидаемые.Вставить("object", "ЭлементОбъектHTML");
Ожидаемые.Вставить("applet", "ЭлементАплетHTML");
Для Каждого Пара Из Ожидаемые Цикл
    Узел = Документ.СоздатьЭлемент(Пара.Ключ);
    Если ТипЗнч(Узел) <> Тип(Пара.Значение) Тогда
        ВызватьИсключение "Фактический тип фабрики отличается для " + Пара.Ключ;
    КонецЕсли;
    Первый = Документ.СоздатьКомментарий("Урок A-01");
    Второй = Документ.СоздатьКомментарий("Проверка 3");
    НовыйУзел = Документ.СоздатьКомментарий("Проверка завершена");
    Узел.ДобавитьДочерний(Первый);
    Узел.ВставитьПеред(Второй, Первый);
    Сообщить(Узел.ПервыйДочерний = Второй);
    Узел.ЗаменитьДочерний(НовыйУзел, Первый);
    Сообщить(Узел.ПоследнийДочерний = НовыйУзел);
    Сообщить(Первый.РодительскийУзел = Неопределено);
    Узел.Нормализовать();
    Сообщить(Узел.ДочерниеУзлы.Количество() = 2);
    Удалённый = Узел.УдалитьДочерний(Второй);
    Сообщить(Удалённый = Второй);
    Узел.УдалитьДочерний(НовыйУзел);
    Сообщить(Не Узел.ЕстьДочерниеУзлы());
КонецЦикла;

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

  1. Обрабатываем только 17 непустых по модели HTML тегов; элементы остаются вне документа заказа.

  2. ДобавитьДочерний вставляет первый служебный узел, ВставитьПеред добавляет второй перед ним.

  3. ЗаменитьДочерний вызывается без присваивания результата; прежний узел становится отсоединённым.

  4. Нормализовать не объединяет HTML-комментарии, затем удаляем два оставшихся узла.

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

  1. Шесть сравнений для каждого контейнера Истина; в конце у него снова нет детей.

  2. Комментарии не отображаются как текст заказа и не содержат исполняемого кода.

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

Показаны основные операции изменения дочернего дерева на конкретных контейнерных типах.

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

  1. Не используйте текст комментария как скрытое хранилище секретов.

  2. Служебные комментарии не равны тегам товаров или новым строкам таблицы.

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

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

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

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

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