Dom объектная модель документа. Что такое DOM и зачем он нужен? Документы как деревья узлов
22.05.2020
Тема действительно сложная. Но, как говорится, не так страшен чёрт, как его малюют. Вот тут-то самый крепкий орешек достаётся мне: этакая сверхзадача «намалевать» по возможности удобоваримо, но и не совсем примитивно. Пока что все прочитанные мной материалы тяготеют либо к зауми, либо к примитиву.
Что такое DOM
Аббревиатура DOM
расшифровывается как Document Object Model
(объектная модель документа).
DOM
- это программный интерфейс доступа к содержимому HTML, XHTML и XML-документов, то есть представление тэгов и атрибутов HTML, XHTML и XML, а также стилей CSS в виде объектов программирования. С этой моделью работает как JavaScript, так и другие языки web-программирования.
Немного истории
Существует 4 уровня DOM
(0, 1, 2 и 3).
Уровень 0
(1996) включал в себя модели DOM
, которые существовали до появления уровня 1. В основном это коллекции: document.images, document.forms, document.layers и document.all. Эти модели формально не являются спецификациями DOM
, опубликованными W3C
. Скорее они представляют информацию о том, что существовало до начала процесса стандартизации.
Уровень 1
(1997) включал также базовые функциональные возможности по обработке XML-документов: многочисленные способы работы с отдельными узлами, работа с инструкциями обработки XML и т.д.
Кроме того, DOM
уровня 1 содержит ряд специальных интерфейсов, которые могут обрабатывать отдельные HTML-элементы. Например, можно работать с таблицами HTML, формами, списками выбора и т.д.
В DOM уровня 2
(2002) было добавлено несколько новых возможностей.
Если в DOM
уровня 1 отсутствовала поддержка пространств имён, то интерфейсы DOM
уровня 2 содержат методы для управления пространствами имён, связанными с требованиями к составлению и обработке XML-документов.
Помимо этого, DOM
уровня 2 поддерживает события.
Уровень 2 является текущим уровнем спецификаций DOM
, однако W3C
рекомендует и некоторые разделы спецификаций уровня 3.
DOM уровня 3
- это рабочий проект спецификации, которая расширяет функциональность DOM
уровня 2. Одна из наиболее важных особенностей этой версии спецификации заключается в возможности работать с многочисленными расширениями DOM
.
Что означает «программный интерфейс»?
Английское слово interface
можно перевести как «область контакта». Компьютер, грубо говоря, понимает только две вещи: пустой бит и заполненный бит. Язык, на котором «говорит» компьютер, можно представить как нескончаемую вереницу нулей и единиц, дающих бесконечное количество различных комбинаций.
Любой программный код - это вразумительная для программиста интерпретация этих «нулей и единиц», с которыми работает компьютер. Таким образом, любой язык программирования является интерфейсом человека и машины.
Браузеры работают так же, как и другие компьютерные приложения. Они интерпретируют в «нули и единицы» коды HTML, XML, CSS, скрипты JavaScript, PHP, Perl и т.д. Для работы с этим многоязычием нужна общая платформа. Этой платформой и является DOM
- спецификация, не зависящая от конкретного языка программирования или разметки. Это интерфейс, который можно использовать во многих популярных языках программирования, связанных с созданием web-страниц и способных понимать и интерпретировать объекты DOM
.
DOM и браузеры
DOM и JavaScript
В JavaScript вершиной иерархической лестницы объектов DOM
, своеобразным «проводником» в этот интерфейс служит объект document
, а объекты DOM
становятся его свойствами, свойствами его свойств и т.д. Их также называют узлами DOM
.
Узлы DOM
В DOM
уровня 2 есть 12 типов узлов. За каждым типом узла DOM
закреплена константа с уникальным именем. Большинство узлов предназначено для работы с XML
. В сборке HTML - JavaScript
, которой мы занимаемся, можно использовать только 5 типов. Но и эта «верхушка айсберга» представляет собой весьма «развесистое дерево», которое не охватить за одно-два занятия.
Полный набор констант типов узлов, определённый в спецификации W3C DOM
(голубым подсвечены узлы, доступные для HTML - JavaScript
):
Имя константы
Значение
Описание
Node.ELEMENT_NODE
Узел элемента (возвращает корневой элемент документа, для HTML-документов это элемент HTML)
Node.ATTRIBUTE_NODE
Узел атрибута (возвращает атрибут элемента XML- или HTML-документа)
Текстовый узел (#text)
Node.CDATA_SECTION_NODE
Узел секции CDATA (XML: альтернативный синтаксис для отображения символьных данных)
Node.ENTITY_REFERENCE_NODE
Node.ENTITY_NODE
Узел раздела
Node.PROCESSING_INSTRUCTION_NODE
Узел директивы XML
Node.COMMENT_NODE
Узел комментария
Node.DOCUMENT_NODE
Узел документа (основа доступа к содержанию документа и создания его составляющих)
Node.DOCUMENT_TYPE_NODE
Узел типа документа (возвращает тип данного документа, т.е. значение тэга DOCTYPE)
Node.DOCUMENT_FRAGMENT_NODE
Узел фрагмента документа (извлечение части дерева документа, создание нового фрагмента документа, вставка фрагмента в качестве дочернего элемента какого-либо узла и т.п.)
Node.NOTATION_NODE
Узел нотации*
*
Нотации - это имена, идентифицирующие формат неанализируемых разделов, формат элементов, имеющих атрибут нотации, или прикладную программу, которой адресована директива.
(Непонятно? Мне пока тоже не очень.)
Структура документа в модели DOM
Все объекты документа являются узлами DOM. Рассмотрим элементарный документ:
<
title>DOM
"center"
>
Заголовок
Текст абзаца
Вот схема его DOM-дерева:
Каждый узел может иметь дочерние узлы (на схеме к ним ведут стрелки). Объект document - основание дерева документа - тоже узел, но у него нет родительского узла и имеется ряд свойств и методов, отсутствующих у других узлов. Он имеет один дочерний узел: элемент
.
У элемента
два дочерних узла:
и
, для которых дочерними становятся все элементы, содержащиеся в них.
Внимание!
«Элемент» и «тэг» не синонимы. Тэг - это знак разметки:
- это два разных тэга. А элемент - объект, помеченный этими тэгами:
Текст абзаца
.
Элементы
,
и
Содержат внутри себя текст
. Это их дочерние текстовые узлы
. У элемента
есть также атрибут
: align="center"
. Узлы атрибутов
- это тоже дочерние узлы элементов, которые их содержат.
При работе с узлами DOM-дерева используются их свойства и методы.
Некоторые свойства узлов
Маленькое вступление
Ещё раз повторю: когда мы обращаемся в скриптах к элементам страницы, то имеем дело не только с языком Javascript, но и с внедрённым в него интерфейсом DOM
. Иногда необходимо отдавать себе в этом отчёт, иногда можно и забыть, «что говорим прозой».
Некоторыми свойствами и методами из объектной модели DOM
мы уже таким образом пользовались. Поэтому временами я буду давать ссылки на предыдущие уроки.
В этом уроке мы не будем идти «академическим» путём, рассматривая все свойства всех узлов во всех браузерах. Для начала познакомимся с самыми практичными и «бесконфликтными» из них.
Именно поэтому не будем
начинать, как принято, с «основных свойств»: nodeName
и nodeValue
.
tagName
Возвращает строку с именем тэга элемента. Все значения tagName содержат символы только верхнего регистра.
Синтаксис
элемент
.tagName
Пример
Тестируем свойство tagName
Результат
Тестируем свойство tagName
innerHTML
С этим свойством мы уже встречались (см. Урок 10). А теперь понимаем, откуда оно взялось: «из дома».
Даёт доступ к содержимому элемента. Задаёт не только текстовое содержание, но и все тэги HTML, находящиеся внутри элемента.
Это свойство не только для чтения, но и для изменения содержимого.
Примечание
В IE для ряда элементов innerHTML
работает только для чтения: это все табличные элементы, за исключением