Россия, Звенигород |
Скрипты
5.5.2.3. DOM 2
Mozilla почти полностью поддерживает DOM 2.
DOM 2 заполняет многие пробелы в стандарте DOM 1. Это надмножество DOM 1. DOM 1 написан как один документ, а DOM 2 разбит на шесть. Это:
- DOM 2 Core
- DOM 2 HTML
- DOM 2 Events (события)
- DOM 2 Style (стили)
- DOM 2 Traversal and Range
- 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.
Это новые стандарты, но на момент написания книги они уже находились в стадии завершения. Большая часть описанной в них функциональности в браузерах пока недоступна. Вот пять частей этого стандарта:
В 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" ("ложь") написано большими буквами лишь для облегчения чтения.
Другие функции 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.
Каждое слово на рисунке 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. Эти интерфейсы мы и рассмотрим далее.