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

События

6.2.3. <keybinding>, <keyset> и <key>

Теги <keybinding>, <keyset> и <key> используются для определения того, как отдельный XUL-документ будет обрабатывать нажатия клавиш. Эти теги используются более конкретно, чем XBL-связи. Тег <key> очень важен и поддерживает следующие атрибуты:

disabled keytext key keycode modifiers oncommand command

Если не принимать во внимание атрибут oncommand, тег <key> действует как простой тег для хранения данных без визуального отображения. Это специальный тег, так как Mozilla обрабатывает его содержимое особым образом. У каждого тега <key> должен быть атрибут id, так как именно через него другие теги обращаются к клавише.

Если значение атрибута disabled - true, тег <key> ничего не будет делать. keytext используется только с тегами <menuitem> и содержит строку, описывающую указанную комбинацию или клавишу. Это описание будет доступно пользователю.

Атрибут key содержит единственный печатаемый символ, соответствующий клавише. Если этот атрибут отсутствует, проверяется значение keycode - там содержится уже непечатаемый код клавиши с префиксом VK. В XUL такой код клавиши начинается с VK_, а не с DOM_VK_. key или keycode определяют ввод с клавиатуры, которому соответствует тег <key>.

Атрибут modifiers может быть списком из стандартных клавиш-модификаторов и кроссплатформенных клавиш быстрого доступа, разделенных между собой пробелами или запятыми:

shift alt meta control accel access

Если приложение должно быть кроссплатформенным, рекомендуется использовать accel. Модификатор access означает, что пользователь нажал специально определенную для данного тега клавишу доступа.

В атрибут oncommand можно поместить JavaScript-обработчик, который будет запускаться при нажатии клавиши. При использовании тега <key> значение этого атрибута немного меняется по сравнению с тем, что описано в "Команды" , "Команды". В случае <key> oncommand действительно запускается при нажатии на клавишу, как и можно было предположить.

<keyset> - тег-контейнер вроде <stringbundleset> или <broadcasterset>. У него нет собственных особых свойств. Используйте его при аккуратном оформлении набора из нескольких тегов <key>.

<keybinding> - ненастоящий XUL-тег. В chrome Mozilla некоторые определения клавиш хранятся в виде отдельных .xul-файлов. В качестве корневого тега в них используется не <window>, а <keybinding>. Это всего лишь удобное соглашение без особого значения. Такие связи для клавиш добавляются к другим XUL-файлам и никогда не отображаются в собственных окнах.

Чаще всего тег <key> ассоциируется с документами-формами, и вот почему. Если этот тег присутствует, при нажатии на соответствующую клавишу запустится ее обработчик oncommand, причем это произойдет независимо от того, где в окне документа находится указатель мыши. Правда, есть одно ограничение. В документе должен быть хотя бы один элемент формы, и у одного из элементов формы должен быть фокус. Это означает, что, по крайней мере, один из следующих тегов должен присутствовать и получить фокус, прежде чем нажатия клавиш начнут срабатывать:

<button> <radio> <checkbox> <textbox> <menulist>

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

Есть и другие XUL-теги и атрибуты, относящиеся к <key>. Атрибут accesskey, описываемый в "Формы и меню" , "Формы и меню", определяет клавишу доступа для отдельного тега. Тег <key> также тесно связан с тегом <menuitem> в выпадающих меню.

Следующие имена атрибутов используются для временного хранения данных в тегах <key>, но у них больше нет особого значения - если оно и было когда-то. Они перечислены здесь, так как время от времени встречаются в chrome Mozilla. Не стоит обращать на них внимания:

shift cancel xulkey charcode
6.2.4. XUL-атрибут accesskey

XUL предоставляет одну возможность для более комфортной работы пользователей с ограниченными физическими возможностями. Атрибут accesskey можно добавлять ко многим тегам, участвующим в создании форм и меню, в том числе <button> и <toolbarbutton>. Синтаксис этого атрибута такой же, как и у атрибута ; другими словами, в качестве его значения указывается печатаемый символ:

accesskey="K"

Нажатия клавиш, указанных в атрибутах accesskey, обрабатываются, только если включена система расширенного доступа. Она включается либо через специальное оборудование, подключенное к компьютеру, например, особые устройства ввода, либо по нажатию клавиши Alt. Эта система кратко описывается в "Навигация" , "Навигация", но подробно в курсе не рассматривается.

Про отдельные XUL-теги в нашей книге обычно говорится, поддерживают ли они атрибут accesskey. Некоторые теги предоставляют визуальную подсказку о том, какая клавиша доступа соответствует им; другие этого не делают.

6.2.5. Поиск по мере набора (опережающий поиск)

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

Поиск по мере набора начинается с нажатия на клавишу /. С этого момента все вводимые печатаемые символы "склеиваются" в одну строку. Эта строка ищется в тексте гиперссылок на текущей странице. Нажатие на Enter/Return приводит к переходу по текущей ссылке, соответствующей строке поиска. Это напоминает механизм поиска, использующийся в UNIX-программах вроде emacs.

Опережающий поиск влияет на состояние документа, например, он меняет текущий фокус. При этом могут возникнуть неожиданные эффекты, если навигация по документу перегружена скриптами.

Механизм поиска "собирает" нажатия клавиш во время фазы возврата при обработке DOM-событий. Чтобы предотвратить это, нужно вызвать для события preventDefault() после того, как ваш собственный обработчик нажатия клавиш завершился.

Поиск по мере набора дополняет опережающий поиск только по ссылкам. В этом случае поиск ведется только по тексту гиперссылок. Такой поиск запускается, если / не предшествует символам строки поиска или если вместо / нажать ?.

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