Тема действительно сложная. Но, как говорится, не так страшен чёрт, как его малюют. Вот тут-то самый крепкий орешек достаётся мне: этакая сверхзадача «намалевать» по возможности удобоваримо, но и не совсем примитивно. Пока что все прочитанные мной материалы тяготеют либо к зауми, либо к примитиву.
Что такое 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