Как стать автором
Обновить

Комментарии 82

ссылка на демо не работает
прошу прощения, дал локальную ссылку. fixed
Вроде опять демо не работает :(
Есть такая хорошая библиотека как: Handling Keyboard Shortcuts, для подключения клавиатурных сокращений. И там вроде проблем с нажатием нескольких кнопок нет.
Посмотрите, может поможет в решении
да, серьёзно. уверен, там можно почерпнуть пару идей.
Нашёл, в чём их ньюанс. Такое работать не будет:
shortcut.add("B+N", function () { alert(1) });
У них работает соединение только с клавишами ctrl, alt, shift и meta (с ними сделать действительно легко в силу того, что это предусмотренно самим JS). Но библиотеку всё-равно будет интересно поизучать
Ctrl+Enter (и подобные с Ctrl) — это обычно спорная комбинация.
Пользователям макинтоша будет неудобно пользоваться ей, там клавишу Ctrl заменяет клавиша ⌘ (Аналогична клавише «Win» на стандартных клавиатурах).
Например, вот так выполняются стандартные опции правки:
Копировать: ⌘+C
Вставить: ⌘+V
и т.д.

Конечно заморачиватся будут те, у кого либо проект имеет тематику MacOS, либо держатся обоими руками за кроссплатформенность.

Обычно, конечно, останавливаются на варианте в пользу большинства — т.е. на комбинациях с Ctrl или общей заменой на клавишу Alt.
в моих проектах будут совершенно не эти комбинации клавиш.
например, консольный форум. Сейчас там это реализовано через одно место.
Ctrl+enter — был просто как пример, один из самых частоиспользуемых.
всегда ⌘ приравнивал к виндовской alt.
А вообще не встречал проектов, где не работает ctrl. Все такие кросстлапформенные? Я просто не исследовал этот вопрос.
Command в маке определяется как meta. event.сtrlKey||event.metaKey в большинстве случаев решают проблему
полезная вещь. Может существенно увеличить возможности если правильно применить.
Только вот я назвал бы не keyboard, а readkey или типа того…
спасибо.
я долго думал над названием. И «listen», и «bind» думал куда-то прилепить, но решил, что keyboard — вполне очевидно и логично.
в любом случае, переименовывать уже поздно =)
у вас третий параметр по умолчанию false? мне кажется, лучше true.
(аргументы привести не могу, пятой точкой чувствую)
сначала так и было. но вот допустим, игра. на клавише «стрелка вверх» — бег, на клавише «стрелка вправо» — стрейф вправо, а на клавише «ctrl» — выстрел. При параметре «фолс» не получится одновременно бежать, стрейфится и стрелять, а только что-то одно
Может быть глобальный параметр?
Ведь игра — это частный случай, я тоже считаю, что лучше true по умолчанию!
думаю, можно сделать настройку библиотеки по примеру ajaxSetup
Нажмите сочетание клавишу 5: нажимаю на цифру пять выше букв — работает, справа на клавиатуре — не работает.
да, num-pad — имеет другие коды. не знаю, правильно ли будет использовать те же текстовые ключи, что и для верхних чисел.
Вы когда вводите пароли с числами — для системы имеет значения, ввели вы число с верхней части или с цифровой.
это утверждение, или риторический вопрос? если вопрос, то, насколько я знаю, значения не имеет. но, опять же, на примере с игрой, восьмёрка на цифровой панели может использоваться в качестве «движения вперед», а восьмёрка над буквами — подходит для этого намного меньше.
Извините, это был вопрос. Спасибо за ответ.
Тогда вопрос использования сочетаний с цифрами — должен зависеть от текущей ситуации, например той, что вы представили.
наверное, надо будет реализовать группировку, например:
$obj.keyboard('1, np1'func);
в данном случае видимо речь идет именно о скэн-кодах
это смотря куда вводить)) есть программы для которых имеет.
Имхо когда используется буквенное название клавиш — группировать. Когда явно используются коды клавиш — не группировать. Мне кажется, это вполне очевидный выбор.
Если в Файерфоксе включён пункт Tools → Options → Advanced → General → Accessibility → Search for text when I start typing, тогда нажатие клавиш «x», «c», «v» не только регистрируется джаваскриптом, но и (прежде всего) используется для поиска текста на странице (см. также баг 215024).

Быть может, jQuery.keyboard следовало бы вызывать event.preventDefault() на уровне document, чтобы уничтожать события клавиатуры и тем предотвратить такое поведение? Подобным образом поступает GMail, например.
мне кажется, достаточно будет даже return false в конце функции, но за event.preventDefault() — спасибо.
Подозреваю, что если return false в конце слушателя события, то оно эдак может не всплыть даже к родительскому элементу. Что вызовет какие-нибудь неприятности, если одно и то же событие обрабатывается и в некотором элементе (например, textarea), и в окаймляющем его родительском элементе (например, form). Лучше убивать событие на уровне document (когда оно проплыло снизу вверх по всем родительским элементам из точки возникновения события), просто чтобы не пустить его ещё выше (т. е. во браузер). Причём, возможно, убивать только в том случае, когда соответствующая клавиша задействована в каких-нибудь комбинациях (было бы неразумно убивать, например, Ctrl+Ins и Ctrl+Del, если на странице они не переопределены).
думаю, можно, сделать зависимо от возвращаемого функцией значение. например, если функция возвращает false, то вызывать event.preventDefault()
Если нажать в demo:
ctrl+alt -> «ctrl+alt»
не отпуская их нажать 5 -> «5, ctrl+alt»
отпустить все клавиши -> «ctrl+alt»

Конечно ситуация маловероятная, но по крайне мере событие при отпускании клавиш не должно срабатывать.
ну, я думаю, это вполне логично решение. допустим, «ктрл-ентер» делает отступ к началу следующей страницы (как в Ворде, емнип). Я хочу пропустить несколько страниц — зажимаю ктрл и, несколько раз, ентер. Ну это грубый пример, конечно. Или, в той же игрушке, «ктрл» — выстрел, а «альт-ктрл» — альтернативный выстрел. Я держу зажатым «альт» и нажимаю время от времени «ктрл».
И тем не менее, если в настройках Quake II сказано:
bind F6 "echo Quick Saving...; wait; save quick"
bind MOUSE2 "+moveup"
то при нажатии F6 сохранение происходит (один раз), но если нажатый F6 не отпускать, то дальнейшее жмякание правой кнопкою мыши вызывает простое подпрыгивание персонажа, без повторного сохранения игры.

По той же логике и jQuery.keyboard, если при нажатом Ctrl+Alt тыкать 5, вероятно, не должен воспринимать это как повторное срабатывание Ctrl+Alt.

Хотя, наверное, включение этой логики как раз и определяется состоянием параметра single.
Если у обоих single ни то, ни другое не сработает, а если не у обоих, то тогда будет не как в quake2 :)
Кстати необязательно 5, любое действие клавиатуры.
нууу, я и не ставил за цель, сделать, как в quake2 =))
Не видел игр, где отпускание клавиши инициирует тоже событие, что и при нажатии.
Пример при зажатом ctrl и последовательном нажимании клавиши enter(т.к. это условия одной комбаниции), не тоже самое, что повторный вызов нажатия зажатой комбинации при любом событии от клавы, + к этому ещё добавляется вызов зажатой комбинации при её отпускании(и вот это точно не должно происходить).
не знаю, как в аське, но у меня в PSI так:
при нажатии на enter — отправляется новое сообщение
при нажатии на ctrl-enter — переход на новую строку
при нажатии на alt-enter или ctrl-alt-enter не происходит ничего

точно такую же функциональность можно реализовать у меня, передав в качестве третьего параметра single — true.
ой, от недостатка сна (да-да, сегодня всю ночь я писал этот плагин), запутался в ветках, извините.

alkhankhel, вообще да, я этого и не скрывал — под заголовком у меня явно указано на этот недостаток. я подумаю, как правильно его исправить.
А у меня при нажатии x+c+v события не регистрируются, просто вводится текст в форму. Ubuntu 9.04/Firefox 3.0
kUbuntu 9.10/Firefox 3.5, работает нормально.
может, какой-то плагин? или, попробуйте обновить и еще раз повторить попытку.
Даже не знаю. Отключил Vimperator и AllItsText — заработало. AllItsText совсем удалил, а Vimperator включил обратно — всё равно работает. Ещё Noscript, но ваш сайт у меня в разрешённых.
сtrl+Enter у вас так же срабатывает как и enter+ctrl, тоже самое и с другими комбинациями x+c+v или v+c+x.
проверил на хабре комбинацию alt+shift+r и shift+alt+r, тоже работает :)
Знаком + обычно обозначают единовременное нажатие клавиш, причём тут последовательность их зажатия.
в некоторых ситуациях должна быть строгая последовательность. Например, в аське на enter идет отправка сообщения, а на ctrl+enter переход строки.
Ну такое можно реализовать, но отдельно :)
не знаю, как в аське, но у меня в PSI так:
при нажатии на enter — отправляется новое сообщение
при нажатии на ctrl-enter — переход на новую строку
при нажатии на alt-enter или ctrl-alt-enter не происходит ничего

точно такую же функциональность можно реализовать у меня, передав в качестве третьего параметра single — true.
Free Image Hosting at FunkyIMG.com
на самом деле — не знал про этот плагин. и не особо хотел искать. интересно было написать лично. тем, более, возможно, понадобится более расширенные возможности.
я, кстати, проглянул код (не проверял на практике, правда, потому не уверен, но):
1. я не увидел там работы с ctrl, shift, alt, meta. ни в примерах, ни в коде. подозреваю, что их использовать нельзя
2. в отличии от моей либы — там копируется в каждом объекте весь функционал. подозреваю, это может стать причиной утечки памяти. у меня весь функционал вынесен в отдельное место, а в объекте — только контейнеры и вызов.
3. не вижу, чтобы там был функционал, реализуемый у меня с помощью параметра single. тогда, в каком режиме там обрабатываются нажатия?
code.google.com/p/js-hotkeys/ отличный плагин… не помню чтобы имел с ним проблем
как на счёт аналога Single, и возможности соединять, например, разные буквы? Не подумайте, что я ищу к чему придраться — это действительно важно для меня.
single там просто не нужен… если указано «a» то событие будет вызвано только при нажатии а… если «ctrl+a» то при контроль+а…
поддерживаются все естественные сочетания, можно юзать название

в итоге можно повесить «ctrl+alt+backspace»

jshotkeys.googlepages.com/test-static-01.html — вот пример всех сочетаний
и еще имхо еще я бы Ваш параметр single назвал как минимум strict — он более описывает его суть
согласен. название strict — мне нравится. ато я никак не мог придумать, как можно назвать
что-то alt-комбинации не ловятся.

single там просто не нужен… если указано «a» то событие будет вызвано только при нажатии а… если «ctrl+a» то при контроль+а…

Вот как раз поэтому этот параметр и нужен. Мне необходимо, чтобы несмотря на то, что зажаты другие клавиши отрабатывались все комбинации(я приводил примеры с игрой в топике)
Более наглядно будет если указывать сочетания клавиш через +, например $('form').keyboard('Ctrl+Enter', function() {});, а если надо разные сочетания обработать в одной функции, можно их через запятую перечислить.
сначала так и сделал, но потом — поменял. мне все-же кажется, что человеку привычнее читать и писать через пробел (тем более, не надо нажимать шифт)), плюс знак "+" тоже, возможно, будет использоватся в качестве названия клавиши. Например, «ctrl shift +»
И, все же. мне кажется, что когда идёт сплошной поток символов — тяжелее читать.
Программирование это не урок печати, шифт и так часто нажимается. Первое что я подумал, что это обработка любой клавиши, нажимал тупо xxx и ничего не происходило, а оказывается надо было нажать x+c+v.

