Rambler's Top100
Структуралист (на главную)  
 

16. DOM - ОБЪЕКТНАЯ МОДЕЛЬ ДОКУМЕНТА

Объектная модель документа (Document Object Model – DOM) является стандартом, предложенным веб-консорциумом, и регламентирует способ представления содержимого документа (в частности веб-страницы) в виде набора объектов. Под содержимым понимается все, что может находиться на веб-странице: рисунки, ссылки, абзацы, текст и т. д.

В отличие от объектной модели браузера (BOM), которая уникальна для каждого браузера, объектная модель документа является стандартом и должна поддерживаться всеми браузерами. И хотя на практике поддержка DOM реализована не в полной мере, тем не менее необходимо стремиться следовать требованиям этого стандарта как производителям браузеров, так и разработчикам веб-сайтов.

Следует заметить, что DOM может применяться не только в веб-страницах, но и к любым других документам. В частности, она может использоваться с любыми словарями XML, причем одним из таких словарей является HTML, а точнее, XHTML.

DOM является развивающимся стандартом и разбит на три уровня. Первый уровень является первой версией стандарта и пока что единственной законченной. Он состоит из двух разделов: первый является ядром и определяет принципы манипуляции со структурой документа (генерация и навигация), а второй посвящен представлению в DOM элементов HTML, определяемых одноименными тегами.

Второй и третий уровни описывают модель событий, дополняют таблицы стилей, проходы по структуре.

Представление документа в виде древовидной структуры

В DOM документ представляется в виде древовидной структуры (рис. 19), являющейся одной из наиболее употребительных структур в программировании. Это обеспечивает унифицированный способ навигации по документу.

Представление HTML-документа в виде древовидной структуры

Рис. 19. Представление HTML-документа в виде древовидной структуры

Навигация по документу

В модели DOM к элементу можно обратиться непосредственно по его идентификатору id, воспользовавшись методом getElementById объекта Document:

<html>
<head>
<title>Основы DOM</title>
</head>
<body>
<h1 id = "head">Основы DOM</h1>
<p>A Text</p>
<script language = "JavaScript">
var a = document.getElementById("head");
alert(a);
</script>
</body>
</html>

Для получения коллекции всех элементов, соответствующих какому-либо тегу, используется метод объекта Document – getElementsByTagName. Например, var a = document.getElementsByTagName("TD") присвоит переменной a коллекцию всех элементов <td>. Обратите внимание, что имя элемента следует писать прописными буквами ("TD"). Рассмотрим пример использования метода getElementsByTagName:

<html>
<head>
<title>Основы DOM</title>
</head>
<body>
<h1 id = "head">Основы DOM</h1>
<table border = "2">
<tr>
<td>1,1</td>
<td>1,2</td>
</tr>
<tr>
<td>2,1</td>
<td>2,2</td>
</tr>
</table>
<script language = "JavaScript">
var a = document.getElementsByTagName("TD");
a.item(0).style.color = "red";
a.item(3).style.fontFamily = "arial";
a.item(3).style.color = "green";
</script>
</body>
</html>

Чтобы воспользоваться преимуществом древовидной структуры, принятой в DOM для представления документа, следует использовать навигационные атрибуты (рис. 20), представленные в табл. 11.

Навигационные атрибуты объекта Node

Рис. 20. Навигационные атрибуты объекта Node

Таблица 11
Навигационные атрибуты объекта Node
Атрибут Описание
firstChild Возвращает первый узел-потомок
lastChild Возвращает последний узел-потомок
previousSibling Возвращает предыдущий соседний узел, имеющий с текущим одного родителя
nextSibling Возвращает следующий соседний узел, имеющий с текущим одного родителя
parentNode Возвращает родительский узел
ownerDocument Возвращает корневой узел документа, содержащий текущей узел
nodeName Возвращает имя узла
nodeValue Возвращает значение узла в текстовом формате
nodeType Возвращает тип узла в виде числа

В следующем примере осуществляется проход по древовидной структуре документа:

<html>
<head>
<title>Навигация по документу</title>
</head>
<body>
<h1>Изучение навигации по документу</h1>
<p>Абзац 1</p>
<p>Абзац 2</p>
<script language = "JavaScript">
var temp = document.documentElement;
temp = temp.firstChild;
alert(temp.tagName);
if(temp.nextSibling == 3)
temp = temp.nextSibling.next.Sibling;
else
temp = temp.nextSibling;
alert(temp.tagName);
temp = temp.firstChild;
alert(temp.tagName);
temp.style.color = "red";
if(temp.nextSibling == 3)
temp = temp.nextSibling.nextSibling;
else
temp = temp.nextSibling;
alert(temp.tagName);
temp.style.color = "blue";
temp = temp.parentNode;
alert(temp.tagName);
</script>
</body>
</html>

Динамическая генерация веб-страниц средствами DHTML на основе DOM

Иногда требуется динамически формировать веб-страницы, например, в случае создания чатов, форумов, либо динамически создаваемых веб-страниц, содержимое которых хранится в базе данных. DOM позволяет решить такую задачу.

Для создания объектов у объекта Document имеются следующие методы (табл. 12):

Таблица 12
Методы объекта Document, позволяющие создавать объекты
Метод Описание
createElement(имя_элемента) Создает новый узел элемента с указанным именем
createTextNode(текст) Создает текстовый узел с указанным текстом
createAttribute(имя_атрибута) Создает новый узел атрибута с указанным именем

Вновь созданные объекты добавляются в структуру документа при помощи методов объекта Node (табл. 13):

Таблица 13
Методы объекта Node, добавляющие и удаляющие элементы документа
Метод Описание
appendChild(новый_узел) Добавляет объект Node в конец списка узлов-потомков
cloneNode(потомок-опция) Создает объект Node, идентичный указанному в аргументе. В качестве аргумента можно использовать и все узлы-потомки одновременно
hasChildNodes() Возвращает true, если узел имеет потомков
insertBefore(новый_узел, текущий_узел) Вставляет объект Node в список потомков перед узлом, указанным в качестве второго параметра
removeChild(узел-потомок) Удаляет узел-потомок, указанный в качестве параметра
replaceChild(новый_потомок, старый_потомок) Заменяет старого потомка на нового

Приведем пример динамической генерации документа средствами DOM (рис. 21).

Динамически сгенерированная веб-страница

Рис. 21. Динамически сгенерированная веб-страница

<html>
<head>
<title>Пример динамической генерации документа</title>
</head>
<body>
<script language = "JavaScript">
var newText;
var newElem;
newText = document.createTextNode("Пример
динмического создания HTML-документа");
newElem = document.createElement("H1");
newElem.appendChild(newText);
document.body.appendChild(newElem);
newText = document.createTextNode("Абзац");
newElem = document.createElement("P");
newElem.appendChild(newText);
document.body.appendChild(newElem);
</script>
</body>
</html>

Для чтения и установки атрибутов используются следующие методы объекта Element (табл. 14).

Таблица 14
Методы объекта Element
Метод Описание
getAttribute(имя_атрибута) Возвращает значение атрибута
setAttribute(имя_атрибута, значение) Устанавливает значение атрибута
removeAttribute(имя_атрибута) Устанавливает значение атрибута по умолчанию, затирая текущее значение

Ниже приведен пример на задание атрибутов. И хотя применение атрибутов физического форматирования не рекомендовано к применению (для этих целей используются стили), они были выбраны в качестве примера, так как наглядно демонстрируют идею задания атрибутов методами DOM.

<html>
<head>
<title>Пример динамического создания HTML-документа</title>
</head>
<body>
<script language = "JavaScript">
var newText;
var newElem;
newText = document.createTextNode("Пример динамического
создания HTML-документа");
newElem = document.createElement("H1");
newElem.appendChild(newText);
newElem.setAttribute("align", "center");
document.body.appendChild(newElem);
alert(newElem.getAttribute("align"));
newText = document.createTextNode("Абзац");
newElem = document.createElement("P");
newElem.appendChild(newText);
newElem.setAttribute("align", "right");
document.body.appendChild(newElem);
alert(newElem.getAttribute("align"));
newElem.removeAttribute("align");
</script>
</body>
</html>

Модель событий DOM

Особенностью программ, создаваемых для среды веб является то, что они управляются событиями. Чтобы узнать, какое событие произошло, в DOM имеется объект события event (табл. 15). Объект event является локальным и его следует явным образом передавать в обработчик события.

Таблица 15
Свойства объекта event
Свойство Описание
bubbles Указывает возможность «всплывания» события (передачи управления вверх по иерархической структуре)
cancelable Указывает возможность отмены действия события, заданного по умолчанию
currentTarget Указывает событие, обрабатываемое в данный момент
eventPhase Указывает фазу возбуждения события
target (только NN 6) Указывает элемент, вызвавший событие
timestamp (только NN 6) Указывает время возникновения события
type Указывает имя события

События, связанные с мышью, генерируют объект mouse (табл. 16).

Приведем пример динамически изменяемого текста.

<html>
<head>
<script language = "JavaScript">
function onMouseover()
{
var temp = document.getElementById("DynamicText");
temp.firstChild.nodeValue = "Указатель мыши на тексте";
temp.style.color = "red";
}
function onMouseout()
{
var temp = document.getElementById("DynamicText");
temp.firstChild.nodeValue = "Динамический текст";
temp.style.color = "black";
}
</script>
<title>Динамический текст</title>
</head>
<body>
<p id = "DynamicText" onmouseover = "return onMouseover()"
onmouseout = "return onMouseout()">Динамический текст</p>
</body>
<html>

Таблица 16
Свойства объекта mouse
Свойство Описание
altKey Указывает, была ли нажата клавиша <Alt> в момент возникновения события
button Указывает, какая клавиша мыши была нажата
clientX Сообщает горизонтальную координату указателя мыши в окне браузера на момент возникновения события
clientY Сообщает вертикальную координату указателя мыши в окне браузера на момент возникновения события
ctrKey Указывает, была ли нажата клавиша <Ctrl> в момент возникновения события
metaKey Указывает, была ли нажата метаклавиша в момент возникновения события
relatedTarget (только NN 6) Указывает цель события
screenX Сообщает горизонтальную координату указателя мыши в окне браузера, вычисленную от начала экранных координат, на момент возникновения события
screenY Сообщает вертикальную координату указателя мыши в окне браузера, вычисленную от начала экранных координат, на момент возникновения события
shiftKey Указывает, была ли нажата клавиша <Shift> в момент возникновения события

Пример, определяющий координаты нахождения курсора мыши.

<html>
<head>
<title>Определение координат курсора</title>
<script language = "JavaScript">
function onClick(e)
{
alert("X = " + e.clientX + "; " + "Y = " + e.clientY);
}
</script>
</head>
<body onclick = "onClick(event)">
<p>Щелкните мышью на экране<p>
</body>
</html>

< предыдущая оглавление следующая >

Кто Вы?
Исследователь
Специалист
Управленец
Преподаватель
Студент
Аспирант
Другое
Результаты голосования

©Structuralist 2005-2006
structuralist@narod.ru
Рейтинг@Mail.ru Rambler's Top100
Hosted by uCoz