/*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: * https://github.com/tzuryby/jquery.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.2.0`, 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`], // default input types not to bind to unless bound directly textInputTypes: /textarea|input|select/i, options: { filterInputAcceptingElements: true, filterTextInputs: true, filterContentEditable: 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 && (jQuery.hotkeys.options.filterInputAcceptingElements && jQuery.hotkeys.textInputTypes.test(event.target.nodeName) || (jQuery.hotkeys.options.filterContentEditable && jQuery(event.target).attr(`contenteditable`)) || (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);