| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Наши скрипты > Работа с горячими клавишами. |
| Автор: Sardar 28.1.2005, 17:52 | ||||||
Часто стал этот вопрос подниматься, потому рассмотрим сию проблему поближе. Существует 3 вида работы с горячими клавишами, от простой к сложной:
В нормальных средах поддерживается только первый вариант + некоторые добавочные комбинации, будем называть его стандарным. То есть горячая клавиша начинается с нажатия ctrl. Исключения это клавишы Esc, F1-F12 и подобные; комбинации ctrl+shift, alt+shift, alt+ctrl - с исключениями работаем отдельно. Второй способ предпологает накопление нажатых клавишь, а по первому onkeyup выполнять комбинацию. Третий способ представляет собой иерархию буфферов для отлова всех возможных комбинаций, например по слову vingrad, что нибудь сделать. Это редко нужно, не используется в виндовых средах и сложно реализуемо. Например придётся отключать все браузерные горячие клавиши, что бы он не сбивал нас с комбинации. Реализация стандартных горячих клавишь. Задачу поставим так, при нажатой комбинации мы хотим что бы вызывалась наша функция, стандартная браузерная реакция, если она есть, отключается. Что бы отключить дефолтное действие браузера нужно для Оперы и Мозиллы поймать событие onkeypress, для ИЕ это onkeydown - что гораздо удобнее для второго способа. Заведём регистр, в корором регистрируются все запрашиваемые горячие клавиши, это будет обьект хешь-таблица, в которой ключём будет буква, а значением ссылка на функцию.
Обработчик есть, теперь надо отловить события. События можно ловить на всём окне, либо на конкретном обьекте, например в текстовом поле. Вот пример как отловить для всего окна:
Оперу 6'ых версий поддерживать не стоит, но если кто сумеет поднять горячие под ней, пусть запостит решение сюда. Как видим решение очень простое с минимальными напряжениями мозга Используем:
Горячие клавиши второго вида мы разберём попозже |
| Автор: Pena 5.9.2006, 01:57 |
| А что изменить чтобы работало сочитание "` + F1" F2, F3... |
| Автор: Sardar 5.9.2006, 10:53 |
| В 13'oй и 15'ой строке проверяеться совпадение комбинации, добавь ||key=код_Fx_клавишы, либо выносим все "исключения" в отдеьный список и там проверяем. |
| Автор: Pena 5.9.2006, 17:05 |
| Эм, из того что понял и сделал получилось: реакция на нажатие F1 (без сочетания с Ё (`)), но при этом всё такие пытается вылезти справка =( Как бы мне без всяких ctrl и schift+ctrl "забиндить" F1 + Ё |
| Автор: Sardar 5.9.2006, 22:33 |
| Pena, если returnValue=false; event.preventDefault() отработаны, то никаких справок не должно быть, выкладывай свой код. |
| Автор: Pena 7.9.2006, 17:33 | ||||
| То что имею на сейчас =\ (ctrl + 1,2,3..., и просто F1) Это вставляю на старнице:
А это отдельнo:
|
| Автор: Sardar 10.9.2006, 23:03 |
| Проверил, твой код работает в ИЕ, мозилле, опере, но в ИЕ и Опере хелп показываеться по любому. Пробовал присвоить evt.keyCode = 0, всё равно не хочет. В мозилле естественно всё хорошо. |
| Автор: Pena 23.9.2006, 18:25 |
| А ежели мне надо кнопки к примеру F1 - F4 забиндить, что именно нужно "копировать-вставить"? =) |
| Автор: Sardar 23.9.2006, 18:58 | ||
| Ничего, серьёзно, я бы рад вообще отклкючить F1(никогда не использую), т.к. стоит рядом с Esc (vim, транслит etc). Остальные Fn должны быть перехватываемы, задай их коды и всё.
|
| Автор: Diddy 8.4.2008, 11:06 |
| Sardar, афтар, спасиба, писшы исчо! особенно хочу про ловлю цепочек, последовательностей нажатий!!! |
| Автор: Kinjeiro 3.7.2009, 13:09 | ||||
Доброго дня
Мне кажется, в данном примере не учитывается нажатие CAPS LOCK.
Для чего Вы вешаете в IE обработчик именно на keydown? KeyCode в событии keyDown возврашает номер клавиатурной клавишу, но не реального символа. При работе с разнообразными локалями очень часть требуется получить именно реальный UniCode код (учитывающий и особенности локали, и case censetive) для правильной интерпритации введенного символа. К примеру, во француской локале нажатие клавиатурной клавиши, на которой изображена цифра "2", без нажатия каких либо шифтов или альтов подразумеваете получение символа "é". Однако в keydown keyCode = 50, вместо правильного 233, который отображается лишь в keyCode события keypress) |
| Автор: dandandan 22.11.2009, 22:16 |
| Какой код нужно добавить, чтобы отловить комбинацию ctrl + enter ? |