Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 822 / 20 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 5:

Скрипты

5.5.2.3. DOM 2

Mozilla почти полностью поддерживает DOM 2.

DOM 2 заполняет многие пробелы в стандарте DOM 1. Это надмножество DOM 1. DOM 1 написан как один документ, а DOM 2 разбит на шесть. Это:

  1. DOM 2 Core
  2. DOM 2 HTML
  3. DOM 2 Events (события)
  4. DOM 2 Style (стили)
  5. DOM 2 Traversal and Range
  6. DOM 2 Views

Первые два - то же, что и стандарт DOM 1. В них есть небольшие исправления, но эти же исправления есть и в последних версиях DOM 1. Кроме того, есть некоторые мелкие дополнения. Все, что есть в DOM 1, в DOM 2 называется "базовым интерфейсом". "Расширенный интерфейс" DOM 2 предоставляет несколько удобных функций, которыми можно пользоваться только в XML, но не в HTML. Это интерфейсы, дающие доступ к:

  • ссылкам на сущности, например & ;
  • инструкциям обработки, реализуемым языками вроде XSLT ;
  • объявлениям <!ENTITY> в DTD документа.

Стандарт DOM 2 также описывает известные события браузеров. Кроме событий мыши ( click ) и конкретных событий HTML ( submit ) описываются и общие события XML ( DOMFocusIn ). Есть и события, которые появляются во время изменения дерева документа. В этом стандарте отсутствуют события клавиатуры ( keydown ). Стандарт также определяет перемещения событий по дереву документа. Более подробно мы обсудим события в "События" , "События".

Стандарт DOM 2 Style дополняет стандарт CSS 2, предоставляя доступ к стилям из JavaScript. В DOM 1 лучшее, что можно сделать - это изменить атрибут style у тега (встроенный стиль). Стандарт DOM 2 позволяет работать с правилами стилей так, как если бы они были объектами, а не просто текстом. Он также позволяет проверять и менять полностью каскадный стиль конкретного тега. Следующий код

document.getElementById("greeting").style.color ="red";

окрашивает часть текста в красный, независимо от существующего для него набора внешних и встроенных стилей. Однако этот интерфейс не поддерживается в XUL. Он поддерживается только в HTML.

Стандарт DOM 2 Traversal and Range делает возможными операции вырезания и вставки данных, выполняемые пользователем. Чтобы понять, какие теги пользователь выбрал, требуется тщательный осмотр дерева документа. Для такого осмотра нужны удобные способы прохода по дереву. Именно они описываются в части Traversal, где вводятся новые объекты, Iterator и TreeWalker. В части Range создается набор объектов для выделенных мышью тегов. В Mozilla технология выделения и вставки мышью, там, где она существует, реализована с помощью этого стандарта. Также в этой части описывается немного сложный процесс обработки тегов. Теги можно разбивать на два, вставлять содержимое между тегами и делать другие полезные вещи. Более простой способ вставлять содержимое в XML-документ, который при этом гарантированно останется корректным, открывает широкие возможности.

Стандарт DOM 2 Traversal and Range в основном направлен на создание нового программного обеспечения. Это же утверждение верно и для стандарта DOM 2 Views. Его цель - предоставить интерфейсы, позволяющие дереву документа отображаться сразу же в нескольких окнах. Самое очевидное применение этой возможности - в HTML-редакторах вроде HomeSite, где одновременно доступны предварительный просмотр, обзор исходного кода и дерево документа. Изменение лежащей в основе модели документа через любое из этих представлений приведет к изменению и остальных. Стандарт DOM 2 Views описывает необходимые для создания такого редактора интерфейсы.

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

5.5.2.4. DOM 3

Mozilla поддерживает только небольшую часть стандартов DOM 3.

Это новые стандарты, но на момент написания книги они уже находились в стадии завершения. Большая часть описанной в них функциональности в браузерах пока недоступна. Вот пять частей этого стандарта:

  1. DOM 3 Core
  2. DOM 3 Events
  3. DOM 3 Load and Save
  4. DOM 3 Validation
  5. DOM 3 XPath

В DOM 3 Core внесены небольшие по сравнению с DOM 2 Core изменения. Важны две вещи. Следующий пример использования DOM 3

document.getInterface("SVG");

позволяет другим реализованным в браузере стандартам быть доступными в скриптах. Это аналог use в Perl. Если поддержка SVG в браузере предоставляет SVG-интерфейс в JavaScript, недоступный по умолчанию, то это возможность сделать его доступным.

Второе важное изменение показано в следующем примере:

document.setNormalizationFeature("format-pretty-print");

Оно дает возможность дополнительного контроля над процессором XML. Механизм обработки XML во время загрузки XUL- или HTML-файла принимает множество решений, например, что делать с пробельными вставками и когда сообщать об ошибках. После реализации DOM 3 Core можно будет контролировать процесс принятия решений.

