Опубликован: 10.12.2007 | Уровень: специалист | Доступ: платный
Лекция 5:

Скрипты

5.5. Интерфейсы Mozilla, доступные в скриптах

Как рука в перчатке, интерпретатор JavaScript и базовое программное обеспечение, в которое он встроен, работают вместе. В этом разделе описывается вклад в это партнерство базового ПО.

Как и в C, в JavaScript нет операций ввода-вывода. Весь ввод и весь вывод осуществляются через объекты базового ПО. Нужна, по крайней мере, простейшая часть базового ПО, чтобы предоставить эти объекты.

Если основные функции ввода/вывода предоставляются, скрипт может включать другие скрипты откуда-нибудь еще. Теоретически такие скрипты могут использоваться для создания очень больших программ. Это похоже на модульную среду Perl, но в JavaScript такая практика не очень распространена. В JavaScript ожидается, что основная часть функциональности программы будет реализована в объектах базового ПО. Поэтому изучать синтаксис и семантику этого языка очень просто, по сравнению с изучением обширных библиотек объектов.

Объекты базового ПО - концепция JavaScript. Хотя такие вещи появляются внутри скрипта как объекты, службам базового ПО, скрывающимся за ними, совсем необязательно быть объектами. В случае Mozilla функциональность, доступная в скриптах, обеспечивается платформой, которая состоит из набора интерфейсов. Многие из них неотличимы от объектов, и многие из них на самом деле реализованы как объекты C++. Они также могут быть реализованы в чистом JavaScript. Такие вещи называются скриптами, просто чтобы обратить внимание на то, что они, формально, делают функции платформы доступными. Концепция интерфейса в Mozilla следует концепциям интерфейсов в Java и Microsoft COM - некоторый набор (необязательно полный) функций и свойств, предоставляемых объектом.

5.5.1. Происхождение интерфейсов

Все объекты базового ПО с точки зрения скрипта одинаковы, но они приходят из разных мест. Вот некоторые из технологий, которые вносят свой вклад в создание таких объектов:

  • Стандарты консорциума World Wide Web. Стандарты W3C DOM описывают обширные программные интерфейсы к XML-документам. Эти интерфейсы дают скриптам почти полный контроль над содержимым документа.
  • Объектные модели приложения и браузера (AOM и BOM). Кроме объектов DOM, платформа Mozilla предоставляет и другие объекты, доступные, когда HTML- или XUL-документ отображается в окне. Некоторые из них поддерживаются другими браузерами; некоторые нет.
  • XPConnect и XPCOM. Эта система уникальна для платформы Mozilla и предоставляет доступ ко всем компонентам, ее составляющим. Эти компоненты выполняют большую часть работы приложения. Компоненты также представляют собой библиотеку или набор инструментов, полезных при решении стандартных задач программирования, например, доступа к сокетам.
  • XBL-связки. Язык разметки XBL, описываемый в "XBL-связки" , "XBL-связки", комбинирует XML-документ, JavaScript и правила стилей, чтобы создать для XML-документа доступные из скриптов интерфейсы. Хотя эти интерфейсы и определяются в файлах вне платформы Mozilla, именно платформа несет ответственность за их разбор и связывание с объектами из скриптов.

Все эти интерфейсы комбинируются в среде Mozilla. В частности, они все могут использоваться внутри одного окна, которое представляет собой корневую глобальную переменную объектной системы JavaScript. Вместе они создают многофункциональную среду программирования.

В Mozilla предусмотрена также поддержка JavaScript меньшего масштаба. Например, у системы настроек и системы установки есть собственные, независимые среды JavaScript, которые включают в себя очень маленькое число узкоспециализированных объектов базового ПО. Пользующиеся ими интерпретируемые скрипты отделяются от остальной части платформы и ее служб. В этой лекции такие среды называются изолированными интерфейсами.

5.5.2. Стандарты W3C DOM

