Работа с узлами DOM

Элемент DOM - это узел, который объявлен с использованием тега в HTML-документе (например, <html><head>,<body> и т.д.). Далее, в синтаксисе методов, обозначается как Element или element. Все остальные узлы обозначаются в синтаксисе методов как Node или node.

Создание узлов DOM

Метод document.createElement() (создание элемента DОM)

Метод document.createElement(tagName) создает в документе:

  • HTML элемент, указанный в tagName, или
  • HTMLUnknownElement, если tagName не распознается.

Синтаксис:

где

  • tagName - строка, определяющая тип создаваемого элемента, при этом NodeName создаваемого элемента инициализируется значением tagName;
  • param (необязательный) - объект ElementCreationOptions, содержащий одно свойство с именем is, значение которого является именем тега настраиваемого элемента, ранее определенного с помощью customElements.define().

Не используйте полные имена (например, «html: a») с этим методом.

Возвращаемое значение:

  • новый HTMLElement, если документ является HTMLDocument;
  • новый элемент.

Особенности метода document.createElement():

  1. при вызове HTML-документа createElement()  перед созданием элемента преобразует tagName в нижний регистр;
  2. в Firefox, Opera и Chrome createElement(null) работает аналогично createElement("null")

Пример:

[свернуть]
Метод Document.createTextNode() (создание текстового узла)

Метод Document.createTextNode() создаёт новый текстовый узел. Этот метод можно использовать для экранирования символов HTML.

Синтаксис:

где

  • text - это текстовый узел;
  • data - это строка с данными, которые будут помещены в текстовый узел.

[свернуть]
Метод Node.cloneNode() (дубликат узла)

Метод Node.cloneNode() возвращает дубликат узла, из которого этот метод был вызван.

Синтаксис:

где

  • node - узел, который будет клонирован;
  • dubNode - новый узел, который будет клоном node;
  • deep (необязательный) - true, если должны быть клонированы все дочерние узлы (включая текстовые узлы),  или false - будет клонирован только узел node.

Особенности метода cloneNode():

  1. Клонирование узлов копирует все их атрибуты и их значения, в том числе собственных (в линию) обработчиков.
  2. Клонирование узлов не копирует обработчики событий, добавленные с использованием addEventListener() или те, что назначены через свойства элемента (т.е. так: node.onclick = fn).
  3. Дубликат узла, возвращённого cloneNode():
    • не является частью документа, пока не будет добавлен в другой узел, который является частью документа, с использованием Node.appendChild() или другого метода;
    • не имеет родителя, пока не будет добавлен к другому узлу.
  4. Для пустых узлов (т.е., например, <img> или <input> элементов) не имеет значения установлен ли deep как true или false.
  5. cloneNode() может привести к дублированию идентификаторов элементов в документе. Если исходный узел имеет идентификатор и клон размещён в том же документе, идентификатор должен быть изменён, для того чтобы быть уникальным. Имя атрибута также может нуждаться в изменении, в зависимости от будущего имени дубликата.

Копии, сделанные с помощью cloneNode() , не будут автоматически синхронизироваться.

Чтобы клонировать узел для добавления к другому документу вместо Node.cloneNode() используйте Document.importNode().

Пример:

[свернуть]

Нахождение заданного узла

Метод hasChildNodes (проверка наличия дочерних узлов)

Метод node.hasChildNodes() возвращает Boolean значение, показывающее имеет ли текущий узел node дочерние узлы или нет.

Синтаксис:

[свернуть]
Свойство Node.nodeName (имя текущего узла)

Свойство только для чтения Node.nodeName возвращает имя текущего узла в виде строки.

Возвращаемое значение для различных типов узлов

Синтаксис:

где nodeName - это имя текущего узла node.

Пример:

В XHTML (или любых других форматов XML), значение text_field будет прочитано как div (в нижнем регистре). Свойства nodeName и tagName возвращают имена элементов HTML в DOM, помеченном как HTML документ, в верхнем регистре (подробнее...).

Свойство tagName можно было бы использовать вместо nodeName, однако для текстового узла:

  • nodeName возвращает #text ,
  • tagName возвращает undefined.

[свернуть]
Свойство parentNode (родительский узел элемента DOM)

