использующие Dynamic HTML для создания
Разработчики, использующие Dynamic HTML для создания динамических HTML страниц, видимо, оценят новые возможности по управлению информацией, появившейся с включением в Internet Explorer 5 поддержки DOM Level1 и стилевых таблиц XSL.
HTML-документы давно уже стали привычным форматом для представления информации в Web. Но, к сожалению, их содержимое практически не описывается тэгами и единственное, что может делать с данными броузер, это форматировать их и выводить на экран. Передаваемая клиенту информация в виде HTML страницы доступна для пользователя лишь в том виде, в котором она была сформирована на стороне сервера и практически невозможно динамическое изменение данных в зависимости от текущих потребностей пользователя. Впервые попытка хранения информации независимо от форматирующих ее тэгов была сделана в спецификации Dynamic HTML для IE 4 - в объектную модель броузера были добавлены т.н. объекты источников данных (Data Source Object - DSO). Эти объекты позволяли динамически "назначать" информацию для тех или иных фрагментов HTML документа(например, таблицам), которую затем отображал броузер, и являлись, по сути, "островками данных" для моря остальных форматирующих тэгов документа. Следующим шагом в этом направлении стало появление нового тэга <xml> и включение в объектную модель Internet Explorer новых объектов доступа к XML-данным.
Говоря об объектной модели броузера необходимо уточнить, что в данном случае имеется в виду интерфейс доступа к содержимому документа для сценариев, а вовсе не часть программного обеспечения броузера. Некоторые интерфейсы доступны для других приложений и являются, по сути, COM-интерфейсами, некоторые могут использоваться только внутри. Для нас не важно, как представлены объекты в программной модели броузера - мы будем рассматривать объектную модель как набор объектов, их методов и событий, доступных для сценария внутри страницы.
Из внутренних сценариев HTML страницы обращение к методам объекта данных выглядит также, как и для любого другого элемента документа - при помощи его идентификатора или по индексу в коллекции классов страницы. Вот например, как можно это сделать через JScript (версия JavaScript от Microsoft):
<xml ID="xmlNotes" src="notes.xml"></xml> <script language=JAVASCRIPT> var node_value = xmlNotes.document.all("xmlNotes").XMLDocument.nodeValue; var document_text = xmlNotes.documentElement.text; </script>
При этом ссылка на элемент данных HTML страницы в сценарии автоматически предоставляет нам доступ к объектной модели XML документа, создаваемой обработчиком в памяти компьютера сразу после загрузки документа.
В настоящий момент поддержка XML в IE5 реализована, практически, в на трех вариантах. Во-первых, это возможность загрузки XML документа, так же, как загружается обычная HTML страница. Он будет нормально обработан броузером и отображен в виде дерева содержащихся в нем элементов.
Во-вторых, XML документы можно форматировать при помощи стилевых таблиц XSL. Стилевые таблицы позволяют управлять процессом отображения элемента на экране броузера, меняя в зависимости от его типа и месторасположения в документе используемые для этого форматирующие тэги. Кроме того, стилевые таблицы могут использоваться также и для поиска нужных фрагментов внутри документа, выводя по желанию пользователя отдельные его части независимо от остального содержимого. XSL инструкции в Internet Explorer 5.0 позволяют "фильтровать" и обрабатывать сложные XML документы, со множеством рекурсивно вложенных, сложноподчиненных элементов с нефиксированным набором атрибутов и строгими требованиями к порядку их определения внутри документа.
В-третьих, доступ к XML-данным возможен из сценариев внутри страницы, имеющих доступ практически к любому элементу документа через соответствующие объекты. Использование Dynamic HTML представляет собой наиболее гибкий и мощный способ формирования динамически изменяемой информации на стороне клиента. Структурированные данные XML-документа могут загружаться в страницу при помощи тэгов
<xml>,
<object> или
<script>, в которых указывается либо адрес документа, либо непосредственно сами XML-элементы:
<xml ID="xmlNotes1" src="notes.xml"></xml> ... <xml ID="xmlNotes2"> <notepad> <note id="5"> <text>Очень важная информация</text> </note> </notepad> </xml> ... <script language="xml" ID="xmlNotes3"> <notepad id="6"> <note> <text>Очень важная информация</text> </note> </notepad> </script> ... <script language=JAVASCRIPT> var root_node = document.all.("SCRIPT").XMLDocument; </script>
Возможны комбинации всех этих подходов - загрузка и обработка XML документа в сценариях через методы объектов DOM; включение стилевых таблиц в страницу при помощи тэга <xml>, их модификация в соответствии с запросами пользователя, назначение XSL-стилей для XML-документов прямо из сценариев, включение фрагментов скриптов непосредственно в XML документы при помощи блока CDATA.
Internet Explorer DOM
В настоящий момент Microsoft Internet Explorer является первым броузером, поддерживающим спецификацию DOM Level 1. Для сценариев на стороне клиента доступно множество объектов для работы с XML-документом. Полное их описание является темой отдельной статьи, здесь же рассмотрим лишь самые важные из них, объекты
XMLDOMDocument,
XMLDOMNode,
XMLDOMNodeList, представляющие интерфейс для доступа ко всему документу, отдельным его узлам и поддеревьям соответственно. Также рассмотрим объект
XMLDOMParseError, предоставляющий необходимую для отладки информацию о произошедших ошибках анализатора (т.к. его методы, к сожалению, на первых шагах используются очень часто). Описание дается по материалам официального руководства, расположенного на сервере Microsoft: msdn.microsoft.com/xml/, и является упрощенным и сокращенным его вариантом, поэтому если приведенных в таблице сведений будет недостаточно, нужно обратиться к первоисточнику.
Объект XMLDOMNode |
Объект XMLDOMNode, реализующий базовый DOM интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле - его тип (является ли текущий узел элементом, комментарием, текстом и т.д.), название, полное название (вместе с Namespace префиксом), его содержимое, список дочерних элементов и т.д. |
Свойства |
|
Общая информация о текущем элементе дерева
|
nodeName
|
Возвращает полное название(вместе с Namaspace атрибутом) текущего узла в виде строки. Доступно только для чтения.
|
baseName
|
Возвращает название элемента без префикса Namespace. Только для чтения.
|
prefix
|
Возвращает Namespace префикс. Только для чтения.
|
namespaceURI
|
Возвращает URI Namespace префикса текущего элемента
|
dataType
|
Определяет тип содержимого текущего узла(описываемое схемами данных). Доступно для записи и чтения
|
nodeType
|
Возвращает тип текущего узла:
NODE_ELEMENT (1) - элемент
NODE_ATTRIBUTE (2) - атрибут
NODE_TEXT (3) - текст
NODE_CDATA_SECTION (4) - область CDATA
NODE_ENTITY_REFERENCE (5) - объект ссылки на "макроподстановки"
NODE_ENTITY (6) - объект ссылки на т.н. "подстановочые символы" - entity"
NODE_PROCESSING_INSTRUCTION (7) - область инструкций XML процессору
NODE_COMMENT (8) - комментарий
NODE_DOCUMENT (9) - корневой элемент документа
NODE_DOCUMENT_TYPE (10) - описание типа документа, задаваемое тэгом <!DOCTYPE>
NODE_DOCUMENT_FRAGMENT (11) - фрагмент XML-документа - несвязанное поддерево
NODE_NOTATION (12) - DTD нотация.
Свойство доступно только для чтения.
|
nodeTypeString
|
Возвращает тип узла в виде текста. Только для чтения.
|
attributes
|
Возвращает список атрибутов текущего узла в виде коллекции XMLDOMNamedNodeMap. Если атрибутов нет, то свойство length будет содержать нулевое значение. Для тех узлов, у которых не может быть атрибутов (в XML документе они могут быть назначены лишь объектам элементов, макроподстановок и нотаций) возвращается null. Для объектов макроподстановок и нотаций содержимым коллекции будут являться атрибуты SYSTEMID, PUBLICID и NDATA. Доступно только для чтения.
|
definition
|
Возвращает DTD определение для текущего узла дерева.
|
Содержимое текущего узла
|
text
|
Возвращает содержимое текущего поддерева(узла и всех его дочерних элементов). Доступно для записи и чтения
|
xml
|
Возвращает XML-представление текущего поддерева. Доступно только для чтения
|
nodeValue
|
Возвращает содержимое текущего узла. Доступно для чтения и записи.
|
Работа со списком дочерних элементов
|
childNodes
|
Для тех узлов, которые имеют дочерние элементы возвращает их список в виде XMLDOMNodeList. В том случае, если дочерних элементов нет, значение свойства length списка равно нулю . Только для чтения.
|
lastChild
|
Возвращает последний дочерний элемент или null, если таковых не имеется. Свойство доступно только для чтения.
|
firstChild
|
Возвращает последний дочерний элемент или null. Только для чтения.
|
nextSibling
|
Возвращает следующий дочерний элемент. Только для чтения.
|
previousSibling
|
Возвращает предыдущий дочерний элемент. Доступно только для чтения.
|
parentNode
|
Содержит ссылку на родительский элемент. В том случае, когда такого элемента нет, возвращает null. Доступно только для чтения.
|
ownerDocument
|
Возвращает указатель на документ, в котором находится текущий узел. Если в процессе модификации дерева узел будет перенесен в другой документ, то значение этого свойства автоматически изменится. Только для чтения.
Методы |
|
Добавление новых элементов в объектную модель документа
|
appendChild(newChild)
|
Добавляет текущему узлу новый дочерний элемент. Возвращает ссылку на объект этого нового элемента. То же самое можно сделать и при помощи insertBefore (newChild, null)
|
insertBefore(newChild, refChild)
|
Вставляет дочерний узел, располагая его в текущем поддереве "левее" узла, указанного параметром refChild. Если последний параметр не задан, то новый узел будет добавлен в конец списка.
|
Модификация и удаление узлов
|
cloneNode (deep)
|
Создание копии текущего элемента. Параметр deep определяет, будет ли эта процедура рекурсивно выполняться для всех дочерних элементов. Возвращаемое значение - ссылка на новый элемент
|
replaceChild(newChild, oldChild)
|
Замена объекта oldChild текущего списка дочерних объектов на newChild. Если newChild=null, то старый объект будет просто удален.
|
removeChild(oldChild)
|
Удаление объекта oldChild из списка дочерних элементов
|
Поиск узлов (выделение поддеревьев)
|
selectNodes(patternString)
|
Возвращает объект XMLDOMNodeList, содержащий поддерево, выбранное по шаблону поиска pattertnString
|
selectSingleNode(patternString)
|
Аналогичен методу selectNodes, только возвращает первый узел из найденного поддерева
|
Обработка поддеревьев стилевыми таблицами
|
transformNode(stylesheet)
|
Назначает стилевую таблицу для поддерева текущего узла и возвращает строку - результат обработки. В качестве параметра передается ссылка на объект DOMDocument, в котором находятся XSL инструкции.
|
transformNodeToObject(stylesheet, outputObject)
|
То же, что и transformNode, только результат - обработанное дерево передается в объект XMLDocument(другое дерево), задаваемый параметром outputObject
Объект XMLDOMDocument |
Представляет верхний уровень объектной иерархии и содержит методы для работы с документом: его загрузки, анализа, создания в нем элементов, атрибутов, комментариев и т.д. . Многие свойства и методы этого объекта реализованы также в рассмотренном выше класса Node, т.к. документ может быть рассмотрен как корневой узел с вложенными в него поддеревьями. |
Свойства |
|
Получение и информации о текущем состоянии процесса загрузки и анализа документа.
|
async
|
Свойство, доступное для записи и чтения, идентифицирующее текущий режим обработки (синхронный или асинхронный)
|
parseError
|
Возвращает ссылку на объект XMLDOMParseError, при помощи которого можно получить всю необходимую информацию о последней ошибке анализатора. Только для чтения.
|
readyState
|
Содержит информацию о текущем состоянии анализатора:
LOADING (1) - находится в процессе загрузки документа
LOADED (2) - загрузка завершена, но объектная модель документа еще не создана
INTERACTIVE (3) - объектная модель создана(все элементы документа разобраны, установлены их связи и атрибуты) но доступна пока только для чтения
COMPLETED (4) - с ошибками или без, но документ разобран
Для получения своевременной информации о текущем состоянии анализатора можно воспользоваться обработчиком событий
onreadystatechange
Только для чтения.
|
ondataavailable
|
Свойство, доступное только для записи, которое содержит ссылку на обработчик события ondataavailable (вызывается, когда обработчик обрабатывает очередную порцию данных документа)
|
onreadystatechange
|
Ссылка на обработчик события onreadystatechange (вызывается каждый раз, когда меняется состояние обработчика - свойство readyState)
|
ontransformnode
|
Ссылка на обработчик события ontransformnode (вызывается перед каждой трансформацией узла стилевыми таблицами)
|
Изменение параметров обработчика.
|
preserveWhiteSpace
|
Определяет, должны ли при разборе документа игнорироваться символы разделителей. Если значение свойства ложно, то будут, если истина - то разделители будут сохранены. По умолчанию установлено в false. Доступно для чтения и записи.
|
resolveExternals
|
Свойство определяет, будут ли в процессе анализа разбираться внешние определения (DTD-описания, макроподстановки и т.д.) - значение true или нет(false). Доступно для чтения и записи.
|
validateOnParse
|
Включение - выключение верификации документа. Значения true или false. Доступно для чтения и записи.
|
Получение информации о загруженном документе
|
doctype
|
Возвращает тип документа, определяемый при его создании тэгом <!DOCTYPE>, включающим DTD. Если в документе нет DTD описаний, возвращается null. Только для чтения.
|
url
|
Возвращает URL документа(в случае успешной его загрузки, в противном случае возвращает null). Доступно только для чтения.
|
implementation
|
Возвращет объект XMLDOMImplementation для данного документа. Только для чтения.
|
documentElement
|
Содержит ссылку на корневой элемент документа в виде объекта XMLDOMElement. Если корневого элемента нет, то возвращается null. Доступно для записи
Методы |
|
Загрузка и сохранение документов
|
load(url)
|
Загружает документ, адрес которого задан параметром url. В случае успеха возвращает логическое значение true. Необходимо иметь в виду, что вызов этого метода сразу же обнуляет содержимое текущего документа
|
loadXML(xmlString)
|
Загружает XML - фрагмент, определенный в передаваемой строке
|
save(objTarget)
|
Сохраняет документ в файле (objTarget - строка, содержащая URL файла) или внутри другого документа (objTarget - объект XMLDOMDoument).
|
abort()
|
Прерывание процесса загрузки и обработки документа. Обработчик ошибок XMLDOMParseError будет содержать в коде ошибки соответствующее значение.
|
Создание новых объектов. Необходимо отметить, что все методы лишь создают указанные объекты и для включения их в объектную модель документа надо дополнительно использовать методы insertBefore, insertAfter или appendChild.
|
createAttribute (name)
|
Создает для текущего элемента новый атрибут с указанным именем. Новый атрибут добавляется в объектную модель документа только после определения его значения методом setAttribute.
|
createNode(Type, name, nameSpaceURI)
|
Создает узел указанного типа и названия. Namespace префикс задается параметром nameSpaceURI. Возвращаемым значением будет созданный объект указанного типа.
|
createCDATASection(data)
|
Создает область CDATA - возвращает объект XMLDOMCDATASection
|
createDocumentFragment()
|
Создает новый пустой фрагмента документа - объект XMLDOMDocumentFragment
|
createComment(data)
|
Создает комментарий.
|
createElement(tagName)
|
Создает элемент документа с указанным названием.
|
createEntityReference(name)
|
Создает ссылку на подстановочные символы
|
createProcessingInstruction(target, data)
|
Создает новую директиву XML-процессора
|
createTextNode(data)
|
Создает текст внутри документа
|
Поиск узлов дерева документа
|
getElementsByTagName(tagname)
|
Возвращает ссылку на коллекцию элементов документа с заданным именем (или всех элементов, если значение tagname равно "*")
|
nodeFromID(idString)
|
Поиск элемента по идентификатору
|
hasChildNodes()
|
Возвращает истину, если текущий узел содержит поддерево.
Объект XMLDOMNodeList |
Представляет собой список узлов - поддеревья и содержит методы, при помощи которых можно организовать процедуру обхода дерева. |
Свойства |
|
length
|
число элементов списка узлов
Методы |
|
item(i)
|
Выбор i-того элемента из списка. Возвращает объект XMLDOMNode
|
nextNode()
|
Выбор следующего элемента в списке. Если такого элемента нет, то возвращает null. первый вызов этого метода(после сброса итератора) возвратит ссылку на первый элемент списка.
|
reset()
|
Сброс внутреннего указателя текущего элемента
Объект XMLDOMParserError |
Объект позволяет получить всю необходимую информацию об ошибке, произошедшей в ходе разбора документа. Все свойства этого объекта доступны только для чтения. |
Свойства |
|
errorCode
|
Содержит код возникшей ошибки либо 0, если таковой не случилось.
|
url
|
Возвращает URL обрабатываемого документа
|
filepos
|
Возвращает смещение относительно начала файла фрагмента, в котором обнаружена ошибка
|
line
|
Содержит номер строки, содержащей ошибку
|
linepos
|
Позицию ошибки в строкев которой была обнаружена ошибка
|
reason
|
Описание ошибки
|
srcText
|
Содержит полный текст строки, в которой произошла ошибка
Приведем некоторые примеры использования объектной модели.
Содержание раздела