Методы Document.createElement() и Document.createTextNode() создают новые узлы типа Element и Text, а методы Node.appendChild(), Node.insertBefore() и Node.replace_ Child() могут использоваться для добавления этих узлов в документ. С помощью указанных методов можно построить DOM_дерево с произвольным содержимым.
В расширенном примере 15.9 определяется функция log() для записи в журнал сообщения и объекта. Кроме того, определяется вспомогательная функция log.debug(), которая представляет собой удобную альтернативу вызовам alert(), используемым при отладке сценариев. В качестве «сообщения» функции log() может передаваться как обычная текстовая строка, так и JavaScript_объект.
В первом случае строка просто отображается «как есть», во втором случае, когда в журнал записывается объект, он выводится в виде таблицы с именами свойств объекта и их значениями. В любом из этих двух случаев новое содержимое соз_ дается с помощью функций createElement() и createTextNode().
При использовании соответствующих таблиц CSS_стилей (которые включены в пример) вывод функции log() соответствует показанному на рис. 15.4.
344 Глава 15. Работа с документами
Рис. 15.4. Результат исполнения функции log()
Хотя пример 15.9 очень большой, он хорошо прокомментирован и заслуживает внимательного изучения. Обратите особое внимание на вызовы методов create_ Element(), createTextNode() и appendChild(). Порядок использования этих методов для создания относительно сложной HTML_таблицы демонстрируется в частной функции log.makeTable().
Пример 15.9. Средства протоколирования в клиентском JavaScript'коде
/*
* Log.js: Cредства ненавязчивого протоколирования
*
* Данный модуль определяет единственный глобальный символ – функцию log().
* Протоколирование сообщений производится вызовом этой функции
* с двумя или тремя аргументами:
*
* category: тип сообщения. Это необходимо, чтобы можно было разрешать или
* запрещать вывод сообщений различных типов, а также для того, чтобы иметь
* возможность оформлять их разными стилями независимо друг от друга.
* Подробности далее.
*
* message: текст сообщения. Может быть пустой строкой, если функции передается объект
*
* object: записываемый в журнал объект. Это необязательный аргумент.
* Если он определен, свойства объекта выводятся в форме таблицы.
* Любое свойство, значением которого является объект, протоколируется рекурсивно.
*
* Вспомогательные функции:
15.8. Добавление содержимого в документ
*
* Функции log.debug() и log.warn() – это сервисные функции, которые просто
* вызывают функцию log() с жестко предопределенными типами "debug"
* и "warning". Довольно просто можно определить функцию, которая подменит
* метод alert() и будет вызывать функцию log().
*
* Включение режима протоколирования
*
* Протоколируемые сообщения по умолчанию *не* отображаются. Разрешить
* отображение сообщений того или иного типа можно одним из двух способов.
* Первый – создать элемент <div> или другой контейнерный элемент
* со значением атрибута id равным "<category>_log". Для вывода сообщений
* c категорией "debug" можно вставить в документ следующую строку:
*
* <div id="debug_log"></div>
*
* В этом случае все сообщения данного типа будут добавляться в элемент_
* контейнер, для которого могут быть определены свои стили отображения.
*
* Второй способ активировать вывод сообщений определенной категории _
* установить значение соответствующего свойства. Например, чтобы разрешить
* вывод сообщений категории "debug", следует установить свойство
* log.options.debugEnabled = true. После этого создается элемент
* <div class="log">, куда и будут добавляться сообщения.
* Чтобы запретить отображение протоколируемых сообщений даже
* при наличии контейнерного элемента с соответствующим значением
* атрибута id следует установить значение свойства:
* log.options.debugDisabled=true. Чтобы опять разрешить вывод
* сообщений в свойство, соответствующее заданной категории,
* следует записать значение false.
*
* Оформление сообщений
*
* В дополнение к возможности оформления самого контейнера для сообщений
* можно использовать CSS_стили, чтобы оформлять вывод отдельных
* сообщений. Каждое сообщение помещается в тег <div> с CSS_классом
* <category>_message. Например, сообщения из категории "debug" будут
* иметь класс "debug_message"
*
* Свойства объекта Log
*
* Порядок протоколирования можно изменять установкой свойств
* объекта log.options, как, например, те, которые были описаны ранее
* и использовались для разрешения/запрета вывода сообщений отдельных
* категорий. Далее приводится перечень доступных свойств:
*
* log.options.timestamp: Если в это свойство записано значение true,
* к каждому сообщению будут добавлены дата и время.
Показанные на рис. 15.4 отладочные сообщения были оформлены средствами CSS_стилей, импортированных в документ с помощью тега <link>. При создании рисунка использовались следующие стили:
#debug_log { /* Стили оформления контейнера с отладочными сообщениями */
background_color: #aaa;
/* серый фон */
border: solid black 2px; /* черная
рамка */
overflow: auto;
/* полосы
прокрутки */
width: 75%;
/*
ограничить
ширину элемента */
height: 300px;
/*
ограничить
размер по вертикали */
}
#debug_log:before { /* Заголовок области вывода сообщений */ content: "Отладочные сообщения ";
display: block; text_align: center;
font: bold 18pt sans_serif ;
}
.debug_message { /* Отделять сообщения тонкой горизонтальной линией */ border_bottom: solid black 1px;
}
15.8. Добавление содержимого в документ
Больше о CSS вы узнаете в главе 16. Сейчас не очень важно разбираться в этой теме во всех подробностях. В рассматриваемом примере вы можете видеть, как подключенные CSS_стили сказываются на содержимом документа, динамиче_ ски генерируемом функцией log().