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

XBL-связки

15.5. Скриптинг

Для JavaScript граничный тег выглядит как обычный объект DOM. Скрипты, выполняемые вне граничного тега, могут воздействовать на его DOM-объект обычными способами:

Свойства могут вызываться как методы, или присваиваться, или быть прочитаны.

Свойства могут быть добавлены или установлены в null. Свойства, содержащие методы (объекты Function ), могут быть изменены определенными нами методами.

Обработчики событий, загруженные с помощью стилевого атрибута on..., или с помощью DOM 2 метода addEventListener(), могут заменить собой обработчики связки.

Интерфейсы DOM 1 могут модифицировать атрибуты граничного тега.

Интерфейсы DOM 1 могут модифицировать финальный объединенный контент граничного тега.

Ни одно из этих действий не затрагивает XBL документ связки для граничного тега.

Программисту XBL связки следует в первую очередь обратить внимание на время загрузки связки. Общего способа определить, закончился ли процесс загрузки связки, нет. Единственный способ удостовериться в этом - использовать обработчик onload документа, к которому принадлежит данный тег, и избегать шаблонов с отложенной ("ленивой") загрузкой (lazy-loading templates). Если вы используете целиком вручную написанные связки, снабдите их некоторым сигналом, что загрузка окончена.

Другой важный аспект скриптования граничного тега имеет дело с обработкой событий. Это материя обычных DOM событий и конкретного состояния фокуса ввода.

Обычно события DOM распространяются вглубь финального объединенного контента граничного тега, как если бы это был обычный XUL-тег. С точки зрения специалиста по прикладному программированию, граничный тег - единственный видимый элемент и последний шаг в фазе захвата события. А с точки зрения создателя связки, активную роль играет контент граничного тега. Здесь событие продолжает распространяться вглубь связки и может быть доступно с помощью объекта event. Свойство event.originalTarget этого объекта очень часто используется в связке; (в версии 1.4 свойство event.target еще не надежно).

Если, однако, граничный тег не является частью фокусного кольца данного окна (как, например, тег XUL <box> ), часть объединяемого контента все еще может получить событие. В частности, если объединяемый контент содержит теги, являющиеся кандидатами в фокусное кольцо (как <checkbox> или <button> ), эти теги могут получить фокус клавишей tab. Здесь работает следующий принцип:

Если тег может быть способен получить фокус, а его родительский тег - нет, то пусть он его получит.

Система связок XBL не имеет интерфейса для "обновления" или "перестройки", которым можно было бы обновить граничный тег. Граничный тег может только целиком получить или потерять связку. Существует два способа сделать это.

Первый путь - изменить связку граничного тега: модифицировать свойство стиля -mozbinding скриптом. Самая очевидная возможность сделать это - присвоить данному свойству специальное значение none или убрать это значение. К сожалению, ошибки в Mozilla делают этот путь ненадежным. Рекомендуемая альтернатива - создать два стилевых класса:

.binding-installed { -moz-binding : url("test.xml#Test"); }
.binding-removed { -moz-binding : none; }

Вместо того чтобы указывать значение самому свойству -moz-binding, присвойте атрибуту класса граничного тега одно из этих двух значений. Это работает корректно.

Второй путь изменить связку граничного тега - использовать специальный интерфейс XPCOM. Этот интерфейс

nsIDOMDocumentXBL

Он всегда доступен для объекта документа. В Таблице 15.3 перечислены методы этого интерфейса.

Таблица 15.3. Интерфейс nsIDOMDocumentXBL
Возвращает Сигнатура метода
void addBinding(nsIDOMElement element, String URL)
void removeBinding(nsIDOMElement element, String URL)
nsIDocument loadBindingDocument(String URL)
nsIDomElement getBindingParent(nsIDOMNode node)
nsIDOMNodeList getAnonymousNodes(nsIDOMElement element)
nsIDOMElement getAnonymousElementByAttribute(nsIDOMElement element, String attribute, String value)

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

Метод loadBindingDocument() загружает (синхронизируя процесс) XBL-документ с указанным URL в дерево DOM, которое является возвращаемым значением. Этот метод можно использовать для исследования структуры связки. Это полезно при создании таких инструментов, как дизайнеры и инспекторы DOM. Это также способ изменения связки с синхронизацией процесса - то есть изменения связки так, что выполняемый скрипт тормозится до тех пор, пока новая связка не окажется полностью на своем месте.

Оставшиеся два метода - XBL-вариации метода document.getElementById(). Вместо того, чтобы возвращать объекты тега из дерева DOM документа, они возвращают объекты тега из анонимного контента XBL-связки. Это единственная часть спецификации XBL-связки, доступная из скрипта. В обоих методах передаваемый элемент DOM - объект DOM граничного тега.

getAnonymousNodes() возвращает объект, содержащий все непосредственные дочерние теги тега <content> связки. Число дочерних тегов равно свойству length возвращаемого объекта, и они доступны методом item() возвращаемого объекта, то есть номеру индекса.

getAnonymousElementByAttribute() возвращает единичный тег из набора тегов внутри тега <content> связки.

Возвращаемый тег имеет атрибут name и атрибут value, указанные в вызове метода.

Последний метод решает проблему, возникающую при слиянии анонимного и эксплицитного контентов. Перед слиянием теги анонимного контента находятся в некотором порядке. После слияния относительные позиции этих тегов могут быть различны, это зависит от эксплицитного контента. Данный метод позволяет обнаружить теги анонимного контента независимо от их настоящей позиции. Тег должен иметь уникальную пару атрибут-значение, по которой его можно обнаружить. Для этой цели используется атрибут с именем anonid. Указываемый DOM-элемент должен принадлежать граничному тегу.

Вторая проблема, решаемая этим тегом, возникает при использовании тем. Тема может содержать не только стилевую информацию; скины темы могут содержать скрипты. Эти скрипты могут модифицировать контент данного виджета так, чтобы он соответствовал общему облику темы. getAnonymousElementByAttribute() позволяет скинам со скриптами работать в существующей связке или в связке, им же и модифицируемой.

Система XPCOM имеет два компонента, имеющих отношение к XBL:

@mozilla.org/xbl;1 @mozilla.org/xbl/binding-manager;1

Ни один из них не имеет интерфейсов, пригодных для использования в прикладных скриптах.

15.6. Стилевые опции

Расширение -moz-binding стилей CSS2 - единственная стилевая опция XBL. Об этом рассказано в разделе "Граничные теги и -moz-binding ".

Каждая создаваемая связка должна иметь собственную стилевую таблицу, так, чтобы виджет мог поддерживать многие темы и скины. Эта таблица указывается в секции <resources> кода связки.