-
Notifications
You must be signed in to change notification settings - Fork 1
/
shortcut.min.js
1 lines (1 loc) · 3.39 KB
/
shortcut.min.js
1
shortcut={all_shortcuts:{},add:function(shortcut_combination,callback,opt){const default_options={type:"keydown",propagate:false,disable_in_input:false,target:document,keycode:false};if(!opt)opt=default_options;else{for(let dfo in default_options){if(typeof opt[dfo]=="undefined")opt[dfo]=default_options[dfo]}}let ele=opt.target;if(typeof opt.target=="string")ele=document.getElementById(opt.target.toString());shortcut_combination=shortcut_combination.toLowerCase();let func=function(e){e=e||window.event;if(opt["disable_in_input"]){let element;if(e.target)element=e.target;else{if(e.window.eventsrcElement)element=e.srcElement}if(element.nodeType===3)element=element.parentNode;if(element.tagName==="INPUT"||element.tagName==="TEXTAREA")return}let code;if(e.keyCode)code=e.keyCode;else if(e.which)code=e.which;let character=String.fromCharCode(code).toLowerCase();if(code===188)character=",";if(code===190)character=".";let keys=shortcut_combination.split("+");let kp=0;let shift_nums={"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":":","'":'"',",":"<",".":">","/":"?","\\":"|"};let special_keys={esc:27,escape:27,tab:9,space:32,return:13,enter:13,backspace:8,scrolllock:145,scroll_lock:145,scroll:145,capslock:20,caps_lock:20,caps:20,numlock:144,num_lock:144,num:144,pause:19,break:19,insert:45,home:36,delete:46,end:35,pageup:33,page_up:33,pu:33,pagedown:34,page_down:34,pd:34,left:37,up:38,right:39,down:40,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123};let modifiers={shift:{wanted:false,pressed:false},ctrl:{wanted:false,pressed:false},alt:{wanted:false,pressed:false},meta:{wanted:false,pressed:false}};if(e.ctrlKey)modifiers.ctrl.pressed=true;if(e.shiftKey)modifiers.shift.pressed=true;if(e.altKey)modifiers.alt.pressed=true;if(e.metaKey)modifiers.meta.pressed=true;let k;for(let i=0;k=keys[i],i<keys.length;i++){if(k==="ctrl"||k==="control"){kp++;modifiers.ctrl.wanted=true}else if(k==="shift"){kp++;modifiers.shift.wanted=true}else if(k==="alt"){kp++;modifiers.alt.wanted=true}else if(k==="meta"){kp++;modifiers.meta.wanted=true}else if(k.length>1){if(special_keys[k]===code)kp++}else if(opt["keycode"]){if(opt["keycode"]===code)kp++}else{if(character===k)kp++;else{if(shift_nums[character]&&e.shiftKey){character=shift_nums[character];if(character===k)kp++}}}}if(kp===keys.length&&modifiers.ctrl.pressed===modifiers.ctrl.wanted&&modifiers.shift.pressed===modifiers.shift.wanted&&modifiers.alt.pressed===modifiers.alt.wanted&&modifiers.meta.pressed===modifiers.meta.wanted){callback(e);if(!opt["propagate"]){e.cancelBubble=true;e.returnValue=false;if(e.stopPropagation){e.stopPropagation();e.preventDefault()}return false}}};this.all_shortcuts[shortcut_combination]={callback:func,target:ele,event:opt["type"]};if(ele.addEventListener)ele.addEventListener(opt["type"],func,false);else{if(ele.attachEvent)ele.attachEvent("on"+opt["type"],func);else ele["on"+opt["type"]]=func}},remove:function(shortcut_combination){shortcut_combination=shortcut_combination.toLowerCase();let binding=this.all_shortcuts[shortcut_combination];delete this.all_shortcuts[shortcut_combination];if(!binding)return;let type=binding["event"];let ele=binding["target"];if(!ele.detachEvent)ele.detachEvent={};let callback=binding["callback"];if(ele.detachEvent)ele.detachEvent("on"+type,callback);else if(ele.removeEventListener)ele.removeEventListener(type,callback,false);else ele["on"+type]=false}};