Pull to refresh

jQuery.keyboard v0.2.0

Reading time 4 min
Views 5.6K

Снова приветствую Хабрасообщество. Недельку назад я выкладывал свою либу 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+key3key4 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 (ebind) {}) по 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. Принимаются пожелания и предложения

Ссылки

Проект на гуглокоде

Демо
Tags:
Hubs:
+63
Comments 59
Comments Comments 59

Articles