Skip to content
Snippets Groups Projects
jquery.hotkeys.js 4.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • Laura Cappelli's avatar
    Laura Cappelli committed
    /*jslint browser: true*/
    /*jslint jquery: true*/
    
    /*
     * jQuery Hotkeys Plugin
     * Copyright 2010, John Resig
     * Dual licensed under the MIT or GPL Version 2 licenses.
     *
     * Based upon the plugin by Tzury Bar Yochay:
     * http://github.com/tzuryby/hotkeys
     *
     * Original idea by:
     * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
     */
    
    /*
     * One small change is: now keys are passed by object { keys: '...' }
     * Might be useful, when you want to pass some other data to your handler
     */
    
    (function(jQuery) {
    
      jQuery.hotkeys = {
        version: "0.8",
    
        specialKeys: {
          8: "backspace",
          9: "tab",
          10: "return",
          13: "return",
          16: "shift",
          17: "ctrl",
          18: "alt",
          19: "pause",
          20: "capslock",
          27: "esc",
          32: "space",
          33: "pageup",
          34: "pagedown",
          35: "end",
          36: "home",
          37: "left",
          38: "up",
          39: "right",
          40: "down",
          45: "insert",
          46: "del",
          59: ";",
          61: "=",
          96: "0",
          97: "1",
          98: "2",
          99: "3",
          100: "4",
          101: "5",
          102: "6",
          103: "7",
          104: "8",
          105: "9",
          106: "*",
          107: "+",
          109: "-",
          110: ".",
          111: "/",
          112: "f1",
          113: "f2",
          114: "f3",
          115: "f4",
          116: "f5",
          117: "f6",
          118: "f7",
          119: "f8",
          120: "f9",
          121: "f10",
          122: "f11",
          123: "f12",
          144: "numlock",
          145: "scroll",
          173: "-",
          186: ";",
          187: "=",
          188: ",",
          189: "-",
          190: ".",
          191: "/",
          192: "`",
          219: "[",
          220: "\\",
          221: "]",
          222: "'"
        },
    
        shiftNums: {
          "`": "~",
          "1": "!",
          "2": "@",
          "3": "#",
          "4": "$",
          "5": "%",
          "6": "^",
          "7": "&",
          "8": "*",
          "9": "(",
          "0": ")",
          "-": "_",
          "=": "+",
          ";": ": ",
          "'": "\"",
          ",": "<",
          ".": ">",
          "/": "?",
          "\\": "|"
        },
    
        // excludes: button, checkbox, file, hidden, image, password, radio, reset, search, submit, url
        textAcceptingInputTypes: [
          "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime",
          "datetime-local", "search", "color", "tel"],
    
        options: {
          filterTextInputs: true
        }
      };
    
      function keyHandler(handleObj) {
        if (typeof handleObj.data === "string") {
          handleObj.data = {
            keys: handleObj.data
          };
        }
    
        // Only care when a possible input has been specified
        if (!handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string") {
          return;
        }
    
        var origHandler = handleObj.handler,
          keys = handleObj.data.keys.toLowerCase().split(" ");
    
        handleObj.handler = function(event) {
          //      Don't fire in text-accepting inputs that we didn't directly bind to
          if (this !== event.target && (/textarea|select/i.test(event.target.nodeName) ||
              (jQuery.hotkeys.options.filterTextInputs &&
                jQuery.inArray(event.target.type, jQuery.hotkeys.textAcceptingInputTypes) > -1))) {
            return;
          }
    
          var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[event.which],
            character = String.fromCharCode(event.which).toLowerCase(),
            modif = "",
            possible = {};
    
          jQuery.each(["alt", "ctrl", "shift"], function(index, specialKey) {
    
            if (event[specialKey + 'Key'] && special !== specialKey) {
              modif += specialKey + '+';
            }
          });
    
          // metaKey is triggered off ctrlKey erronously
          if (event.metaKey && !event.ctrlKey && special !== "meta") {
            modif += "meta+";
          }
    
          if (event.metaKey && special !== "meta" && modif.indexOf("alt+ctrl+shift+") > -1) {
            modif = modif.replace("alt+ctrl+shift+", "hyper+");
          }
    
          if (special) {
            possible[modif + special] = true;
          }
          else {
            possible[modif + character] = true;
            possible[modif + jQuery.hotkeys.shiftNums[character]] = true;
    
            // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
            if (modif === "shift+") {
              possible[jQuery.hotkeys.shiftNums[character]] = true;
            }
          }
    
          for (var i = 0, l = keys.length; i < l; i++) {
            if (possible[keys[i]]) {
              return origHandler.apply(this, arguments);
            }
          }
        };
      }
    
      jQuery.each(["keydown", "keyup", "keypress"], function() {
        jQuery.event.special[this] = {
          add: keyHandler
        };
      });
    
    })(jQuery || this.jQuery || window.jQuery);