15.5.3. Содержимое элемента в виде текстовых узлов

We use cookies. Read the Privacy and Cookie Policy

Еще одним средством доступа к содержимому элемента является список дочерних узлов, каждый из которых может иметь свое множество дочерних узлов. Когда речь заходит о содержимом элемента, наибольший интерес обычно представляют текстовые узлы. При работе с XML-документами необходимо также быть готовыми встретить узлы CDATASection - подтип класса Text - представляющие содержимое разделов CDATA.

Пример 15.3 демонстрирует функцию textContent(), которая выполняет рекурсивный обход дочерних элементов и объединяет текст, содержащийся во всех текстовых узлах-потомках. Чтобы было более понятно, напомню, что свойство nodeValue (определяемое типом Node) хранит содержимое текстового узла.

Пример 15.3. Поиск всех текстовых узлов, потомков указанного элемента

// Возвращает простое текстовое содержимое элемента е, выполняя рекурсивный

// обход всех дочерних элементов. Этот метод действует подобно свойству textContent

function textContent(e) {

  var child, type, s = // s хранит текст всех дочерних узлов

  fог(child = е.firstChild; child != null; child = child.nextSibling) {

    type = child.nodeType;

    if (type === 3 || type === 4) // Узлы типов Text и CDATASection

      s += child.nodeValue;

    else if (type === 1) // Рекурсивный обход узлов типа Element

      s += textContent(child);

  }

  return s;

}

Свойство nodeValue доступно для чтения и записи, и с его помощью можно изменять содержимое в отображаемых узлах Text и CDATASection. Оба типа, Text и CDATASection, являются подтипами класса CharacterData, описание которого приводится в четвертой части книги. Класс CharacterData определяет свойство data, которое хранит тот же текст, что и свойство nodeValue. Следующая функция преобразует символы текстового содержимого узлов типа Text в верхний регистр, устанавливая значение свойства data:

// Рекурсивно преобразует символы всех текстовых узлов-потомков

// элемента n в верхний регистр,

function upcase(n) {

  if (п.nodeType == 3 || n.nodeType == 4) // Если n - объект Text или CDATA

    n.data = n.data.toUpperCase(); // преобразовать в верхний регистр

  else // Иначе рекурсия по дочерним узлам

    for(var і = 0; і < n.childNodes.length; i++) upcase(n.childNodes[і]);

}

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