Обработка горячих клавиш при помощи javascript

    Захотелось мне в своем проекте использовать горячие клавиши для управления содержимым. Нажал esc — закрылось диалоговое окно, ctrl+left — открылся следующий раздел… Порылся в гуглях-яндексах и, не найдя идеала, решил написать свое решение.
    Теперь оно у меня есть — маленькое, легкое, независимое от от других библиотек.
    Мне достаточно подключить javascript-файл и написать
    $e('ctrl esc').bind("alert('Ыыы');");

    Готовый javascript можно взять здесь.
    UPD Улучшен код. Спасибо, Yeah, aubt.

    Подробнее о возможностях


    Функция $e()


    $e(param0 [[, param1 [, param2… ] ] )
    Функция принимает список горячих клавиш (независимые от регистра, через пробелы или "+"), на которые вы хотите повесить действие.
    Понимает: alt, shift, ctrl, meta, esc, enter, up, down, left, right, tab, space, pageup, pagedown, home, end, буквы латинского алфавита (a-zA-Z), цифры (0-9), символьные коды (10-128);
    Кроме того, есть специальные слова keyup, keydown, keypress, которые указывают на какое действие реагировать (по-умолчанию — keyup).
    Необходимо помнить, что браузеры могут вызывать или не вызывать события в зависимости от его типа.
    Возвращает контекст.

    Примеры:
    $e('esc')
    $e('keyup Ctrl+left', 'meta left keyup')



    Функция .bind()


    .bind(param)
    Пинимает функцию или javascript, который назначится сочетанию клавиш, переданным функцией $e().

    Примеры:
    $e('esc').bind('alert("!")')
    $e('keyup Ctrl+left', 'meta left keyup').bind(do_foo)



    Функция .unbind()


    .unbind([param])
    Отвязывает действие от сочетания клавиш, переданного функцией $e().
    Если параметр пустой, то от этого сочетания отвяжутся все действия.

    Пример:
    $e('esc', 'keyup Ctrl+left', 'meta left keyup').unbind()


    Функция $e.start()


    Запускает прослушивание клавиш.
    Послушивание также включается само, при использовании функции .bind().

    Функция $e.stop()


    Останавливает прослушивание клавиш.

    * This source code was highlighted with Source Code Highlighter.

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

      +3
      А нельзя ли (китайский) код:
      for (i in key) {
      if (key[i] == «ctrl») {
      res.ctrl = 1;
      } else if (key[i] == «alt») {
      res.alt = 1;
      } else if (key[i] == «shift») {
      res.shift = 1;
      } else if (key[i] == «meta») {
      res.meta = 1;

      заменить на:
      var keys = {'alt':1, 'shift':1, 'meta':1};
      for (i in key) {
      res[key[i]] = keys[key[i]];

      ???

      И поправьте ошибки: клавиш(Ь) и .bind при описании .unbind.
        0
        ошибки исправил, спасибо.
        по поводу исправления кода — не согласен что это будет верно. так объект res будет содержать ненужных членов.
          +1
          я бы, все же, сделал массивы модификаторов («ctrl», «shift»…) и кнопок («down»: 40, «up»: 38, …) и пробегался по ним циклами, а затем отдельно проверка на буквы/числа. уж больно этот код глаз режет :)

          кстати, насчет последней проверки:
          if ((key[i].length == 2 || key[i].length == 3) && key[i].match(/[0-9]{2,3}/))
          это зачем? «shift+23» как нажать?

          ps: и, если уж заботиться об оптимизации, наверное, лучше написать так:
          if ((key[i].length == 2 || key[i].length == 3) && !isNaN(key[i]*1))
          хотя, это мелочи, конечно :)
            0
            спасибо, так я и сделаю, крутилось в голове что-то, а Вы все по полочкам положили )

            shift+23 конечно сложно нажать, зато можно shift+37 или shift+109 можно. я не делал расшифровку например F1, символа у нее нет, прийдется кейкод писать

            и Ваш вариант без регулярки мне нравится )
              0
              >shift+23 конечно сложно нажать
              либо лыжи не едут, либо я не внимательно читал Ваш код :)
              на моей и большинстве других клавиатур нажать shift+23 невозможно, по той причине, что нет клавиши «23», отсюда и возник мой вопрос.

              если (еще раз, простите за невнимательность) Ваш код при указании правила «shift+23» сбработает при нажатии «shift+2+3», по-моему, это некорректное поведение — он сработать не должен.
                +1
                >я не делал расшифровку например F1
                ой…
                <habr-sql>delete from comments where id = 1971098;</habr-sql>
                  0
                  млин, народ, челоек полезную фичу сделал, а вы в код лезете :/
                    0
                    в данном случае код — часть статьи.
                    решение, предлагаемое автором, не является «standalone», т.е. прямым его применением может быть только включение в свой проект. согласитесь, код, включаемый в проект нужно подвергать хотя бы беглому обзору, если это не .net или другие общеиспользуемые библиотеки.

                    кроме того, критика по-моему, достаточно конструктивная, разве нет?
                      0
                      да-да, спасибо за критику ) это помогает делать мир лучше )
                –3
                > я не делал расшифровку например F1

                Вот в этом направлении и следует далее работать.
          –4
          Неспособность пользоватся гуглом иногда поражает.

          code.google.com/p/js-hotkeys/

          Демо работы: jshotkeys.googlepages.com/test-static-01.html
            +2
            спасибо, но смею заметить, что это плагин к jQuery. Если его он не используется, то…

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое