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

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

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

Еще одним средством доступа к содержимому элемента является список дочерних узлов, каждый из которых может иметь свое множество дочерних узлов. Когда речь заходит о содержимом элемента, наибольший интерес обычно представляют текстовые узлы. При работе с 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 новые текстовые узлы или замещать существующие текстовые узлы новыми. Создание, вставка и удаление узлов - тема следующего раздела.

Оглавление книги


Генерация: 1.147. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз