Встраивание элементов в DOM
Свойство innerHTML
Еще один способ создать DOM-элементы и поместить их в дерево - это использовать строки с тегами и позволить браузеру сделать всю тяжелую работу. У такого подхода есть свои плюсы и минусы.
Чтение
Свойство innerHTML
хранит содержимое элемента, включая теги, в виде строки. Возвращаемое значение это всегда валидный HTML-код.
Изменение
Свойство innerHTML
доступно как для чтения, так и для записи. Если записать в него строку с HTML-тегами, то браузер во время парсинга строки превратит их в валидные элементы и добавит в DOM-дерево.
Если в свойство innerHTML
записать пустую строку, то содержимое элемента будет очищено. Это простой и быстрый способ удаления всего содержимого.
При таком подходе, в отличии от document.createElement()
, мы не получаем ссылку на созданный DOM-элемент. Это первый шаг на пути к шаблонизации - создания большого количества однотипной разметки с разными данными по заранее определённому шаблону. Например, как в списке товаров интернет магазина и т. п.
Однотипная (шаблонная) разметка создается из массива данных. Приём заключается в переборе этого массива и составлении одной строки с HTML тегами, которую потом записываем в innerHTML
элемента.
Добавление
Изменение elem.innerHTML
полностью удалит и пересоздаст всех потомков элемента elem
. Если элемент изначально не пустой, то будут дополнительные затраты на сериализацию уже существующей разметки, а это плохо.
Используйте свойство elem.innerHTML
для добавления только в случае когда элемент elem
пустой или если надо полностью заменить его содержимое.
Метод insertAdjacentHTML()
insertAdjacentHTML()
Современный метод для добавления строки с HTML-тегами до, после или внутрь элемента. Решает проблему innerHTML
с повторной сериализацией содержимого элемента при добавлении разметки к уже существующей.
Аргумент position
- это строка, позиция относительно элемента elem
. Принимает одно из четырёх значений.
"beforebegin"
- передelem
"afterbegin"
- внутриelem
, перед всеми детьми"beforeend"
- внутриelem
, после всех детей"afterend"
- послеelem
"beforebegin"
и "afterend"
работают только в том случае, если elem
уже находится в DOM-дереве.
Last updated