From 76d055159418b868386efda5a47b3d7fd1fd2656 Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Wed, 25 Nov 2015 21:42:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90hotkeys=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E6=96=87=E4=BB=B6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - dist/hotkeys.js | 277 ++++++++++++++++++++++++++++++++++++++++++++ dist/hotkeys.min.js | 1 + 3 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 dist/hotkeys.js create mode 100644 dist/hotkeys.min.js diff --git a/.gitignore b/.gitignore index d93463d..b38db2f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ node_modules/ -dist/ build/ diff --git a/dist/hotkeys.js b/dist/hotkeys.js new file mode 100644 index 0000000..f08f13e --- /dev/null +++ b/dist/hotkeys.js @@ -0,0 +1,277 @@ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.hotkeys = factory(); + } +}(this, function() { +//IE对indexOf方法的支持 +if(!Array.prototype.indexOf){ + Array.prototype.indexOf = function(obj){ + for(var i=0; i 0; + for(var y in _mods){ + if((!_mods[y] && handler.mods.indexOf(+y) > -1) || + (_mods[y] && handler.mods.indexOf(+y) === -1)) modifiersMatch = false; + } + // 调用处理程序,如果是修饰键不做处理 + if((handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch || handler.shortcut === '*'){ + if(handler.method(event, handler)===false){ + if(event.preventDefault) event.preventDefault(); + else event.returnValue = false; + if(event.stopPropagation) event.stopPropagation(); + if(event.cancelBubble) event.cancelBubble = true; + } + } + } +} + +//解除绑定某个范围的快捷键 +function unbind (key,scope) { + var multipleKeys = getKeys(key),keys,mods = [],obj; + for (var i = 0; i < multipleKeys.length; i++) { + + //将组合快捷键拆分为数组 + keys =multipleKeys[i].split('+'); + + //记录每个组合键中的修饰键的键码 返回数组 + if(keys.length > 1) mods=getMods(keys); + + //获取除修饰键外的键值key + key = keys[keys.length - 1]; + key = code(key); + + //判断是否传入范围,没有就获取范围 + if(scope === undefined) scope = getScope(); + + //如何key不在 _handlers 中返回不做处理 + if (!_handlers[key]) return; + + //清空 handlers 中数据, + //让触发快捷键键之后没有事件执行到达解除快捷键绑定的目的 + for (var r = 0; r < _handlers[key].length; r++) { + obj = _handlers[key][r]; + //判断是否在范围内并且键值相同 + if (obj.scope === scope && compareArray(obj.mods, mods)) { + _handlers[key][r] = {}; + } + } + } +} +//循环删除handlers中的所有 scope(范围) +function deleteScope(scope){ + var key, handlers, i; + for (key in _handlers) { + handlers = _handlers[key]; + for (i = 0; i < handlers.length; ) { + if (handlers[i].scope === scope) handlers.splice(i, 1); + else i++; + } + } +} +//比较修饰键的数组 +function compareArray(a1, a2) { + if (a1.length !== a2.length) return false; + for (var i = 0; i < a1.length; i++) { + if (a1[i] !== a2[i]) return false; + } + return true; +} +//表单控件控件判断 返回 Boolean +function filter(event){ + var tagName = (event.target || event.srcElement).tagName; + //忽略这些标签情况下快捷键无效 + return !(tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA'); +} +//修饰键转换成对应的键码 +function getMods (key) { + var mods = key.slice(0, key.length - 1); + for (var i = 0; i < mods.length; i++) mods[i] = _modifier[mods[i]]; + return mods; +} +//处理传的key字符串转换成数组 +function getKeys(key) { + var keys; + key = key.replace(/\s/g, '');//匹配任何空白字符,包括空格、制表符、换页符等等 + keys = key.split(','); + if ((keys[keys.length - 1]) === '') keys[keys.length - 2] += ','; + return keys; +} + +//在全局document上设置快捷键 +addEvent(document, 'keydown', function(event) { + dispatch(event); +}); +addEvent(document, 'keyup',function(event){ + clearModifier(event); +}); +//清除修饰键 +function clearModifier(event){ + var key = event.keyCode, + i = _downKeys.indexOf(key); + + if(i>=0) _downKeys.splice(i,1); + + //修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除 + if(key === 93 || key === 224) key = 91; + if(key in _mods) { + _mods[key] = false; + for(var k in _modifier) if(_modifier[k] === key) hotkeys[k] = false; + } +} +//主体hotkeys函数 +function hotkeys(key,scope,method){ + var keys = getKeys(key), mods=[],i=0; + //对为设定范围的判断 + if (method === undefined) { + method = scope; + scope = 'all'; + } + //对于每个快捷键处理 + for(;i < keys.length; i++){ + key = keys[i].split('+'); + mods = []; + //如果是组合快捷键取得组合快捷键 + if (key.length > 1){ + mods = getMods(key); + key = [key[key.length-1]]; + } + //转换成键码 + key = key[0]; + key = key === '*' ? '*' : code(key); + //判断key是否在_handlers中,不在就赋一个空数组 + if (!(key in _handlers)) _handlers[key] = []; + _handlers[key].push({shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods}); + } +} +_api = { + setScope:setScope, + getScope:getScope, + deleteScope:deleteScope, + getPressedKeyCodes:getPressedKeyCodes, + isPressed:isPressed, + filter:filter, + unbind:unbind +}; +for (var a in _api) hotkeys[a] = _api[a]; + +var _hotkeys = window.hotkeys +hotkeys.noConflict = function( deep ) { + if ( deep && window.hotkeys === hotkeys ) { + window.hotkeys = _hotkeys; + } + return hotkeys; +}; +window.hotkeys = hotkeys; + + +return hotkeys; +})); diff --git a/dist/hotkeys.min.js b/dist/hotkeys.min.js new file mode 100644 index 0000000..307ee01 --- /dev/null +++ b/dist/hotkeys.min.js @@ -0,0 +1 @@ +!function(root,factory){"function"==typeof define&&define.amd?define([],factory):"object"==typeof exports?module.exports=factory():root.hotkeys=factory()}(this,function(){function setScope(scope){_scope=scope||"all"}function getScope(){return _scope||"all"}function addEvent(object,event,method){object.addEventListener?object.addEventListener(event,method,!1):object.attachEvent&&object.attachEvent("on"+event,function(){method(window.event)})}function isPressed(keyCode){return"string"==typeof keyCode&&(keyCode=code(keyCode)),-1!==_downKeys.indexOf(keyCode)}function getPressedKeyCodes(argument){return _downKeys.slice(0)}function dispatch(event){var scope,key=event.keyCode,asterisk=_handlers["*"];if(-1===_downKeys.indexOf(key)&&_downKeys.push(key),(93===key||224===key)&&(key=91),key in _mods){_mods[key]=!0;for(var k in _modifier)_modifier[k]===key&&(hotkeys[k]=!0);if(!asterisk)return}for(var e in _mods)_mods[e]=event[modifierMap[e]];if(hotkeys.filter.call(this,event)){if(scope=getScope(),asterisk)for(i=0;i0;for(var y in _mods)(!_mods[y]&&handler.mods.indexOf(+y)>-1||_mods[y]&&-1===handler.mods.indexOf(+y))&&(modifiersMatch=!1);(0!==handler.mods.length||_mods[16]||_mods[18]||_mods[17]||_mods[91])&&!modifiersMatch&&"*"!==handler.shortcut||handler.method(event,handler)===!1&&(event.preventDefault?event.preventDefault():event.returnValue=!1,event.stopPropagation&&event.stopPropagation(),event.cancelBubble&&(event.cancelBubble=!0))}}function unbind(key,scope){for(var keys,obj,multipleKeys=getKeys(key),mods=[],i=0;i1&&(mods=getMods(keys)),key=keys[keys.length-1],key=code(key),void 0===scope&&(scope=getScope()),!_handlers[key])return;for(var r=0;r<_handlers[key].length;r++)obj=_handlers[key][r],obj.scope===scope&&compareArray(obj.mods,mods)&&(_handlers[key][r]={})}}function deleteScope(scope){var key,handlers,i;for(key in _handlers)for(handlers=_handlers[key],i=0;i=0&&_downKeys.splice(i,1),(93===key||224===key)&&(key=91),key in _mods){_mods[key]=!1;for(var k in _modifier)_modifier[k]===key&&(hotkeys[k]=!1)}}function hotkeys(key,scope,method){var keys=getKeys(key),mods=[],i=0;for(void 0===method&&(method=scope,scope="all");i1&&(mods=getMods(key),key=[key[key.length-1]]),key=key[0],key="*"===key?"*":code(key),key in _handlers||(_handlers[key]=[]),_handlers[key].push({shortcut:keys[i],scope:scope,method:method,key:keys[i],mods:mods})}Array.prototype.indexOf||(Array.prototype.indexOf=function(obj){for(var i=0;i