Россия, Звенигород |
Скрипты
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.
Так как интерфейсы 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 можно назвать "каноническими" (общепризнанными).