JavaScript. Подробное руководство, 6-е издание, стр. 211

<b>    for(var і = 0; і &lt; n.childNodes.length; i++) upcase(n.childNodes[і]);</b>

<b>}</b>

Класс

<b>CharacterData</b>
также определяет редко используемые методы добавления в конец, удаления, вставки и замены текста в узлах
<b>Text</b>
или
<b>CDATASection</b>
. Кроме изменения содержимого имеющихся текстовых узлов этот класс позволяет также вставлять в элементы
<b>Element</b>
новые текстовые узлы или замещать существующие текстовые узлы новыми. Создание, вставка и удаление узлов - тема следующего раздела.

15.6. Создание, вставка и удаление узлов

Мы уже знаем, как получать и изменять содержимое документа, используя строки с разметкой HTML и с простым текстом. Мы также знаем, как выполнять обход документа для исследования отдельных узлов

<b>Element</b>
и
<b>Text</b>
, составляющих его содержимое. Однако точно так же существует возможность изменения документа на уровне отдельных узлов. Тип
<b>Document</b>
определяет методы создания объектов
<b>Element</b>
и
<b>Text</b>
, а тип
<b>Node</b>
определяет методы для вставки, удаления и замены узлов в дереве. Приемы создания и вставки узлов уже были показаны в примере 13.4, который повторяется ниже:

<b>// Асинхронная загрузка сценария из указанного URL-адреса и его выполнение </b>

<b>function loadasync(url) {</b>

<b>  var head = document.getElementsByTagName(&quot;head&quot;)[0]; // Отыскать &lt;head&gt; </b>

<b>  var s = document.createElement(&quot;script&quot;); // Создать элемент &lt;script&gt;</b>

<b>  s.src = url;                              // Установить его атрибут src</b>

<b>  head.appendChild(s);                      // Вставить &lt;script&gt; в &lt;head&gt;</b>

<b>}</b>

В следующих подразделах более подробно и с примерами рассказывается о создании новых узлов, о вставке и удалении узлов, а также об использовании объектов DocumentFragment, упрощающих работу с множеством узлов.

15.6.1. Создание узлов

Как было показано в примере выше, создавать новые узлы

<b>Element</b>
можно с помощью метода
<b>createElement()</b>
объекта
<b>Document</b>
. Этому методу необходимо передать имя тега: это имя не чувствительно к регистру символов при работе с HTML-документами и чувствительно при работе с XML-документами.

Для создания текстовых узлов существует аналогичный метод:

<b>var newnode = document.сreateTextNode(&quot;содержимое текстового узла&quot;);</b>

Кроме того, объект

<b>Document</b>
определяет и другие фабричные методы, такие как редко используемый метод
<b>createComment().</b>
Один такой метод,
<b>createDocumentFragment(),</b>
мы будем использовать в разделе 15.6.4. При работе с документами, в которых используются пространства имен XML, можно использовать метод
<b>createElementNS(),</b>
позволяющий указывать URI-идентификатор пространства имен и имя тега создаваемого объекта
<b>Element</b>
.

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

<b>cloneNode(),</b>
возвращающий новую копию узла. Если передать ему аргумент со значением
<b>true</b>
, он рекурсивно создаст копии всех потомков, в противном случае будет создана лишь поверхностная копия. В броузерах, отличных от IE, объект
<b>Document</b>
дополнительно определяет похожий метод с именем
<b>importNode().</b>
Если передать ему узел из другого документа, он вернет копию, пригодную для вставки в текущий документ. Если передать ему значение true во втором аргументе, он рекурсивно импортирует все узлы-потомки.

15.6.2. Вставка узлов

После создания нового узла его можно вставить в документ с помощью методов типа

<b>Node</b>
:
<b>appendChild()</b>
или
<b>insertBefore().</b>
Метод
<b>appendChild()</b>
вызывается относительно узла
<b>Element</b>
, в который требуется вставить новый узел, и вставляет указанный узел так, что тот становится последним дочерним узлом (значением свойства
<b>lastChild</b>
).

Метод

<b>insertBefore()</b>
похож на метод
<b>appendChild(),</b>
но он принимает два аргумента. В первом аргументе указывается вставляемый узел, а во втором - узел, перед которым должен быть вставлен новый узел. Этот метод вызывается относительно объекта узла, который станет родителем нового узла, а во втором аргументе должен передаваться дочерний узел этого родителя. Если во втором аргументе передать null, метод
<b>insertBefore()</b>
будет вести себя, как
<b>appendChild(),</b>
и вставит узел в конец.

Ниже приводится простая функция вставки узла в позицию с указанным числовым индексом. Она демонстрирует применение обоих методов,

<b>appendChild()</b>
и
<b>insertBefore():</b>

<b>// Вставляет узел child в узел parent так, что он становится n-м дочерним узлом </b>

<b>function insertAt(parent, child, n) {</b>

<b>  if (n &lt; 0 || n &gt; parent.childNodes.length) throw new Error(&quot;недопустимый индекс&quot;); </b>

<b>  else </b>

<b>    if (n == parent.childNodes.length) parent.appendChild(child); </b>