Стандарт DOM 3 Events дополнительно описывает события клавиатуры (также называемые текстовыми событиями), отсутствующие в DOM 2 Events. Описывается большая часть клавиш, например, Alt, Caps Lock и F12. Также вводятся перехватчики для обработчиков событий, что позволяет запускать два обработчика событий для одного тега при возникновении только одного события. Это единственная часть DOM 3, которую Mozilla почти поддерживает.

Стандарт с длинным именем DOM 3 Abstract Schemas and Load and Save - еще одно двухчастное произведение. Часть Abstract Schemas предоставляет полный доступ на чтение и запись к DTD XML-документа. Это, вероятно, более полезно в XML-базе данных, чем в браузере. Часть Load and Save описывает, как переходить от XML-текста к дереву документа и обратно. Это стандарт, определяющий сериализацию или кодирование. Это стандартное решение задачи, которую сейчас решает свойство innerHTML.

DOM 3 Validation добавляет к операциям над документами систему ограничений. С помощью других стандартов DOM можно изменить документ так, что он больше не будет соответствовать своему типу документов. Например, с помощью интерфейсов DOM 1 можно добавить к содержимому HTML-документа тег <circle>, хотя это и не тег HTML. Стандарт DOM 3 Validation проверяет определение типа документа (в виде DTD или XSchema ) при каждом изменении документа с помощью DOM-интерфейсов. Если какое-то изменение неявно нарушит правила типа документа, оно не будет допущено. Наконец, DOM 3 XPath описывает еще один метод прохода через дерево документа с помощью JavaScript, основываясь на стандарте W3C XPath. DOM 3 XPath делает доступной в JavaScript систему XPath.

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

Сомнительно, чтобы в ближайшее время появился набор стандартов DOM 4, если он вообще будет когда-либо существовать.

5.5.2.5. Фокусы с DOM-совместимостью

Стандарты DOM предоставляют интерфейс DOMImplementation с методом hasFeature(). Этот метод может быть вызван из JavaScript, чтобы выяснить, какая функциональность в Mozilla заявлена как поддерживаемая. Вот подходящая для этого строка кода:

f = document.implementation.hasFeature("XML","1.0");

В базе данных ошибок Mozilla хранится старое обсуждение метода hasFeature(). В таблице 5.4 приведены результаты для Mozilla 1.0 и 1.4. Слово "FALSE" ("ложь") написано большими буквами лишь для облегчения чтения.

Таблица 5.4. Поддержка DOM-стандартов в Mozilla 1.0 и 1.4
Функциональность Версия Результат hasFeature()
HTML 1.0 true
XML 1.0 true
Core 2.0 true
HTML 2.0 true
XML 2.0 true
Views 2.0 true
StyleSheets 2.0 true
CSS 2.0 true
CSS2 2.0 true
Events 2.0 true
UIEvents 2.0 FALSE
MouseEvents 2.0 true
MouseScrollEvents Не описывается стандартом W3C true
MutationEvents 2.0 FALSE
HTMLEvents 2.0 true
Range 2.0 true
Traversal 2.0 FALSE
Xpath 3.0 true
All other DOM 3 features 3.0 FALSE

Другие функции DOM 3

Результаты одинаковы для скриптов и в XUL, и в HTML, что делает некорректным результат запроса со строкой "HTML" в XUL-документе. В XUL есть также собственная поддержка так называемых KeyEvents, но hasFeature() еще не сообщает о них.

Результат false для какой-то конкретной функции - еще не конец света. Если стандарт реализован полностью, за исключением какой-либо одной функции, то это корректный ответ. Если вам известна реализованная часть стандарта, вы все равно можете ею пользоваться. Выявлять такие функции - дело чтения и поиска.

Если поддерживается какая-то часть DOM, то в скриптах доступны соответствующие интерфейсы. Интерфейсы используются в языках программирования. Однако есть и другие способы взаимодействия со службами браузера. Два примера тому - XML и таблицы стилей. Браузер может реализовать поддержку таблиц стилей, но не поддержку DOM, и наоборот. Метод hasFeature() возвращает результаты только о поддержке DOM.

Некоторая функциональность браузера может когда-нибудь сама попасть в стандарты DOM. Функции Mozilla 1.0, которые вероятнее всего привлекут внимание стандартов - поддержка перетаскивания мышью, события клавиатуры, события прокрутки и клавиатурные сокращения.

Отдельно от DOM 0 для HTML существует поддержка DOM 0 для XUL. У DOM 0 для XUL нет стандарта или основного документа, описывающего его структуру. Он не документирован, за исключением замечаний о некоторых тегах в этой книге.