Свойство parentNode возвращает:

  • родителя определённого элемента DOM дерева;
  • null - если узел не имеет родителя;
  • null  - если элемент только был создан и ещё не добавлен в DOM-дерево.

Синтаксис:

где

  • parentNode - ссылка на родительский узел текущего элемента (родитель элемента имеет тип Element, Document или DocumentFragment).

Пример:

[свернуть]
Свойство childNodes (коллекция (NodeList) дочерних элементов узла)

Доступный для чтения атрибут Node.childNodes возвращает живую (динамическую) коллекцию (NodeList) дочерних узлов (не потомков!) узла Node, включая элементы, текст и комментарии.

Синтаксис:

где node.childNodes - упорядоченная коллекция объектов элементов (тип этого списка - NodeList), которые являются дочерними для элемента node. Если у элемента node нет дочерних, то node.childNodes пуст.

Несмотря на то, что NodeList не является массивом (Array), его можно перебрать при помощи метода forEach(). NodeList также можно конвертировать в Array при помощи метода Array.from().

Пример ниже последовательно выведет дочерних элементов document.body:

Если запустить пример выше, то последним будет выведен элемент <script>, несмотря на то, что в документе есть ещё «...HTML-код 2...». На момент выполнения скрипта браузер ещё до элемента «...HTML-код 2...» не дошёл, поэтому скрипт его не выведет.

[свернуть]
Свойство Element.children (коллекция (HTMLCollection) дочерних элементов узла)

Свойство Element.children, доступное только для чтения, возвращает живую (динамическую) коллекцию (HTMLCollection), которая содержит все дочерние элементы узла Element.

Если элемент не имеет дочерних элементов, дочерние элементы представляют собой пустой список длиной 0.

Element.children включает только узлы элементов. Чтобы получить все дочерние узлы, включая узлы, не являющиеся элементами, например узлы текста и комментариев, используйте Node.childNodes.

Синтаксис:

где

  • collection - упорядоченная коллекция (HTMLCollection) элементов DOM, которые являются дочерними элементами узла node.

Вы можете получить доступ к отдельным дочерним узлам в коллекции, используя метод item() в коллекции или используя скобочную нотацию в стиле массива JavaScript:

[свернуть]

Подробнее о селекторах читайте CSS-селекторы

Метод querySelector( ) (нахождение первого заданного узла)

 Метод Document.querySelector() возвращает:

  • первый элемент (Element) документа, который соответствует указанному в аргументе селектору или группе селекторов;
  • null - если совпадений не найдено.

Сопоставление аргумента с узлами DOM выполняется с использованием последовательного обхода всех узлов документа в глубину, начиная с первого элемента в разметке документа.

Синтаксис:

где

  • element - ссылка на объект типа Element, являющийся первым элементом DOM, который соответствует указанному в аргументе селектору (группе селекторов) selectors;
  • selectors - строка DOMString, содержащая один или более селекторов для сопоставления (если не является допустимой строкой селектора CSS, то генерируется исключение SYNTAX_ERR). 

Пример:

Ещё пример:

Если вам нужен список всех элементов, соответствующих указанным селекторам, используйте метод querySelectorAll():

Пример

[свернуть]

Символы, которые не являются частью стандартного синтаксиса CSS должны быть экранированы символом обратной косой черты. Поскольку JavaScript также использует экранирование символом обратной косой черты, будьте особенно внимательны при написании строковых литералов с использованием этих символов (подробнее...).

Псевдо-элементы CSS никогда не вернут никаких элементов, как указано в API селекторов.

[свернуть]
Метод querySelectorAll( ) (нахождение всех узлов, соответствующих критерию)

Метод Document.querySelectorAll() возвращает статическую (неживую) коллекцию (NodeList), содержащую все найденные элементы документа, которые соответствуют указанному в аргументе метода селектору.

Синтаксис:

где

  • elementList - статический (non-live) NodeList, содержащий все элементы в пределах документа, которые соответствуют как минимум одному из указанных селекторов selectors, или пустой NodeList в случае отсутствия совпадений указанному в аргументе селектору (группе селекторов) selectors;
  • selectors - строка DOMString, содержащая один или более селекторов для сопоставления (если не является допустимой строкой селектора CSS, то генерируется исключение SYNTAX_ERR); несколько селекторов разделяются запятыми.

Символы, которые не являются частью стандартного синтаксиса CSS должны быть экранированы символом обратной косой черты. Поскольку JavaScript также использует экранирование символом обратной косой черты, будьте особенно внимательны при написании строковых литералов с использованием этих символов (подробнее...).

Если в строке selectors содержатся CSS псевдоэлементы, то возвращаемый список будет всегда пуст.

Пример:

[свернуть]
Метод Element.closest() (ближайший родительский элемент или сам элемент)

Метод Element.closest() возвращает:

  • соответствующий заданному в параметре CSS-селектору:
    1. сам элемент DOM или
    2. ближайший родительский элемент;
  • null, если таковых элементов вообще нет.

Синтаксис:

let elt = element.closest(selector);

где

  • selector - строка DOMString, содержащая CSS-селектор (например, "#id", ".class", "div");
  • elt - элемент DOM (Element), либо null.

Примеры:

[свернуть]
Метод Elеment.mаtches() (соoтветствие элемента указанному СSS-селектору)

Метод Element.matches() возвращает:

  • true, если элемент соответствует указанному в параметре метода CSS-селектору;
  • false, если элемент не соответствует указанному в параметре метода CSS-селектору;.

В некоторых браузерах метод имеет нестандартное название - matchesSelector().

Синтаксис:

let elt= element.matches(selector);

где

  • selector - строка DOMString, содержащая CSS-селектор (например, "#id", ".class", "div");
  • elt - элемент DOM (Element), либо null.

Пример:

Или тот же результат с помощью метода forEach():

[свернуть]
Метод Node.contains() (проверка отношения узлов "родительский - дочерний")

Метод Node.contains() возвращает Boolean значение, указывающее является ли узел, переданный в параметр метода, потомком узла Node, на котором этот метод вызывается.

Синтаксис:

node.contains(otherNode);

где

  • node - узел, который проверяется на качество "родительский" по отношению к otherNode;
  • otherNode - узел, который проверяется на качество "дочерний" по отношению к node.

Пример функции, которая проверяет, находится ли элемент в теле страницы:

[свернуть]

Сравнительная таблица методов поиска элементов:

Метод Критерий поиска Поиск внутри элемента Возвращение "живой" коллекции
querySelector CSS-selector  да нет (возвращает первое совпадение)
querySelectorAll CSS-selector  да нет (NodeList)
getElementById id нет нет
getElementsByName name нет да
getElementsByTagName тэг или '*' да да
getElementsByClassName class  да  да

Работа только с узлами-элементами

Учитывают только узлы-элементы:

  • children – коллекция (HTMLCollection) элементов DOM, которые являются дочерними элементами узла;
  • firstElementChild, lastElementChild – первый и последний дочерний элемент;
  • previousElementSibling, nextElementSibling – соседи-элементы;
  • parentElement – родитель-элемент.
Исключение document.documentElement.parentElement

Причина в том, что родителем корневого узла document.documentElement (<html>) является document. Но document – это не узел-элемент, так что parentNode его вернёт, а parentElement - нет.

[свернуть]

Добавление и замена узлов и элементов в DOM

Метод Node.appendChild() (устар.)

Метод Node.appendChild()

Метод Node.appendChild() добавляет узел в конец списка дочерних элементов указанного родительского узла.

Если узел является элементом, целесообразнее использовать методы Element.append() и Element.prepend(), которые, в отличие от Node.appendChild(), поддерживают несколько аргументов и добавление строк. 

Синтаксис:

где

  • node - родительский элемент node, в который вставляется child;
  • child - элемент, который вставляется в конец node.

Возвращаемое значение:

  • дочерний элемент (aChild);
  • если child - это DocumentFragment, то возвращается пустой DocumentFragment.

Особенности appendChild():

  1. Если дочерний элемент child является ссылкой на существующий узел в документе, то функция appendChild() перемещает его из текущей позиции в новую позицию (нет необходимости удалять узел из родительского узла перед добавлением его к какому-либо другому узлу). Поэтому, если у узла уже есть родитель, он сначала удаляется, а затем добавляется в новую позицию.
  2. Если дочерний элемент child является DocumentFragment, то все содержимое DocumentFragment перемещается в дочерний список указанного родительского узла.

Цепочка методов с appendChild() может работать не так, как ожидалось:

[свернуть]
Методы Element.append() и Element.prepend()

Метод Element.append() вставляет узлы после последнего дочернего элемента узла (Element.prepend() - перед первым дочерним элементом узла), заменяя строки в узлах эквивалентными текстовыми узлами (т.е. обеспечивают безопасную вставку HTML).

Отличия Element.append() и Element.prepend() от метода Node.appendChild():

  1. позволяют вставлять строки с текстом, в то время как Node.appendChild() работает только с узлами;
  2. ничего не возвращают, в то время как Node.appendChild() возвращает вставленный узел;
  3. позволяют вставить сразу несколько узлов или строк текста, в то время как Node.appendChild() умеет вставлять по одной сущности за раз.

Синтаксис:

где

  • nodesOrDOMStrings - один или несколько узлов или строк с текстом, которые необходимо вставить.

Пример:

Цепочка методов с Element.append()  или Element.prepend() может работать не так, как ожидалось.

[свернуть]
Методы Node.before() и Node.after()

Метод Node.before() вставляет узлы, переданные в аргумент, непосредственно перед узлом Node (Node.after() - после узла Node), заменяя строки в узлах эквивалентными текстовыми узлами.

Синтаксис:

где

  • nodesOrDOMStrings - один или несколько узлов или строк с текстом, которые необходимо вставить.

Методы Node.before() и Node.after() ничего не возвращают.

Цепочка методов с Node.before() и Node.after() может работать не так, как ожидалось (т.к. методы ничего не возвращают):

[свернуть]
Метод Node.replaceWith()

Метод node.replaceWith() – заменяет узел node узлами, переданными в аргументы, при этом строки в узлах заменяются эквивалентными узлами текста.

Синтаксис:

где

  • nodesOrDOMStrings - один или несколько узлов или строк с текстом, которые заменяют узел node.

Пример:

Метод node.replaceWith() ничего не возвращает.

[свернуть]
Добавление в DOM списка узлов (нескольких узлов)

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

  • node.append(...nodes or strings) – добавляет узлы или строки в конец node;
  • node.prepend(...nodes or strings) – вставляет узлы или строки в начало node;
  • node.before(...nodes or strings) – вставляет узлы или строки до node;
  • node.after(...nodes or strings) – вставляет узлы или строки после node.

Добавление в DOM списка узлов:

[свернуть]
Добавление в DOM списка узлов с помощью DocumentFragment

DocumentFragment является специальным DOM-узлом, который служит объектом-обёрткой для передачи списка узлов и, при этом, не является частью основного дерева DOM. Это позволяет добавить в него другие узлы, а затем вставить его содержимое в основное дерево DOM.

DocumentFragment — это контейнер, который может содержать произвольное количество элементов DOM.

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

В основное дерево объект-обёртка (DocumentFragment) не добавляется, а заменяется внутренним содержимым (собственными дочерними элементами).

Использование DocumentFragment может снижать производительность, поэтому перед тем как решать, использовать ли DocumentFragment, необходим профайлинг.

Создание нового пустого DocumentFragment:

где

  • myFragment - ссылка на пустой объект DocumentFragment.

Добавление в DOM списка узлов с помощью DocumentFragment:

Существует одно место, где можно встретить DocumentFragment, не создавая его через JS. Это — свойство content элемента <template>.

HTML-элемент шаблона контента <template> — это механизм для отложенного создания клиентского контента, который не отображается во время загрузки страницы, но может быть инициализирован при помощи JavaScript. Его можно представить себе как фрагмент контента страницы, сохранённый для последующего использования в документе. Парсер хотя и обрабатывает содержимое элемента <template> во время загрузки страницы, он делает это, только чтобы убедиться в валидности содержимого, само содержимое при этом не отображается (то, что находится внутри этого тега, не становится частью активного DOM-дерева, в частности, его нельзя найти с помощью querySelector()).

Элементы, созданные из HTML-кода, находящегося внутри тега <template>, не становятся ему дочерними. Вместо этого JavaScript может получить к ним доступ через свойство content, которое является DocumentFragment.

Пример

[свернуть]

[свернуть]

Добавление элементам классов, атрибутов и CSS-стилей (их удаление и проверка наличия)

Добавление классов

Class или style

Как правило, существует два способа задания стилей для элемента:

  1. cоздать класс в CSS как <div class="..."> и использовать его;
  2. определять стили непосредственно в атрибуте style как <div style="...">.

JavaScript может менять и классы, и свойство style, однако определение и изменение классов – предпочтительный вариант по сравнению с изменением style.

Использование style является приемлемым, если мы вычисляем координаты элемента и хотим установить их из JavaScript, например:

В остальных случаях целесообразно описывать в CSS и добавлять в класс - это более гибкое и лёгкое в поддержке решение.

[свернуть]

Добавление классов 

Классы (class) применяют тогда, когда необходимо определить стиль для индивидуального элемента веб-страницы или задать разные стили для одного тега. При использовании совместно с тегами синтаксис для классов будет следующий:

где

  • tag -  тег, к которому применяется class;
  • className - пользовательское имя класса class (имена классов должны начинаться с латинского символа и могут содержать в себе символ дефиса (-) и подчеркивания (_), использование кириллицы в именах классов недопустимо).

Чтобы указать в коде HTML, что тег используется с определённым классом, к тегу добавляется атрибут class="className":

Добавление одного класса с помощью свойства className:

Присваивание какого-либо значения свойству className элемента полностью заменяет всю строку классов:

Добавление (удаление) выбранного класса из нескольких с помощью объекта (псевдомассива)  classList:

Методы объекта classList:

  • elem.classList.add("class") – добавить класс;
  • elem.classList.remove("class") – удалить класс;
  • elem.classList.toggle("class") – добавить класс, если его нет, иначе - удалить;
  • elem.classList.contains("class") – проверка наличия класса (возвращает true/false).

Объект classList является перебираемым, поэтому можно перечислить все классы элемента при помощи цикла for..of.

[свернуть]
Добавление и удаление атрибутов

В CSS селекторы атрибутов позволяют установить стиль для конкретных элементов DOM по присутствию определённого атрибута тега или его значения.

У каждого элемента есть некоторый набор стандартных атрибутов (свойств), описанных в стандарте HTML именно для этого элемента (тега), например для <a> это будут href, name, а для <img> это будут src, alt, и т.д. Итак:

  • атрибуты – это код (строки) HTML;
  • свойство – это поле DOM-объекта.

Для нестандартных атрибутов DOM свойство узла как объекта DOM не создаётся.

Пример

[свернуть]

Доступ к атрибутам осуществляется при помощи методов:

  1. работающих со значением, которое находится в HTML:
    • elem.hasAttribute(nameAttr) – проверяет наличие атрибута;
    • elem.getAttribute(nameAttr) – получает значение атрибута;
    • elem.setAttribute(nameAttr, value) – устанавливает атрибут;
    • elem.removeAttribute(nameAttr) – удаляет атрибут;
  2. свойства elem.attributes, которое содержит объект NamedNodeMap{}.

В отличие от свойств, атрибуты:

  1. всегда являются строками;
  2. их имя нечувствительно к регистру (это HTML);
  3. видны в innerHTML.
Пример

[свернуть]

Методы getAttibute(), setAttribute() и removeAttribute() сразу же меняют HTML-атрибуты элемента (в отличие от DOM-свойств), что вызовет браузерную перерисовку (вы сможете увидеть все изменения, изучив элемент с помощью инструментов разработчика в браузере). Такие перерисовки не только требуют больше ресурсов, чем установка DOM-свойств, но и могут привести к непредвиденным ошибкам. Как правило, их используют для элементов, у которых нет соответствующих DOM-свойств, например, colspan, или для HTML-свойств при наследовании.

[свернуть]
Добавление (удаление) CSS-стилей

Свойство элемента element.style – это объект, поля которого соответствуют тому, что написано в атрибуте style, например:

Для обращения к свойству из нескольких слов используется camelCase, например:

  • font-size => elem.style.fontSize;
  • background-color => elem.style.backgroundColor;
  • border-left-width => elem.style.borderLeftWidth.

Стили с браузерным префиксом, например, -moz-border-radius, -webkit-border-radius преобразуются по тому же принципу, при этом дефис обозначается через заглавную букву, например:

  • button.style.MozBorderRadius = '5px';
  • button.style.WebkitBorderRadius = '5px'.

Сброс стилей:

  •  element.style = "none" или
  • element.style = "".

Если установить в element.style пустую строку "", то браузер применит CSS-классы и встроенные стили, как если бы свойства element.style вообще не было.

Установка нескольких стилей в одной строке (свойство style.cssText и метод setAttribute() ):

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

То же самое можно сделать установкой атрибута методом setAttribute():

[свернуть]

Навигация по узлам внутри родительского узла

Свойства firstChild и lastChild (первый и последний потомок узла)

Свойство только для чтения Node.firstChild возвращает:

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

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

Синтаксис:

где childNode - это ссылка на первый потомок узла node, если таковой имеется, в противном случае - null.

Примеры (обратите внимание на обработку пробелов как текстовых узлов):

Любое пустое пространство  между узлами (в т.ч. единичный пробел, разрыв строки, отступ и т. д.) является причиной вставки узла #text.

Если эти пробелы удаляются из источника, узлы #text не вставляются и элемент span становится первым потомком абзаца <p id="myNode">.

Свойства nodeName и tagName возвращают имена элементов HTML в DOM, помеченном как HTML документ, в верхнем регистре (подробнее...).

Свойство lastChild возвращает последнего потомка в узле.

Возвращаемый элемент last_child является последним потомком узла node. Если в опрашиваемом узле node нет дочерних элементов, node.lastChild  возвращает null .

Если у тега есть дочерние узлы, условие ниже всегда верно:

[свернуть]
Свойства nextSibling и previousSibling (следующий и предыдущий узел)

Свойство Node.nextSibling используется только для чтения и возвращает:

  • узел, непосредственно следующий за данным узлом в списке childNodes его родительского элемента, или
  • null, если данный узел последний в этом списке.

Свойство Node.previousSibling используется только для чтения и возвращает:

  • узел, предшествующий указанному в родительском элементе childNodes, или
  • null, если указанный узел первый в своём родителе.

Синтаксис:

Браузеры, основанные на Gecko, вставляют текстовые узлы в документ для представления пробелов в разметке. Поэтому узел, полученный, например, при использовании Node.firstChild или Node.previousSibling может относиться к пробелу, а не к тому элементу, который вы хотели бы получить.

[свернуть]

Работа с HTML или XML разметкой элементов DOM

Свойство Element.innerHTML (получение или установка HTML или XML разметки элемента)

Свойство Element.innerHTML получает или задает разметку HTML или XML, содержащуюся в элементе Element.

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

При вставке данных, предоставленных пользователем, всегда используйте:

  • вместо Element.innerHTML метод Element.SetHTML() (экспериментальный метод), чтобы дезинфицировать контент перед его вставкой в DOM;
  • Node.textContent при вставке простого текста, поскольку он вставляет его как необработанный текст, а не анализирует его как HTML.

Чтобы вставить HTML в документ, а не заменять содержимое элемента, используйте метод insertAdjacentHTML().