Версии стандартов, описывающих объектную модель документа, начинаются с 0 (нуля) и созданы так, чтобы не зависеть ни от какого конкретного программного обеспечения. Mozilla поддерживает полностью DOM 0, DOM 1, большую часть DOM 2, кое-что из DOM 3 и множество нестандартных расширений. Другие браузеры, например, Internet Explorer 6 и Opera, поддерживают, по крайней мере, DOM 0 и DOM 1. Существует множество программных библиотек, с помощью которых в приложение, которое должно обрабатывать XML, можно добавить поддержку DOM 1.

Если в Mozilla реализуется какая-то часть DOM, реализация этой функциональности точно такая, как предписано стандартом. Это очень просто.

Версии этих стандартов в формате PDF (Portable Document Format) во время программирования можно использовать как справочники. Все версии, начиная с первой, доступны на сайте http://www.w3.org. Чтобы сохранить еще не окончательные черновики, которые обычно доступны только в формате XHTML, в Mozilla, следует сохранить их в файл как "Web-страница, полностью". Отображение таких XHTML-файлов, сохраненных локально, при отсутствии подключения к Internet может быть медленным. В таком случае следует сразу же выбрать File | Work Offline.

Приложения к этим стандартам включают описания JavaScript-вариантов интерфейсов, но эти описания довольно многословны. Синтаксис IDL, использующийся в этих документах, довольно близок к синтаксису JavaScript. Обычно его довольно легко читать и преобразовывать в скрипты JavaScript. Это рекомендуемый путь.

Если вы понимаете синтаксис IDL в таких стандартах, то это идеально для чтения XPIDL-файлов, описывающих XPCOM-компоненты Mozilla. Чуть позже мы рассмотрим эти компоненты более подробно.

5.5.2.1. DOM 0

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

У DOM версии 0 нет соответствующего стандарта W3C, и он представляет собой раннюю попытку поддержки JavaScript только для HTML. Содержание DOM 0 примерно эквивалентно доступным для скриптов функциям в третьих версиях браузеров. Лучшая документация по этим функциям находится на сайте Netscape’s DevEdge, где по-прежнему хранятся довольно старые документы. Руководства к ранним версиям Navigator можно найти в разделе "Archived information".

DOM 0 относится к HTML, а не к XML или XUL. Как упоминалось раньше, он предоставляет стандарт готовых объектов, которые доступны автору скрипта после загрузки HTML-документа. Самый известный пример - объект Image, который часто использовался в DHTML, чтобы менять изображение при наведении на него указателя мыши. Это описывается в любой книге о web-дизайне для читателей со средним уровнем подготовки.

Объекты DOM 0 часто точно соответствуют именам HTML-тегов; например, у тега <input> есть объект InputElement или FormElement. В XUL при поиске объекта DOM 0 для какого-то тега пользуйтесь как отправной точкой ближайшим к вашему тегу HTML-тегом.

5.5.2.2. DOM 1

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

Среди множества предоставляемых стандартом DOM 1 функций в 90% случаев для написания скрипта нужны только интерфейсы Node, NodeList, Element и Document. Важные свойства и методы этих интерфейсов перечислены в таблице 5.3.

Таблица 5.3. Самые полезные функции стандарта DOM 1
Самые полезные функции стандарта DOM 1 Интерфейс DOM Описание
parentNode Node Родительский тег по отношению к текущему
childNodes Node Все теги-потомки текущего тега в виде NodeList
firstChild Node Первый тег-потомок текущего тега
nextSibling Node Следующий тег-потомок родительского тега по отношению к текущему
Node insertBefore(aNode, existingNode) Node Добавить тег или текст перед указанным тегом-потомком или текстом
Node removeChild(existingNode) Node Удалить тег или текст из непосредственного потомка текущего тега
Node appendChild(aNode) Node Добавить тег или текст в конец списка потомков этого тега
String getAttribute(attString) Element Вернуть значение существующего атрибута или "" для текущего тега
void setAttribute(attString, value) Element Добавить текущему тегу атрибут с определенным значением
void removeAttribute(attString) Element Удалить из тега данный атрибут, если он существует
Boolean hasAttribute(attString) Element Определить, существует ли указанный атрибут
Element createElement(tagString) Document Создать тег; этот тег будет существовать отдельно от текущего документа
Node createTextNode(value) Document Создать текст; этот текст будет существовать отдельно от текущего документа
Element getElementById(idString) Document Вернуть тег с указанным идентификатором
NodeList getElementsByTagName(tagString) Element, Document Вернуть все теги с указанным именем тега
Node item(i) NodeList Вернуть i -й элемент списка
length NodeList Вернуть число элементов в списке

