/* --------------------------------------------------------------------------------------------- 键盘行为控制器 --------------------------------------------------------------------------------------------- */ function DebugShow(e) { alert('(DebugInfo)KeyBehaviorHook异常:' + e.message); } /* 键盘行为控制器 params: @behavior:要操作的行为(有效值为:keydown,keyup,keypress) @target:注册目标(#id/.className/tagName/dom-obj) */ function KeyBehaviorHook(behavior, target) { //有效行为 var effectiveBehavior = { keydown: 'keydown', keyup: 'keyup', keypress: 'keypress' }; //目标行为 this.TargetBehavior = effectiveBehavior[behavior]; if (!this.TargetBehavior) { throw new Error("指定键盘行为无效,有效行为只能为[keydown,keyup,keypress]其一!"); } this.RegistTarget = target ? target : document; this.ExecFns = {}; //要执行的行为集合 } KeyBehaviorHook.prototype.TargetBehavior = undefined; //目标行为[keydown,keyup,keypress]其一 //KeyBehaviorHook.prototype.ExecFns = {}; /* 注册KeyDown键盘事件 params: @targetKeyValue:目标键值 @targetFn:目标方法 @withKey:组合键 */ KeyBehaviorHook.prototype.Regist = function (targetKeyValue, targetFn, withKey, isDisplace) { this.IsRegisted = undefined == this.IsRegisted ? this.IsRegisted : true; var fnKey = ''; if (!targetFn && !withKey) return false; if (targetKeyValue && typeof (targetKeyValue) == 'number') { fnKey += targetKeyValue; } else { } if (withKey && typeof (withKey) == 'string') { fnKey = withKey + fnKey; } else { } //注册检验 if (this.SelectFnByKey(fnKey) && !isDisplace) {//若设置为取代模式则取代之前那个注册 alert('按键“' + (withKey ? KeysNames[withKey] : '') + KeysNames[targetKeyValue] + '”已注册!'); return; //重复注册时提示 } { } this.ExecFns[fnKey] = targetFn; return true; }; /* 获取某键对应方法 @params: key:按键 widthKey:组合键(没有时为'') */ KeyBehaviorHook.prototype.SelectFnByKey = function (key, withKey) { return this.ExecFns ? this.ExecFns[key ? (withKey + key) : WithKey] : undefined; }; /* 清除注册 */ KeyBehaviorHook.prototype.ClearRegist = function () { this.ExecFns = {}; this.IsRegisted = false; }; /* 控制器开始生效 */ KeyBehaviorHook.prototype.Binding = function () { if (this.Binded) { return; } else; //只binding一次 this.Binded = this.Binded ? this.Binded : true; var self = this; //声明对象本身 /* 行为接收器 params: @e:键盘事件参数 */ var Device = function (e) { /*聚焦在input上时Shift组合键无效*/ var activeElement = document.activeElement; if ('input' == activeElement.tagName && 'text' == activeElement.type) { return; } var fnKey = ''; //记录方法键 //判定组合键 if (e.ctrlKey) { fnKey += window.WithKey.Ctrl; } if (e.altKey) { fnKey += window.WithKey.Alt; } if (e.shiftKey) { fnKey += window.WithKey.Shift; } fnKey += getCurrentKeyCode(e); var TargetFn = self.ExecFns[fnKey]; if (TargetFn) { /*取消默认行为*/ var evt = window.event || e; if (evt && evt.preventDefault) { //阻止默认浏览器动作(W3C) evt.preventDefault(); evt.stopPropagation(); } else { //IE中阻止函数器默认动作的方式 try { evt.keyCode = 0; } catch (ex) { } evt.cancelBubble = true evt.returnValue = false; } } else; if (typeof (TargetFn) == 'function') { try { TargetFn(); } catch (ex) { DebugShow(ex); } } else if (typeof (TargetFn) == 'string') { try { eval(TargetFn); } catch (ex) { DebugShow(ex); } } else { } if (TargetFn) { return false; } else; return true; } var targetDoms = $(this.RegistTarget); if (targetDoms && targetDoms.length > 0 && targetDoms[this.TargetBehavior]) targetDoms[this.TargetBehavior](function (e) { return Device(e); }); }; /* 获取聚焦元素 */ function getFocusedElement(evt) { return !-[1,] ? event.srcElement : evt.target; } /* 获取聚焦元素 */ function getCurrentKeyCode(evt) { return !-[1,] ? event.keyCode : evt.which; } window.WithKey = { Shift: 'w1_', Ctrl: 'w2_', Alt: 'w3_' }; //组合键 window.Keys = //键值 { BackSpace /**/: 8, Tab /**/: 9, Clear /**/: 12, Enter /**/: 13, Shift /**/: 16, Ctrl /**/: 17, Alt /**/: 18, Pause /**/: 19, Caps_Lock /**/: 20, Esc /**/: 27, Space /**/: 32, Prior /**/: 33, Next /**/: 34, End /**/: 35, Home /**/: 36, Left /**/: 37, Up /**/: 38, Right /**/: 39, Down /**/: 40, Select /**/: 41, Print /**/: 42, Execute /**/: 43, Insert /**/: 45, Delete /**/: 46, Help /**/: 47, 零 /**/: 48, 一 /**/: 49, 二 /**/: 50, 三 /**/: 51, 四 /**/: 52, 五 /**/: 53, 六 /**/: 54, 七 /**/: 55, 八 /**/: 56, 九 /**/: 57, A /**/: 65, B /**/: 66, C /**/: 67, D /**/: 68, E /**/: 69, F /**/: 70, G /**/: 71, H /**/: 72, I /**/: 73, J /**/: 74, K /**/: 75, L /**/: 76, M /**/: 77, N /**/: 78, O /**/: 79, P /**/: 80, Q /**/: 81, R /**/: 82, S /**/: 83, T /**/: 84, U /**/: 85, V /**/: 86, W /**/: 87, X /**/: 88, Y /**/: 89, Z /**/: 90, KP_0 /**/: 96, KP_1 /**/: 97, KP_2 /**/: 98, KP_3 /**/: 99, KP_4 /**/: 100, KP_5 /**/: 101, KP_6 /**/: 102, KP_7 /**/: 103, KP_8 /**/: 104, KP_9 /**/: 105, KP_Multiply /**/: 106, KP_Add /**/: 107, KP_Separator /**/: 108, KP_Subtract /**/: 109, KP_Decimal /**/: 110, KP_Divide /**/: 111, F1 /**/: 112, F2 /**/: 113, F3 /**/: 114, F4 /**/: 115, F5 /**/: 116, F6 /**/: 117, F7 /**/: 118, F8 /**/: 119, F9 /**/: 120, F10 /**/: 121, F11 /**/: 122, F12 /**/: 123, F13 /**/: 124, F14 /**/: 125, F15 /**/: 126, F16 /**/: 127, F17 /**/: 128, F18 /**/: 129, F19 /**/: 130, F20 /**/: 131, F21 /**/: 132, F22 /**/: 133, F23 /**/: 134, F24 /**/: 135, Num_Lock /**/: 136, Scroll_Lock /**/: 137 }; window.KeysNames = //值名称 { /**/"8": 'BackSpace', /**/ /**/"9": 'Tab', /**/ /**/"12": 'Clear', /**/ /**/"13": 'Enter', /**/ /**/"16": 'Shift', /**/ /**/"17": 'Ctrl', /**/ /**/"18": 'Alt', /**/ /**/"19": 'Pause', /**/ /**/"20": 'Caps_Lock', /**/ /**/"27": 'Esc', /**/ /**/"32": 'Space', /**/ /**/"33": 'Prior', /**/ /**/"34": 'Next', /**/ /**/"35": 'End', /**/ /**/"36": 'Home', /**/ /**/"37": 'Left', /**/ /**/"38": 'Up', /**/ /**/"39": 'Right', /**/ /**/"40": 'Down', /**/ /**/"41": 'Select', /**/ /**/"42": 'Print', /**/ /**/"43": 'Execute', /**/ /**/"45": 'Insert', /**/ /**/"46": 'Delete', /**/ /**/"47": 'Help', /**/ /**/"48": '零', /**/ /**/"49": '一', /**/ /**/"50": '二', /**/ /**/"51": '三', /**/ /**/"52": '四', /**/ /**/"53": '五', /**/ /**/"54": '六', /**/ /**/"55": '七', /**/ /**/"56": '八', /**/ /**/"57": '九', /**/ /**/"65": 'A', /**/ /**/"66": 'B', /**/ /**/"67": 'C', /**/ /**/"68": 'D', /**/ /**/"69": 'E', /**/ /**/"70": 'F', /**/ /**/"71": 'G', /**/ /**/"72": 'H', /**/ /**/"73": 'I', /**/ /**/"74": 'J', /**/ /**/"75": 'K', /**/ /**/"76": 'L', /**/ /**/"77": 'M', /**/ /**/"78": 'N', /**/ /**/"79": 'O', /**/ /**/"80": 'P', /**/ /**/"81": 'Q', /**/ /**/"82": 'R', /**/ /**/"83": 'S', /**/ /**/"84": 'T', /**/ /**/"85": 'U', /**/ /**/"86": 'V', /**/ /**/"87": 'W', /**/ /**/"88": 'X', /**/ /**/"89": 'Y', /**/ /**/"90": 'Z', /**/ /**/"96": 'KP_0', /**/ /**/"97": 'KP_1', /**/ /**/"98": 'KP_2', /**/ /**/"99": 'KP_3', /**/ /**/"100": 'KP_4', /**/ /**/"101": 'KP_5', /**/ /**/"102": 'KP_6', /**/ /**/"103": 'KP_7', /**/ /**/"104": 'KP_8', /**/ /**/"105": 'KP_9', /**/ /**/"106": 'KP_Multiply', /**/ /**/"107": 'KP_Add', /**/ /**/"108": 'KP_Separator', /**/ /**/"109": 'KP_Subtract', /**/ /**/"110": 'KP_Decimal', /**/ /**/"111": 'KP_Divide', /**/ /**/"112": 'F1', /**/ /**/"113": 'F2', /**/ /**/"114": 'F3', /**/ /**/"115": 'F4', /**/ /**/"116": 'F5', /**/ /**/"117": 'F6', /**/ /**/"118": 'F7', /**/ /**/"119": 'F8', /**/ /**/"120": 'F9', /**/ /**/"121": 'F10', /**/ /**/"122": 'F11', /**/ /**/"123": 'F12', /**/ /**/"124": 'F13', /**/ /**/"125": 'F14', /**/ /**/"126": 'F15', /**/ /**/"127": 'F16', /**/ /**/"128": 'F17', /**/ /**/"129": 'F18', /**/ /**/"130": 'F19', /**/ /**/"131": 'F20', /**/ /**/"132": 'F21', /**/ /**/"133": 'F22', /**/ /**/"134": 'F23', /**/ /**/"135": 'F24', /**/ /**/"136": 'Num_Lock', /**/ /**/"137": 'Scroll_Lock', /**/ /**/"w1_": 'Shift + ', /**/ /**/"w2_": 'Ctrl + ', /**/ /**/"w3_": 'Alt + ' /**/ }; /* backup window.Keys = { : 8 ,BackSpace : 9 ,Tab : 12 ,Clear : 13 ,Enter : 16 ,Shift_L : 17 ,Control_L : 18 ,Alt_L : 19 ,Pause : 20 ,Caps_Lock : 27 ,Escape : 32 ,space : 33 ,Prior : 34 ,Next : 35 ,End : 36 ,Home : 37 ,Left : 38 ,Up : 39 ,Right : 40 ,Down : 41 ,Select : 42 ,Print : 43 ,Execute : 45 ,Insert : 46 ,Delete : 47 ,Help : 48 ,零 : 49 ,一 : 50 ,二 : 51 ,三 : 52 ,四 : 53 ,五 : 54 ,六 : 55 ,七 : 56 ,八 : 57 ,九 : 65 ,A : 66 ,B : 67 ,C : 68 ,D : 69 ,E : 70 ,F : 71 ,G : 72 ,H : 73 ,I : 74 ,J : 75 ,K : 76 ,L : 77 ,M : 78 ,N : 79 ,O : 80 ,P : 81 ,Q : 82 ,R : 83 ,S : 84 ,T : 85 ,U : 86 ,V : 87 ,W : 88 ,X : 89 ,Y : 90 ,Z : 96 ,KP_0 : 97 ,KP_1 : 98 ,KP_2 : 99 ,KP_3 : 100 ,KP_4 : 101 ,KP_5 : 102 ,KP_6 : 103 ,KP_7 : 104 ,KP_8 : 105 ,KP_9 : 106 ,KP_Multiply : 107 ,KP_Add : 108 ,KP_Separator : 109 ,KP_Subtract : 110 ,KP_Decimal : 111 ,KP_Divide : 112 ,F1 : 113 ,F2 : 114 ,F3 : 115 ,F4 : 116 ,F5 : 117 ,F6 : 118 ,F7 : 119 ,F8 : 120 ,F9 : 121 ,F10 : 122 ,F11 : 123 ,F12 : 124 ,F13 : 125 ,F14 : 126 ,F15 : 127 ,F16 : 128 ,F17 : 129 ,F18 : 130 ,F19 : 131 ,F20 : 132 ,F21 : 133 ,F22 : 134 ,F23 : 135 ,F24 : 136 ,Num_Lock : 137 ,Scroll_Lock } */