
Снова приветствую Хабрасообщество. Недельку назад я выкладывал свою либу jQuery.keyboard. Там было несколько недостатков, нереализованных идей, да и огромное количество предложений и положительных отзывов побудили меня к быстрому написанию новой версии
Сразу хочу поблагодарить greedykid за поддержку и дебагинг. Если понравится вам либа, то ему тоже можно (и нужно) кинуть плюс.
В силу того, что баг с неправильными keyCode'ами оказался лично моей проблемой — я полностью переписал движок, что дало мне возможность сделать либу намного более функциональной и расширяемой. Также были пофиксены баги, обнаруженные в предыдущей версии. В этот раз, боюсь, фразой «По-моему, всё очень просто и очевидно» уже не отделаться, потому описываю многие возможности библиотеки (хотя вполне уверен, что что-то могу и забыть).
Тем не менее, что я считаю несомненным плюсом, она сохранила возможность остаться такой же простой, как и в прошлой версии
Примеры
$.keyboard('(letters)+(numbers)',
function (event) {
// event[0].keyCode — letterKeyCode
// event[1].keyCode — numberKeyCode
}
);
Инструкция
Итак, как повесить клавиатурное событие на объект. Кроме
$(obj).keyboard(/*args*/)
из предыдущей версии добавилась возможность вешать событие так: $.keyboard(/*args*/)
, что равносильно $(document).keyboard(/*args*/)
Аргументы
$.keyboard(object defaultConfig)
— задать настройки по-умолчанию для всего документа$.keyboard(string keys,[ object config,] function fn)
— повесить функцию к объекту на определённое нажатие клавиш$.keyboard(string keys)
— удалить функцию на определённое нажатие клавишkeys всё-еще могут быть массивом, но такой подход уже deprecated
Синтаксис keys:
Строка делится на неограниченное количество групп, разделяемых запятой:
«group1, group2, group3»
. Событие по очереди вешается на каждую из данных групп клавиш.Каждая группа имеет следующий синтаксис: индексы разделяются пробелом или плюсом. Если индексы разделены пробелом, значит порядок неважен. Если плюсом — порядок важен. Совмещать пробел и плюс в одной группе — нельзя:
«key1+key2+key3, key4 key5 key6»
Каждый из индексов может быть или названием определенной клавиши(смотреть Таблицу Индексов), или кодом возврата, Set'ом или Вариантами.Set(или набор клавиш) — это набор схожих по группе клавиш. На данный момент есть 8 наборов по-умолчанию. Также можно задавать промежутки, указывая начальный и последний индекс. Например, (a-k). Набор указывается в круглых скобках и означает любую из клавиш набора:
«key1+(a-c)+(numbers)»
.Вариант — похож на Set, собранный вручную прям в строке из Индексов и Set'ов. Он обрамляется в квадратные скобки и его части разделяются символом «|»:
«[shift|alt|(letters)]»
означает shift, или alt, или любую букву.Настройки плагина
Настройки плагина — объект, состоящий (на данный момент) из трёх свойств (вот их значения по умолчанию):
settings = {
strict : true,
event : 'keydown',
preventDefault : false
}
(Strict == true) — означает, что данная комбинация не сработает, если нажаты какие-то клавиши, кроме тех, что указаны в комбинации
(Event) — означает событие при котором будет произведено действие. На данный момент доступны «keydown» и «keyup», но если необходимо — я могу добавить еще.
(preventDefault) — означает вызов соответствующего метода event'a. Стоит учесть, что, afaik, все default-события происходят при событии keydown, потому найболее ожидаемо оно будет работать именно в этом случае
Функции
в функцию передается два аргумента:
func(events, bind)
. this ссылается на текущий jQuery-объектв events находится массив event'ов нажатых клавиш (только тех, что есть в запросе), то есть, например, при вызове
$.('(letters)+shift', function (e, bind) {})
по e[0].keyCode
можно узнать, какая именно буква была нажата. Bind содержит след информацию (фактически, вся информация врядли понадобится кроме bind.keys.group
— порядковый номер сработавшей группы. Например в $.keyboard('alt, shift')
при нажатии «alt»
bind.keys.group
будет равен 0):bind = {
cfg : {}, // массив настроек, с которыми был вызванна данная группа
func : function // фактически — ссылка на текущую (вызванную функцию)
keys : {} // информаця о пропасенной строке
}
Известные проблемы
1. Возможно, кое-где некорректно работает preventDefault (зависит от браузера?)
2. Нерешённая проблема с нулевыми keyCode'ами, которая, возможно, проявляется при неправильно настроенном драйвере клавиатуры, что, судя по статистике встречается крайне редко (пока обнаружено только у разработчика jQuery.keyboard). Кто знает что-нибудь о ней — приглашаем в топик
Разное
1. С терминологией я пока не определился, потому предлагайте свои варианты.
2. Возможны незначительные изменения интерфейса, но я приложу всех усилий, чтобы новые версии были обратно-совместимые с предыдущими (хотя-бы с помощью соответствующей настройки)
3. Это версия 0.2.0, то есть вторая Beta
4. Принимаются пожелания и предложения