hajime/public/assets/js/ldt/Keybinder.js
2023-08-12 00:16:32 +02:00

86 lines
2 KiB
JavaScript

/* Keybinder.js
* written by Colin Kuebler 2012
* Part of LDT, dual licensed under GPLv3 and MIT
* Simplifies the creation of keybindings on any element
*/
var Keybinder = {
bind: function( element, keymap ){
element.keymap = keymap;
var keyNames = {
8: "Backspace",
9: "Tab",
13: "Enter",
16: "Shift",
17: "Ctrl",
18: "Alt",
19: "Pause",
20: "CapsLk",
27: "Esc",
33: "PgUp",
34: "PgDn",
35: "End",
36: "Home",
37: "Left",
38: "Up",
39: "Right",
40: "Down",
45: "Insert",
46: "Delete",
112: "F1",
113: "F2",
114: "F3",
115: "F4",
116: "F5",
117: "F6",
118: "F7",
119: "F8",
120: "F9",
121: "F10",
122: "F11",
123: "F12",
145: "ScrLk" };
var keyEventNormalizer = function(e){
// get the event object and start constructing a query
var e = e || window.event;
var query = "";
// add in prefixes for each key modifier
e.shiftKey && (query += "Shift-");
e.ctrlKey && (query += "Ctrl-");
e.altKey && (query += "Alt-");
e.metaKey && (query += "Meta-");
// determine the key code
var key = e.which || e.keyCode || e.charCode;
// if we have a name for it, use it
if( keyNames[key] )
query += keyNames[key];
// otherwise turn it into a string
else
query += String.fromCharCode(key).toUpperCase();
/* DEBUG */
//console.log("keyEvent: "+query);
// try to run the keybinding, cancel the event if it returns true
if( element.keymap[query] && element.keymap[query]() ){
e.preventDefault && e.preventDefault();
e.stopPropagation && e.stopPropagation();
return false;
}
return true;
};
// capture onkeydown and onkeypress events to capture repeating key events
// maintain a boolean so we only fire once per character
var fireOnKeyPress = true;
element.onkeydown = function(e){
fireOnKeyPress = false;
return keyEventNormalizer(e);
};
element.onkeypress = function(e){
if( fireOnKeyPress )
return keyEventNormalizer(e);
fireOnKeyPress = true;
return true;
};
}
}