Интерфейсы объектов в Mozilla определяются на собственном языке: XPIDL. Файлы XPIDL, необходимые программисту при работе с XPCOM- объектами, используются и для DOM-объектов. Так как синтаксис XPIDL очень похож на синтаксис IDL, перевод из одного в другой очень прост. Однако XPIDL-определения Mozilla, расположенные в каталоге исходных текстов dom/public/idl, - официальное заявление поддержки интерфейсов DOM и схожих с ними. Они включают в себя переопределения и IDL-определений DOM, и доступных интерфейсов для XUL. В них также указаны специфичные для Mozilla расширения этих стандартов. Но помните, что некоторые реализованные обработчики событий не появляются в этих файлах.

5.5.3. AOM и BOM в Mozilla

DOM-объекты относятся к XML-документам. Некоторые из них доступны при загрузке XML-документа, потому что это удобно. Очевидный пример - объект Document и переменные документа, указывающие на него.

Есть и другие объекты, которые могут быть полезны в скриптах, но не имеют ничего общего с документами: скажем, окно, в котором отображается документ. Может понадобиться изменить текст его заголовка, открыть модальный диалог или заменить отображаемый документ другим.

Эти объекты, не относящиеся к документам - часть объектной модели браузера ( Browser Object Model, BOM ), существующей в большинстве браузеров. Эта модель по сравнению с DOM очень маленькая и состоит из иерархии всего лишь нескольких объектов. В самом ее верху находится так называемый объект Window, представляющий окно на рабочем столе, в котором отображается документ. Переменная окна указывает на этот объект. Небольшая иерархия BOM будет знакома web-разработчикам и содержит такие объекты:

navigator screen history location frames

В этой книге мы не будем надолго задерживаться на подобных объектах (в любой книге по JavaScript для web-страниц они подробно рассматриваются). Лишь в "Окна и панели" , "Окна и панели", мы продолжим обсуждение объекта окна.

Платформа Mozilla - это не только браузер, но и основа для приложений. При отображении XUL-документов более логично говорить об объектной модели приложения ( Application Object Model, AOM ), чем о BOM. Окна XUL также начинаются с переменной окна, самого верхнего объекта в иерархии приложения, но соответствующий ему тип - окно chrome, а не просто окно. На рисунке 5.1 показана иерархия приложения для окна chrome.

Объектная модель XUL-приложения Mozilla

Рис. 5.1. Объектная модель XUL-приложения Mozilla

Каждое слово на рисунке 5.1 - свойство объекта, само содержащее объект, хотя иногда там может находиться null или строка. Иерархия, начинающаяся с окна ( window ), присутствует всегда. Иерархия, начинающаяся с Element, существует для каждого объекта Element DOM 1. Темные ребра на рисунке показывают существование и для XUL, и для HTML; светлые - только для XUL. Прерывистая линия означает, что объект доступен, только если присутствуют защитные фильтры. Термины, совпадающие с терминами BOM, имеют то же значение, что и в BOM. Остальные термины обсуждаются в этом курсе.

Краткая характеристика AOM-объектов, специфичных для XUL, звучит так: аргументы ( arguments ) передаются при открытии окна; содержимое ( content ) указывает на документ, содержащийся в теге <browser> XUL-страницы; набор управляющих команд ( controllers ) существует или для окна, или для одного тега; диспетчер команд ( commandDispatcher ) - также часть системы команд; фокус ( focus ) отвечает за точку фокуса; объект блока ( boxObject ) содержит всю информацию о фрейме конкретного тега и для обычных XUL-тегов, и для особых тегов вроде <scrollbox> ; builder предоставляет механизм постройки дерева для тега <tree> ; база данных ( database ) и источник данных ( datasource ) - части системы шаблонов XUL.

Кроме этих объектов в "Окна и панели" , "Окна и панели", рассказывается и о некоторых менее явных. Многие из этих объектов связаны с общими механизмами отображения XUL- или HTML-документов.

Объект окна XUL очень похож на объект окна HTML. Например, у него тоже есть свойство history. Такое положение дел несколько сбивает с толку, так как подразумевается, что эти свойства что-то делают. А они не делают ничего. Они существуют потому, что многие скрипты и XUL-документы, составляющие приложение браузера, ожидают, что эти свойства будут работать. В нормальных условиях (классический браузер), чтобы эти свойства функционировали, необходима дополнительная поддержка в скриптах. В обычных окнах XUL этой поддержки нет, если только XUL-приложение не собирается копировать функциональность браузера. Как и в случае HTML, все реализованные интерфейсы DOM напрямую доступны из XUL. Свойства и методы объекта window.document - входные точки для этих интерфейсов.

И HTML-, и XUL-окна обладают одним особым свойством - свойством Components. Оно является шлюзом для доступа к большинству уникальных интерфейсов Mozilla. Эти интерфейсы мы и рассмотрим далее.