Плюс скорее всего не будет использоваться, ведь его надо с шифтом нажимать, поэтому сочетание будет Ctrl+Shift+=, ну или если очень хочется, можно записать как Ctrl++ (что то же самое по сути).

Просто везде пишут именно так, через знак «плюс», поэтому это более привычная форма.
плюс есть на панели справа, я говорил о нём=)
согласен, форма более привычная. думаю, можно. конечно, добавить как алиас, но тогда знак плюса уже будет недоступен.
Если правильно подойти к проблеме, то будет доступен. Алгоритм такой, если знак + встречается в середине текста, то это разделитель, а а не знак. Два подряд знака + означает что первый разделитель, а второй — знак.
«ctrl+++alt» — достаточно… мм… специфично выглядит.
Так никто не пишет, скорее всего будет записано Ctrl+Alt++, или Ctrl+Alt+=, или Ctrl+Alt+Shift+=, что нереально просто, ибо набрать такое сложно.
Скажите, что в функцию передается?
ничего. в функции можно использовать this, который ссылается на текущий объект jQuery. возможно, имеет смысл передавать объект event первым параметром?
>>возможно, имеет смысл передавать объект event первым параметром?
я на этот ответ и расчитывал.
Думаю так будет верно.
5 на цифровой клавиатуре не ловится.
Так и должно быть?
Может, стоит подумать о вариантах?
Не, я имею ввиду что просто кнока 5 на обычной клавиатуре ловится вашим скриптом, а на цифровой (справа) – не ловится.
не срабатывает:

1. Ctrl+Alt != Alt+Ctrl?.. Почему? По нажатию Alt+Ctrl ничего не происходит.

2. Левый Ctrl + Alt != Правый Ctrl + Alt?
странно. у меня что в Фоксе, что в Опере что первое, что второе — работает =)
Большое спасибо!
Давно хотел реализовать сохранение по Ctrl+S, но руки не доходили найти подходящие мануалы, а тут все так очевидно.
Забавный баг (Firefox 3.5.5, Windows 7)

1. Открыть freecr.ru/jquery.keyboard/
2. Открыть ещё 4 вкладки.
3. Нажать Ctrl+5 (FireFox переключится в пятую вкладку).
4. Вернуться на страницу демо.
5. Теперь нажатие любой клавиши будет вызывать событие, повешенное на «5». Если нажать на «5», это безобразие прекращается.
Спасибо за плагин. Небольшое замечание. В JQuery принято аргумент-функцию передавать последней, даже когда есть необязательные аргументы (например, обратите внимание на метод $.post). То есть, по-хорошему, Вам нужно переписать Ваш плагин так, чтобы он понимал как такой синтаксис вызова keyboard('keys', function(){}), так и такой keyboard('keys', flag, function(){})
согласен, наверное, так и сделаю. =)
Недавно сталкивался с необходимостью обработки нажатий. В проекте используется jQuery. Искал плагины. Но в итоге решил воспользоваться стандартными средствами jQuery (http://docs.jquery.com/Events/keypress). Ибо подгрузка дополнительных библиотек дело все же сомнительное, т.к. их и так уже много используется. Конечно есть оптимизаторы и слияние в единый зазипованый файлик, но в живом проекте всегда приходится что-то править и дописывать. Каждый раз сливать JS-ы не всегда удобно. Понятно, что есть функции, которых в стандартном keypress не хватит, но для стандартных задач, мне кажется вполне достаточно.
В демке нажимаем CTRL-ALT и начинаем активно плясать на клавиатуре. ))
И экшн на событии CTRL-A буджет вызываться постоянно.
об этом описано в топике
Как у вашего плагина обстоят дела с регистрацией нажатий в русской раскладке?
так же, как и везде. насколько я понимаю, в фоксе в Линуксе без соответсвующего плагин работать не будет. Но я еще попроверяю =)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории