Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Работа с горячими клавишами.

Поиск:
Часто стал этот вопрос подниматься, потому рассмотрим сию проблему поближе. Существует 3 вида работы с горячими клавишами, от простой к сложной:
  • ловля всех ctrl+буква и ctrl+shift+буква
  • ловля любых комбинаций
  • ловля цепочек, последовательностей нажатий
В нормальных средах поддерживается только первый вариант + некоторые добавочные комбинации, будем называть его стандарным. То есть горячая клавиша начинается с нажатия ctrl. Исключения это клавишы Esc, F1-F12 и подобные; комбинации ctrl+shift, alt+shift, alt+ctrl - с исключениями работаем отдельно.

Второй способ предпологает накопление нажатых клавишь, а по первому onkeyup выполнять комбинацию.

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


Реализация стандартных горячих клавишь.

Задачу поставим так, при нажатой комбинации мы хотим что бы вызывалась наша функция, стандартная браузерная реакция, если она есть, отключается.

Что бы отключить дефолтное действие браузера нужно для Оперы и Мозиллы поймать событие onkeypress, для ИЕ это onkeydown - что гораздо удобнее для второго способа.

Заведём регистр, в корором регистрируются все запрашиваемые горячие клавиши, это будет обьект хешь-таблица, в которой ключём будет буква, а значением ссылка на функцию.

Код

//наш регистр
HotKeyHandler.keys = {};
//таблица преобразования для ИЕ, читай ниже
HotKeyHandler.convertIEKey={"1":65,"2":66,"4":68,"12":76,"16":80,"19":83,"20":84,"21":85,"26":90};
//обработчик горячих клавишь
function HotKeyHandler(ev) {
  var evt, key;
if(!(evt=window.event? window.event: ev)) return;
key = evt.keyCode? evt.keyCode: evt.charCode; //взяли код клавиши
       //ИЕ даёт код конрольных символов <32, преобразуем их к буквам
key=HotKeyHandler.convertIEKey[String(key)]? HotKeyHandler.convertIEKey[String(key)]: key;
   //если нажат ctrl или Esc - исключение из правил
   if (evt.ctrlKey||key==27) {
           //приводим ключ к верхему регистру, если нажат shift
    key=evt.shiftKey? String.fromCharCode(key).toUpperCase(): String.fromCharCode(key).toLowerCase();
           //зарегистрирован у нас такой обработчик?
    if(typeof(HotKeyHandler.keys[key]) == "function"){
       HotKeyHandler.keys[key](evt);
              //тогда отрубаем дефолтное действие браузера
    evt.cancelBubble = true; //отключить бег события выше для ИЕ
                  evt.returnValue = false; //отключить стандартное действие
                  //то же самое для Мозиллы
    if(evt.preventDefault) evt.preventDefault();
    if(evt.stopPropagation) evt.stopPropagation();
                  return false;
 }
   }
   return true;
}


Обработчик есть, теперь надо отловить события. События можно ловить на всём окне, либо на конкретном обьекте, например в текстовом поле. Вот пример как отловить для всего окна:
Код
//Default init. Handle hotkeys on document.
HotKeyHandler.windowInit=function() {
  //для Мозиллы и Оперы
  if(document.addEventListener && (getOperaVersion()>6||getOperaVersion()==0)) {
    document.addEventListener("keypress", HotKeyHandler, false);
  } else { //для ИЕ
    document.attachEvent("onkeydown", HotKeyHandler);
  }
}

function getOperaVersion() {
 var opver=navigator.userAgent.match(/Opera\s*([0-9.]+)/i);
 return (opver&&opver.length>1)? parseFloat(opver[1]): 0;
}

Оперу 6'ых версий поддерживать не стоит, но если кто сумеет поднять горячие под ней, пусть запостит решение сюда.

Как видим решение очень простое с минимальными напряжениями мозга :)
Используем:
Код
HotKeyHandler.keys = {
"a":function(){alert("Вы нажали ctrl+A");},
"B":function(){alert("Вы нажали ctrl+shift+B");},
"\x1B":function(){alert("Вы нажали клавишу Esc");}
};
HotKeyHandler.windowInit();

//жмём по клавишам =)


Горячие клавиши второго вида мы разберём попозже :)
Автор: Sardar
Сайт: http://






Просмотров: 4724

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную