parent
f75a81aa34
commit
9a213fa0d2
@ -0,0 +1,206 @@ |
||||
/*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]]) { |
||||
// NOTE: Seem to need this when running in PyQt.
|
||||
event.preventDefault() ; |
||||
return origHandler.apply(this, arguments); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
jQuery.each(["keydown", "keyup", "keypress"], function() { |
||||
jQuery.event.special[this] = { |
||||
add: keyHandler |
||||
}; |
||||
}); |
||||
|
||||
})(jQuery || this.jQuery || window.jQuery); |
Loading…
Reference in new issue