0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>DOM-дерево может изменяться, когда браузер уже выполнил его рендеринг. Именно этот факт позволяет создавать интерактивные приложения.</p>
1
<p>DOM-дерево может изменяться, когда браузер уже выполнил его рендеринг. Именно этот факт позволяет создавать интерактивные приложения.</p>
2
<p>В этом уроке мы обсудим, как манипулировать DOM-деревьями и какие преимущества мы можем при этом получить.</p>
2
<p>В этом уроке мы обсудим, как манипулировать DOM-деревьями и какие преимущества мы можем при этом получить.</p>
3
<h2>innerHTML</h2>
3
<h2>innerHTML</h2>
4
<p>Самый простой способ обновить часть DOM - это свойство innerHTML:</p>
4
<p>Самый простой способ обновить часть DOM - это свойство innerHTML:</p>
5
<p>Значение этого свойства полностью заменяет потомков элемента, на котором мы его вызвали. Весь HTML, находящийся внутри, анализируется и становится частью дерева.</p>
5
<p>Значение этого свойства полностью заменяет потомков элемента, на котором мы его вызвали. Весь HTML, находящийся внутри, анализируется и становится частью дерева.</p>
6
<p>Представьте, что мы пытаемся вставить обычный текст, в котором потенциально содержится HTML. Это повышает вероятность XSS-атак, поэтому мы должны использовать другое свойство - textContent.</p>
6
<p>Представьте, что мы пытаемся вставить обычный текст, в котором потенциально содержится HTML. Это повышает вероятность XSS-атак, поэтому мы должны использовать другое свойство - textContent.</p>
7
<p>Свойство textContent работает практически идентично, оно также заменяет всех потомков. Основное различие между этими свойствами заключается в том, что textContent рассматривает содержимое как обычный текст в любом случае, даже если там есть HTML:</p>
7
<p>Свойство textContent работает практически идентично, оно также заменяет всех потомков. Основное различие между этими свойствами заключается в том, что textContent рассматривает содержимое как обычный текст в любом случае, даже если там есть HTML:</p>
8
<p>Свойство innerHTML работает со строками. Это удобно, только если мы работаем со статическим представлением DOM. Для динамического формирования хорошо подходят специальные функции.</p>
8
<p>Свойство innerHTML работает со строками. Это удобно, только если мы работаем со статическим представлением DOM. Для динамического формирования хорошо подходят специальные функции.</p>
9
<h2>Создание узлов</h2>
9
<h2>Создание узлов</h2>
10
<p>Код, создающий DOM динамически, похож на матрешку. После создания одни элементы все время вкладываются в другие. Так выглядит код, который конструирует деревья в любом языке.</p>
10
<p>Код, создающий DOM динамически, похож на матрешку. После создания одни элементы все время вкладываются в другие. Так выглядит код, который конструирует деревья в любом языке.</p>
11
<h2>Вставка</h2>
11
<h2>Вставка</h2>
12
<p><a>ParentNode.prepend()</a>добавляет переданный узел первым потомком в ParentNode:</p>
12
<p><a>ParentNode.prepend()</a>добавляет переданный узел первым потомком в ParentNode:</p>
13
<p><a>ParentNode.append()</a>добавляет переданный узел последним потомком в ParentNode:</p>
13
<p><a>ParentNode.append()</a>добавляет переданный узел последним потомком в ParentNode:</p>
14
<p><a>childNode.before(...nodes)</a>- вставляет nodes в список потомков родительского узла childNode прямо перед childNode:</p>
14
<p><a>childNode.before(...nodes)</a>- вставляет nodes в список потомков родительского узла childNode прямо перед childNode:</p>
15
<p><a>childNode.after(...nodes)</a>- вставляет nodes в список потомков родительского узла childNode сразу после childNode:</p>
15
<p><a>childNode.after(...nodes)</a>- вставляет nodes в список потомков родительского узла childNode сразу после childNode:</p>
16
<p><a>node.replaceWith(...nodes)</a>- вставляет nodes вместо node. Сама node пропадает из DOM-дерева, но остается доступной в коде:</p>
16
<p><a>node.replaceWith(...nodes)</a>- вставляет nodes вместо node. Сама node пропадает из DOM-дерева, но остается доступной в коде:</p>
17
<p><a>Element.remove()</a>удаляет текущий узел.</p>
17
<p><a>Element.remove()</a>удаляет текущий узел.</p>
18
<p>Создание элемента не добавляет сразу этот элемент на страницу. Например, document.createElement('div') просто создаст объект элемента div. При этом этот объект не будет частью DOM-дерева. Поэтому нужно вставить этот объект в дерево, если нужно добавить его на страницу.</p>
18
<p>Создание элемента не добавляет сразу этот элемент на страницу. Например, document.createElement('div') просто создаст объект элемента div. При этом этот объект не будет частью DOM-дерева. Поэтому нужно вставить этот объект в дерево, если нужно добавить его на страницу.</p>
19
<h2>Старый API</h2>
19
<h2>Старый API</h2>
20
<p>Описанные выше функции появились не так давно. Большая часть кода написана с использованием других функций, список которых ниже:</p>
20
<p>Описанные выше функции появились не так давно. Большая часть кода написана с использованием других функций, список которых ниже:</p>
21
<ul><li>parent.appendChild(el) - добавляет el в конец списка потомков</li>
21
<ul><li>parent.appendChild(el) - добавляет el в конец списка потомков</li>
22
<li>parent.insertBefore(el, nextElSibling) - добавляет el в список потомков parent перед nextElSibling</li>
22
<li>parent.insertBefore(el, nextElSibling) - добавляет el в список потомков parent перед nextElSibling</li>
23
<li>parent.removeChild(el) - удаляет el из потомков parent</li>
23
<li>parent.removeChild(el) - удаляет el из потомков parent</li>
24
<li>parent.replaceChild(newEl, el) - заменяет el на newEl</li>
24
<li>parent.replaceChild(newEl, el) - заменяет el на newEl</li>
25
</ul><h2>Клонирование</h2>
25
</ul><h2>Клонирование</h2>
26
<p>Иногда нам нужно создать элемент, похожий на существующий. Конечно, это можно сделать вручную, скопировав свойства одного элемента в свойства другого. Но есть и более простой способ:</p>
26
<p>Иногда нам нужно создать элемент, похожий на существующий. Конечно, это можно сделать вручную, скопировав свойства одного элемента в свойства другого. Но есть и более простой способ:</p>
27
<p>Значение true показывает, что мы создаем<strong>глубокую копию</strong>- то есть копию данного элемента со всеми его потомками.</p>
27
<p>Значение true показывает, что мы создаем<strong>глубокую копию</strong>- то есть копию данного элемента со всеми его потомками.</p>