Created
May 10, 2010 16:29
-
-
Save ta2edchimp/396238 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Kee'nput - a basic shortcut delegation module | |
| * (c) 2010 Andreas Windt aka. ta2edchimp, MIT Style License | |
| * demo temporarily at: http://jsbin.com/axisa3/3 | |
| * | |
| * Uses big portions of the basic Listener implementation | |
| * (c) 2010 Andrea Giammarchi, MIT Style License | |
| * see http://webreflection.blogspot.com/2010/05/event-driven-application-and-most-basic.html | |
| * ------------------------------------------------------------------------------------------ | |
| * USAGE: | |
| * | |
| * Keenput.addShortcut( shortcut, callback ); | |
| * > lets function 'callback' listen to 'shortcut', see "Shortcut(s)" for details. | |
| * | |
| * Keenput.removeShortcut( shortcut [, callback ]); | |
| * > removes function 'callback' from listening to 'shortcut'. | |
| * if not specified, nothing will listen to 'shortcut' anymore. | |
| * | |
| * Keenput.fireShortcut( shortcut ); | |
| * > simulates a 'shortcut'. | |
| * | |
| * Shortcut(s) | |
| * > an object of the following kind: | |
| * shortcut = { shift: true|false, | |
| * ctrl: true|false, | |
| * alt: true|false, | |
| * key: Keenput.KEY_* }; | |
| * 'shift', 'ctrl' and 'alt' are optional (default is false), | |
| * 'key' must be specified (can be any key-code), e.g. Keenput.KEY_T, Keenput.KEY_PAGE_UP etc. | |
| * | |
| * Keycode(s) | |
| * > the following key codes are predefined. i think they're self-explanatory: | |
| * KEY_[A-Z], KEY_[0-9], KEY_BACKSPACE, KEY_TAB, KEY_ENTER, KEY_PAUSE, KEY_CAPSLOCK, | |
| * KEY_ESCAPE, KEY_PAGE_[UP|DOWN], KEY_END, KEY_HOME, KEY_ARROW_[LEFT|UP|RIGHT|DOWN], | |
| * KEY_INSERT, KEY_DELETE, KEY_NUMPAD_[0-9], KEY_PLUS, KEY_MINUS, KEY_PERIOD, KEY_SLASH, | |
| * KEY_BACKSLASH, KEY_EQUALS, KEY_COMMA, KEY_F[1-12] | |
| * | |
| * Example | |
| * var test = function() { alert("shift+t is mine ;)"); }; | |
| * Keenput({ shift:true, key:Keenput.KEY_T }, test); | |
| * > lets function 'test' yell when the user hits shift + t | |
| * | |
| */ | |
| /**** ONLY FOR DEBUGGING ****/ | |
| if (typeof(console) == "undefined") | |
| var console = { debugString: "", log: function(s) { this.debugString += s + "\n"; } }; | |
| var Keenput = (function(){ | |
| /**** "private" properties ****/ | |
| var _SHIFT_DOWN = false, | |
| _CTRL_DOWN = false, | |
| _ALT_DOWN = false, | |
| _listeners = {}, | |
| // if not present, use Array.indexOf implementation by Andrea Giammarchi | |
| indexOf = Array.prototype.indexOf || function (callback) { | |
| for (var i = this.length; i-- && this[i] !== callback;) {} | |
| return i; | |
| }; | |
| /**** "private" methods ****/ | |
| function _get( key ) { | |
| return _listeners[key] || _set(key); | |
| } | |
| function _set( key, callback ) { | |
| if (!_listeners[key]) | |
| (_listeners[key] = []).indexOf = indexOf; | |
| if (!!callback && _listeners[key].indexOf(callback) == -1) | |
| _listeners[key].push(callback); | |
| return _listeners[key]; | |
| } | |
| function _remove( key, callback ) { | |
| var index; | |
| if (!_listeners[key]) | |
| return; | |
| if (!callback) | |
| (_listeners[key] = []).indexOf = indexOf; | |
| else if ((index = _listeners[key].indexOf(callback)) > -1) | |
| _listeners[key].splice(index, 1); | |
| } | |
| function _callShortcutCallbacks( shortcut ) { | |
| if (!shortcut || !shortcut.key || shortcut.key == 0) | |
| return false; | |
| shortcut.shift = shortcut.shift || false; | |
| shortcut.ctrl = shortcut.ctrl || false; | |
| shortcut.alt = shortcut.alt || false; | |
| console.log("Kee'nput :: fireing shortcut: \""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key+"\""); | |
| for(var callback = _get(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key), | |
| len = callback.length, | |
| i = 0, | |
| result = len > 0; | |
| i < len; i++) | |
| if (typeof(callback[i]) == "function") | |
| callback[i](); | |
| return result; | |
| } | |
| function _handleKeyUp( event ) { | |
| var keycode = event.which || window.event.keyCode; | |
| console.log("Kee'nput :: 'key up' registered: " + keycode); | |
| switch(keycode) { | |
| case 16: | |
| _SHIFT_DOWN = false; | |
| break; | |
| case 17: | |
| _CTRL_DOWN = false; | |
| break; | |
| case 18: | |
| _ALT_DOWN = false; | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| function _handleKeyDown( event ) { | |
| var keycode = event.which || window.event.keyCode; | |
| console.log("Kee'nput :: 'key down' registered: " + (_SHIFT_DOWN?"shift-":"") + (_CTRL_DOWN?"ctrl-":"") + (_ALT_DOWN?"alt-":"") + keycode); | |
| switch(keycode) { | |
| case 16: | |
| _SHIFT_DOWN = true; | |
| break; | |
| case 17: | |
| _CTRL_DOWN = true; | |
| break; | |
| case 18: | |
| _ALT_DOWN = true; | |
| break; | |
| default: | |
| if (_callShortcutCallbacks({ shift: _SHIFT_DOWN, ctrl: _CTRL_DOWN, alt: _ALT_DOWN, key: keycode })) | |
| _SHIFT_DOWN = _CTRL_DOWN = _ALT_DOWN = false; | |
| break; | |
| } | |
| } | |
| /**** "constructor" ****/ | |
| console.log("Kee'nput :: initializing Kee'nput"); | |
| if (document.addEventListener) { | |
| document.addEventListener("keydown", _handleKeyDown, false); | |
| document.addEventListener("keyup", _handleKeyUp, false); | |
| } else { | |
| document.attachEvent("onkeydown", _handleKeyDown); | |
| document.attachEvent("onkeyup", _handleKeyUp); | |
| } | |
| return { | |
| /**** public constants ****/ | |
| KEY_BACKSPACE: 8, | |
| KEY_TAB: 9, | |
| KEY_ENTER: 13, | |
| //KEY_SHIFT: 16, | |
| //KEY_CTRL: 17, | |
| //KEY_ALT: 18, | |
| KEY_PAUSE: 19, | |
| KEY_CAPSLOCK: 20, | |
| KEY_ESCAPE: 27, | |
| KEY_PAGE_UP: 33, | |
| KEY_PAGE_DOWN: 34, | |
| KEY_END: 35, | |
| KEY_HOME: 36, | |
| KEY_ARROW_LEFT: 37, | |
| KEY_ARROW_UP: 38, | |
| KEY_ARROW_RIGHT: 39, | |
| KEY_ARROW_DOWN: 40, | |
| KEY_INSERT: 45, | |
| KEY_DELETE: 46, | |
| KEY_0: 48, | |
| KEY_1: 49, | |
| KEY_2: 50, | |
| KEY_3: 51, | |
| KEY_4: 52, | |
| KEY_5: 53, | |
| KEY_6: 54, | |
| KEY_7: 55, | |
| KEY_8: 56, | |
| KEY_9: 57, | |
| KEY_A: 65, | |
| KEY_B: 66, | |
| KEY_C: 67, | |
| KEY_D: 68, | |
| KEY_E: 69, | |
| KEY_F: 70, | |
| KEY_G: 71, | |
| KEY_H: 72, | |
| KEY_I: 73, | |
| KEY_J: 74, | |
| KEY_K: 75, | |
| KEY_L: 76, | |
| KEY_M: 77, | |
| KEY_N: 78, | |
| KEY_O: 79, | |
| KEY_P: 80, | |
| KEY_Q: 81, | |
| KEY_R: 82, | |
| KEY_S: 83, | |
| KEY_T: 84, | |
| KEY_U: 85, | |
| KEY_V: 86, | |
| KEY_W: 87, | |
| KEY_X: 88, | |
| KEY_Y: 89, | |
| KEY_Z: 90, | |
| KEY_NUMPAD_0: 96, | |
| KEY_NUMPAD_1: 97, | |
| KEY_NUMPAD_2: 98, | |
| KEY_NUMPAD_3: 99, | |
| KEY_NUMPAD_4: 100, | |
| KEY_NUMPAD_5: 101, | |
| KEY_NUMPAD_6: 102, | |
| KEY_NUMPAD_7: 103, | |
| KEY_NUMPAD_8: 104, | |
| KEY_NUMPAD_9: 105, | |
| KEY_ASTERISK: 106, | |
| KEY_PLUS: 107, | |
| KEY_MINUS: 109, | |
| KEY_PERIOD: 110, | |
| KEY_SLASH: 111, | |
| KEY_F1: 112, | |
| KEY_F2: 113, | |
| KEY_F3: 114, | |
| KEY_F4: 115, | |
| KEY_F5: 116, | |
| KEY_F6: 117, | |
| KEY_F7: 118, | |
| KEY_F8: 119, | |
| KEY_F9: 120, | |
| KEY_F10: 121, | |
| KEY_F11: 122, | |
| KEY_F12: 123, | |
| KEY_EQUALS: 187, | |
| KEY_COMMA: 188, | |
| //KEY_SLASH: 191, | |
| KEY_BACKSLASH: 220, | |
| /**** "public" methods ****/ | |
| addShortcut: function( shortcut, callback ) { | |
| if (!shortcut || !shortcut.key || shortcut.key == 0 || !callback || typeof(callback) != "function") | |
| return; | |
| shortcut.shift = shortcut.shift || false; | |
| shortcut.ctrl = shortcut.ctrl || false; | |
| shortcut.alt = shortcut.alt || false; | |
| console.log("adding: "+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key); | |
| _set(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key, callback); | |
| }, | |
| removeShortcut: function( shortcut, callback ) { | |
| if (!shortcut || !shortcut.key || shortcut.key == 0) | |
| return; | |
| shortcut.shift = shortcut.shift || false; | |
| shortcut.ctrl = shortcut.ctrl || false; | |
| shortcut.alt = shortcut.alt || false; | |
| console.log("removing: "+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key); | |
| _remove(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key, callback); | |
| }, | |
| fireShortcut: function( shortcut ) { | |
| _callShortcutCallbacks( shortcut ); | |
| } | |
| }; | |
| }()); |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This has to be considered as 'not yet final'.
Feel free to improve . . . ;)