Предупреждение (https://developer.mozilla.org): если ваш проект будет проходить проверку безопасности в любой форме, использование innerHTML, скорее всего, приведет к отклонению вашего кода. Например, если вы используете innerHTML в расширении браузера и отправляете расширение на addons.mozilla.org, оно может быть отклонено в процессе проверки.

Синтаксис:

где

oldContent - строка DOMString, содержащая HTML-сериализацию потомков элемента.

Установка значения innerHTML удаляет обработчики событий и все потомки элемента и заменяет их узлами, созданными путем синтаксического анализа HTML, указанного в строке newContent.

Если была сделана попытка установить значение innerHTML с помощью строки, которая не является правильно сформированным HTML, то вызывается исключение SyntaxError DOMException

Свойство innerHTML можно использовать для проверки текущего источника HTML страницы, включая любые изменения, которые были внесены с момента первоначальной загрузки страницы. Чтение innerHTML заставляет пользовательский агент сериализовать HTML или XML-фрагмент, состоящий из потомков элемента, что позволяет вам просматривать HTML-разметку узлов содержимого элемента.

Возвращенный фрагмент HTML или XML создается на основе содержимого элемента в текущий момент времени, поэтому разметка и форматирование возвращенного фрагмента, скорее всего, не будут соответствовать разметке исходной страницы.

В следующем примере из documentElement извлекается текущая разметка HTML документа, символы «<» заменяются на сущность HTML «& lt;» , тем самым, по существу, преобразуя HTML в необработанный текст, который затем снова помещается в documentElement. В результате содержимое документа заменяется отображением всего исходного кода страницы:

[свернуть]
Метод Element.insertAdjacentHTML() (вставка HTML или XML в указанную позицию DOM)

Метод insertAdjacentHTML() разбирает указанный текст как HTML или XML и вставляет полученные узлы (nodes) в DOM дерево в указанную позицию (т.е. не обеспечивает безопасную вставку HTML).

Метод insertAdjacentHTML() не переписывает имеющиеся элементы (что предотвращает дополнительную сериализацию) и поэтому работает быстрее, чем innerHTML.

Синтаксис:

где

  • position  - определяет позицию добавляемого элемента относительно элемента, вызвавшего метод, и должно соответствовать одному из следующих значений (чувствительно к регистру):
    1. 'beforebegin': до самого element (до открывающего тега);
    2. 'afterbegin': сразу после открывающего тега element (перед первым потомком);
    3. 'beforeend': сразу перед закрывающим тегом element (после последнего потомка);
    4. 'afterend': после element (после закрывающего тега).
  • text - строка, которая будет проанализирована как HTML или XML и вставлена в DOM дерево документа.

Позиции 'beforebegin' и 'afterend' работают только если узел имеет родительский элемент. 

Пример:

ВАЖНО! Будьте осторожны при использовании вставки HTML на страницу с помощью insertAdjacentHTML(), не используйте пользовательский ввод, который не был проверен на вредоносное содержимое. Не рекомендуется использовать insertAdjacentHTML(), когда требуется ввести простой текст: используйте для этого свойство Node.textContent или метод Element.insertAdjacentText(), которые не будут интерпретировать текст как HTML, а вставят необработанный текст.

[свернуть]
Метод insertAdjacentElement() (добавление элемента в DOM-дерево)

Метод insertAdjacentElement() добавляет переданный элемент в DOM-дерево относительно элемента, вызвавшего метод. Используется для вставки элемента, который уже находится в DOM (например, вы можете получить этот элемент с помощью getElementById()). Если элемент в DOM отсутствует, то его необходимо сначала создать, например, с помощью метода createElement().

Синтаксис:

где 

  • position  - определяет позицию добавляемого элемента относительно элемента, вызвавшего метод, и должно соответствовать одному из следующих значений (чувствительно к регистру):
    1. 'beforebegin': до самого element (до открывающего тега);
    2. 'afterbegin': сразу после открывающего тега element (перед первым потомком);
    3. 'beforeend': сразу перед закрывающим тегом element (после последнего потомка);
    4. 'afterend': после element (после закрывающего тега).
  • element - элемент, добавляемый в DOM-дерево.

Метод возвращает добавляемый элемент, либо null, если добавление элемента завершилось ошибкой.

Пример:

Приведенный выше код добавит элемент <b></b> перед закрывающим тегом </div>.

[свернуть]

Удаление узлов или элементов DOM

Очистка всего содержимого страницы (с помощью innerHTML)

[свернуть]
Методы removeChild и remove() (удаление элемента DOM)

Метод removeChild() удаляет дочерний элемент, переданный в аргумент метода, из DOM и возвращает удалённый элемент.

Синтаксис:

где 

  • child - дочерний элемент который будет удалён из DOM;
  • node - родительский узел удаляемого child;
  • oldChild - переменная, в которую передана ссылка на удаляемый дочерний элемент (oldChild === child).

Удалённый дочерний элемент остаётся в памяти, но больше не является частью DOM. Вы можете повторно использовать удалённый элемент с помощью ссылки.

Метод генерирует исключение в случае:

  1. если child не является дочерним элементом node;
  2. если child являлся дочерним элементом node во время вызова метода, но был удалён во время вызова обработчика событий удаляющего элемент (т.e при удалении элемента непосредственно перед вызовом обработчика событий).

Метод Element.remove() удаляет элемент Element из DOM-дерева, в котором он находится.

Примеры удаления всех потомков в узле:

Удаление элемента с известным родительским узлом:

Удаление элемента без указания его родителя:

Удаление всех дочерних элементов выбранного узла:

Удаление элемента коллекции NodeList с заданным номером:

[свернуть]
Очистка HTML от заданных тегов

[свернуть]

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.