Так как интерфейсы Element и Document также являются Nodes, все свойства и методы Node относятся и к этим интерфейсам.

Стандарт DOM 1 игнорирует опыт DOM 0 и начинает с чистого листа. Этот стандарт состоит из двух частей.

Первая часть очень общая и относится ко всем XML-документам, в том числе MathML, SVG и XUL. Она также относится к XHTML и HTML. Она создает из текста документа древоподобную структуру, очень похожую на то, что мы видим в HTML-редакторе со включенной функцией автоматического выравнивания тегов. Mozilla отображает такую структуру, если загрузить XML-документ, чей тип приложения она не может обработать. Эта структура - иерархия включений.

Все в первой части DOM 1 объекты Node. Документы, теги, атрибуты и содержимое тегов - объекты, являющиеся подтипами Node. Дерево документов - дерево таких объектов, в корне которого находится объект Document. Это дерево не имеет сведений о конкретных тегах (например, о XUL-тегах). Поэтому здесь нет объекта <button>. Есть только обобщенный объект, использующийся для всех тегов. И для XML, и для HTML, и для XUL обработка одна и та же.

Существует два способа перемещаться по этому дереву. Первый задействует систему запросов. Можно пользоваться эквивалентом document.all() от Microsoft из DOM 1 или расширением Mozilla:

document.getElementsByTagName("button"); // любой XML
document.getElementsByAttribute("class", "*"); // только XUL

Параметр * свидетельствует о том, что допустимы любые значения атрибута. Другой способ - обходить все дерево явно, используя определенные структуры данных и алгоритмы. Например, с помощью этого кода можно переместиться в документе на два уровня вниз:

document.firstChild().firstChild().getAttribute("type");

В первой части стандарта DOM 1 также предоставляется полный набор функций для вставки, изменения и удаления XML-содержимого, но это должно выполняться путем создания объектов, а не вставки нужных кусков в XML-данные. Если изменение содержимого важно, создание объектов может оказаться длительным и сложным процессом. В Mozilla есть единственное расширение, позволяющее решать эти задачи быстрее - свойство innerHTML. Это улучшение создано как аналог соответствующему свойству в Internet Explorer и позволяет добавлять XML-содержимое прямо к содержимому тега. Несмотря на имя, это свойство можно использовать в XML и XUL наравне с HTML:

tag_object.innerHTML = '<box><button value="On"/></box>';
old_content = tag_object.innerHTML;

Mozilla не поддерживает расширения Internet Explorer innerText, outerHTML и outerText.

Вторая часть стандарта DOM 1 относится только к HTML. В ней перечислены удобные методы и атрибуты для работы с HTML-документами. У элемента DOM-дерева, соответствующего HTML-тегу, свойства будут соответствовать HTML-атрибутам данного тега. Поэтому в дереве у тега <FORM> будет узел со свойствами action, enctype и target, помимо прочих.

В этой части описываются также два других способа выбирать теги из общего набора:

document.getElementsByName('myform1');
document.getElementById('testid');

getElementById() также поддерживается для XUL и используется везде. Пользоваться getElementsByName() не рекомендуется даже для HTML, так как атрибут имени в HTML понемногу убирается из этих стандартов.

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

Дмитрий Гуменюк
Дмитрий Гуменюк
Россия, Звенигород
Konstantin Grishko
Konstantin Grishko
Россия, Москва, Московский финансово-промышленный университет "Синергия", Москва