hotkeys-js
Advanced tools
Comparing version 3.13.3 to 3.13.4
/**! | ||
* hotkeys-js v3.13.3 | ||
* hotkeys-js v3.13.4 | ||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. | ||
* | ||
* Copyright (c) 2023 kenny wong <wowohoo@qq.com> | ||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com> | ||
* https://github.com/jaywcjlove/hotkeys-js.git | ||
@@ -22,7 +22,12 @@ * | ||
} else if (object.attachEvent) { | ||
object.attachEvent("on".concat(event), () => { | ||
method(window.event); | ||
}); | ||
object.attachEvent("on".concat(event), method); | ||
} | ||
} | ||
function removeEvent(object, event, method, useCapture) { | ||
if (object.removeEventListener) { | ||
object.removeEventListener(event, method, useCapture); | ||
} else if (object.deachEvent) { | ||
object.deachEvent("on".concat(event), method); | ||
} | ||
} | ||
@@ -160,5 +165,5 @@ // 修饰键转换成对应的键码 | ||
let _downKeys = []; // 记录摁下的绑定键 | ||
let winListendFocus = false; // window是否已经监听了focus事件 | ||
let winListendFocus = null; // window是否已经监听了focus事件 | ||
let _scope = 'all'; // 默认热键范围 | ||
const elementHasBindEvent = []; // 已绑定事件的节点记录 | ||
const elementEventMap = new Map(); // 已绑定事件的节点记录 | ||
@@ -240,3 +245,13 @@ // 返回键码 | ||
for (i = 0; i < handlers.length;) { | ||
if (handlers[i].scope === scope) handlers.splice(i, 1);else i++; | ||
if (handlers[i].scope === scope) { | ||
const deleteItems = handlers.splice(i, 1); | ||
deleteItems.forEach(_ref2 => { | ||
let { | ||
element | ||
} = _ref2; | ||
return removeKeyEvent(element); | ||
}); | ||
} else { | ||
i++; | ||
} | ||
} | ||
@@ -277,2 +292,3 @@ } | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
removeKeyEvent(null); | ||
} else if (Array.isArray(keysInfo)) { | ||
@@ -307,3 +323,3 @@ // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}]) | ||
// 解除绑定某个范围的快捷键 | ||
const eachUnbind = _ref2 => { | ||
const eachUnbind = _ref3 => { | ||
let { | ||
@@ -314,3 +330,3 @@ key, | ||
splitKey = '+' | ||
} = _ref2; | ||
} = _ref3; | ||
const multipleKeys = getKeys(key); | ||
@@ -326,7 +342,11 @@ multipleKeys.forEach(originKey => { | ||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : []; | ||
const unbindElements = []; | ||
_handlers[keyCode] = _handlers[keyCode].filter(record => { | ||
// 通过函数判断,是否解除绑定,函数相等直接返回 | ||
const isMatchingMethod = method ? record.method === method : true; | ||
return !(isMatchingMethod && record.scope === scope && compareArray(record.mods, mods)); | ||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods); | ||
if (isUnbind) unbindElements.push(record.element); | ||
return !isUnbind; | ||
}); | ||
unbindElements.forEach(element => removeKeyEvent(element)); | ||
}); | ||
@@ -455,6 +475,8 @@ }; | ||
if (!(key in _handlers)) return; | ||
for (let i = 0; i < _handlers[key].length; i++) { | ||
if (event.type === 'keydown' && _handlers[key][i].keydown || event.type === 'keyup' && _handlers[key][i].keyup) { | ||
if (_handlers[key][i].key) { | ||
const record = _handlers[key][i]; | ||
const handlerKey = _handlers[key]; | ||
const keyLen = handlerKey.length; | ||
for (let i = 0; i < keyLen; i++) { | ||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) { | ||
if (handlerKey[i].key) { | ||
const record = handlerKey[i]; | ||
const { | ||
@@ -476,7 +498,2 @@ splitKey | ||
} | ||
// 判断 element 是否已经绑定事件 | ||
function isElementBind(element) { | ||
return elementHasBindEvent.indexOf(element) > -1; | ||
} | ||
function hotkeys(key, option, method) { | ||
@@ -540,17 +557,31 @@ _downKeys = []; | ||
// 在全局document上设置快捷键 | ||
if (typeof element !== 'undefined' && !isElementBind(element) && window) { | ||
elementHasBindEvent.push(element); | ||
addEvent(element, 'keydown', e => { | ||
dispatch(e, element); | ||
}, capture); | ||
if (typeof element !== 'undefined' && window) { | ||
if (!elementEventMap.has(element)) { | ||
const keydownListener = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
return dispatch(event, element); | ||
}; | ||
const keyupListenr = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
dispatch(event, element); | ||
clearModifier(event); | ||
}; | ||
elementEventMap.set(element, { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
}); | ||
addEvent(element, 'keydown', keydownListener, capture); | ||
addEvent(element, 'keyup', keyupListenr, capture); | ||
} | ||
if (!winListendFocus) { | ||
winListendFocus = true; | ||
addEvent(window, 'focus', () => { | ||
const listener = () => { | ||
_downKeys = []; | ||
}, capture); | ||
}; | ||
winListendFocus = { | ||
listener, | ||
capture | ||
}; | ||
addEvent(window, 'focus', listener, capture); | ||
} | ||
addEvent(element, 'keyup', e => { | ||
dispatch(e, element); | ||
clearModifier(e); | ||
}, capture); | ||
} | ||
@@ -569,2 +600,54 @@ } | ||
} | ||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听 | ||
function removeKeyEvent(element) { | ||
const values = Object.values(_handlers).flat(); | ||
const findindex = values.findIndex(_ref4 => { | ||
let { | ||
element: el | ||
} = _ref4; | ||
return el === element; | ||
}); | ||
if (findindex < 0) { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(element) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(element, 'keyup', keyupListenr, capture); | ||
removeEvent(element, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(element); | ||
} | ||
} | ||
if (values.length <= 0 || elementEventMap.size <= 0) { | ||
// 移除所有的元素上的监听 | ||
const eventKeys = Object.keys(elementEventMap); | ||
eventKeys.forEach(el => { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(el) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(el, 'keyup', keyupListenr, capture); | ||
removeEvent(el, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(el); | ||
} | ||
}); | ||
// 清空 elementEventMap | ||
elementEventMap.clear(); | ||
// 清空 _handlers | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
// 移除window上的focus监听 | ||
if (winListendFocus) { | ||
const { | ||
listener, | ||
capture | ||
} = winListendFocus; | ||
removeEvent(window, 'focus', listener, capture); | ||
winListendFocus = null; | ||
} | ||
} | ||
} | ||
const _api = { | ||
@@ -571,0 +654,0 @@ getPressedKeyString, |
@@ -1,2 +0,2 @@ | ||
/*! hotkeys-js v3.13.3 | MIT © 2023 kenny wong <wowohoo@qq.com> https://jaywcjlove.github.io/hotkeys-js */ | ||
"use strict";const isff="undefined"!=typeof navigator&&0<navigator.userAgent.toLowerCase().indexOf("firefox");function addEvent(e,t,o,n){e.addEventListener?e.addEventListener(t,o,n):e.attachEvent&&e.attachEvent("on".concat(t),()=>{o(window.event)})}function getMods(t,e){var o=e.slice(0,e.length-1);for(let e=0;e<o.length;e++)o[e]=t[o[e].toLowerCase()];return o}function getKeys(e){var t=(e=(e="string"!=typeof e?"":e).replace(/\s/g,"")).split(",");let o=t.lastIndexOf("");for(;0<=o;)t[o-1]+=",",t.splice(o,1),o=t.lastIndexOf("");return t}function compareArray(e,t){var o=e.length<t.length?t:e,n=e.length<t.length?e:t;let s=!0;for(let e=0;e<o.length;e++)~n.indexOf(o[e])||(s=!1);return s}const _keyMap={backspace:8,"\u232b":8,tab:9,clear:12,enter:13,"\u21a9":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"\u21ea":20,",":188,".":190,"/":191,"`":192,"-":isff?173:189,"=":isff?61:187,";":isff?59:186,"'":222,"[":219,"]":221,"\\":220},_modifier={"\u21e7":16,shift:16,"\u2325":18,alt:18,option:18,"\u2303":17,ctrl:17,control:17,"\u2318":91,cmd:91,command:91},modifierMap={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},_mods={16:!1,18:!1,17:!1,91:!1},_handlers={};for(let e=1;e<20;e++)_keyMap["f".concat(e)]=111+e;let _downKeys=[],winListendFocus=!1,_scope="all";const elementHasBindEvent=[],code=e=>_keyMap[e.toLowerCase()]||_modifier[e.toLowerCase()]||e.toUpperCase().charCodeAt(0),getKey=t=>Object.keys(_keyMap).find(e=>_keyMap[e]===t),getModifier=t=>Object.keys(_modifier).find(e=>_modifier[e]===t);function setScope(e){_scope=e||"all"}function getScope(){return _scope||"all"}function getPressedKeyCodes(){return _downKeys.slice(0)}function getPressedKeyString(){return _downKeys.map(e=>getKey(e)||getModifier(e)||String.fromCharCode(e))}function getAllKeyCodes(){const s=[];return Object.keys(_handlers).forEach(e=>{_handlers[e].forEach(e=>{var{key:e,scope:t,mods:o,shortcut:n}=e;s.push({scope:t,shortcut:n,mods:o,keys:e.split("+").map(e=>code(e))})})}),s}function filter(e){var e=e.target||e.srcElement,t=e["tagName"];let o=!e.isContentEditable&&("INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t||e.readOnly)?!0:!1;return o}function isPressed(e){return"string"==typeof e&&(e=code(e)),!!~_downKeys.indexOf(e)}function deleteScope(e,t){var o;let n;e=e||getScope();for(const s in _handlers)if(Object.prototype.hasOwnProperty.call(_handlers,s))for(o=_handlers[s],n=0;n<o.length;)o[n].scope===e?o.splice(n,1):n++;getScope()===e&&setScope(t||"all")}function clearModifier(e){let t=e.keyCode||e.which||e.charCode;var o=_downKeys.indexOf(t);if(o<0||_downKeys.splice(o,1),e.key&&"meta"==e.key.toLowerCase()&&_downKeys.splice(0,_downKeys.length),(t=93!==t&&224!==t?t:91)in _mods){_mods[t]=!1;for(const n in _modifier)_modifier[n]===t&&(hotkeys[n]=!1)}}function unbind(o){if(void 0===o)Object.keys(_handlers).forEach(e=>delete _handlers[e]);else if(Array.isArray(o))o.forEach(e=>{e.key&&eachUnbind(e)});else if("object"==typeof o)o.key&&eachUnbind(o);else if("string"==typeof o){for(var n=arguments.length,s=Array(1<n?n-1:0),d=1;d<n;d++)s[d-1]=arguments[d];let[e,t]=s;"function"==typeof e&&(t=e,e=""),eachUnbind({key:o,scope:e,method:t,splitKey:"+"})}}const eachUnbind=e=>{let{key:t,scope:s,method:d,splitKey:i="+"}=e;getKeys(t).forEach(e=>{var e=e.split(i),t=e.length,o=e[t-1],o="*"===o?"*":code(o);if(_handlers[o]){s=s||getScope();const n=1<t?getMods(_modifier,e):[];_handlers[o]=_handlers[o].filter(e=>{return!((!d||e.method===d)&&e.scope===s&&compareArray(e.mods,n))})}})};function eventHandler(t,o,n,e){if(o.element===e){let e;if(o.scope===n||"all"===o.scope){e=0<o.mods.length;for(const s in _mods)Object.prototype.hasOwnProperty.call(_mods,s)&&(!_mods[s]&&~o.mods.indexOf(+s)||_mods[s]&&!~o.mods.indexOf(+s))&&(e=!1);(0!==o.mods.length||_mods[16]||_mods[18]||_mods[17]||_mods[91])&&!e&&"*"!==o.shortcut||(o.keys=[],o.keys=o.keys.concat(_downKeys),!1===o.method(t,o)&&(t.preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation&&t.stopPropagation(),t.cancelBubble)&&(t.cancelBubble=!0))}}}function dispatch(o,t){var n=_handlers["*"];let s=o.keyCode||o.which||o.charCode;if(hotkeys.filter.call(this,o)){if(93!==s&&224!==s||(s=91),~_downKeys.indexOf(s)||229===s||_downKeys.push(s),["ctrlKey","altKey","shiftKey","metaKey"].forEach(e=>{var t=modifierMap[e];o[e]&&!~_downKeys.indexOf(t)?_downKeys.push(t):!o[e]&&~_downKeys.indexOf(t)?_downKeys.splice(_downKeys.indexOf(t),1):"metaKey"!==e||!o[e]||3!==_downKeys.length||o.ctrlKey||o.shiftKey||o.altKey||(_downKeys=_downKeys.slice(_downKeys.indexOf(t)))}),s in _mods){_mods[s]=!0;for(const e in _modifier)_modifier[e]===s&&(hotkeys[e]=!0);if(!n)return}for(const c in _mods)Object.prototype.hasOwnProperty.call(_mods,c)&&(_mods[c]=o[modifierMap[c]]);o.getModifierState&&(!o.altKey||o.ctrlKey)&&o.getModifierState("AltGraph")&&(~_downKeys.indexOf(17)||_downKeys.push(17),~_downKeys.indexOf(18)||_downKeys.push(18),_mods[17]=!0,_mods[18]=!0);var d=getScope();if(n)for(let e=0;e<n.length;e++)n[e].scope===d&&("keydown"===o.type&&n[e].keydown||"keyup"===o.type&&n[e].keyup)&&eventHandler(o,n[e],d,t);if(s in _handlers)for(let e=0;e<_handlers[s].length;e++)if(("keydown"===o.type&&_handlers[s][e].keydown||"keyup"===o.type&&_handlers[s][e].keyup)&&_handlers[s][e].key){var i=_handlers[s][e],r=i["splitKey"],l=i.key.split(r),a=[];for(let e=0;e<l.length;e++)a.push(code(l[e]));a.sort().join("")===_downKeys.sort().join("")&&eventHandler(o,i,d,t)}}}function isElementBind(e){return!!~elementHasBindEvent.indexOf(e)}function hotkeys(e,t,o){_downKeys=[];var n=getKeys(e);let s=[],d="all",i=document,r=0,l=!1,a=!0,c="+",y=!1,f=!1;for(void 0===o&&"function"==typeof t&&(o=t),"[object Object]"===Object.prototype.toString.call(t)&&(t.scope&&(d=t.scope),t.element&&(i=t.element),t.keyup&&(l=t.keyup),void 0!==t.keydown&&(a=t.keydown),void 0!==t.capture&&(y=t.capture),"string"==typeof t.splitKey&&(c=t.splitKey),!0===t.single)&&(f=!0),"string"==typeof t&&(d=t),f&&unbind(e,d);r<n.length;r++)e=n[r].split(c),s=[],1<e.length&&(s=getMods(_modifier,e)),(e="*"===(e=e[e.length-1])?"*":code(e))in _handlers||(_handlers[e]=[]),_handlers[e].push({keyup:l,keydown:a,scope:d,mods:s,shortcut:n[r],method:o,key:n[r],splitKey:c,element:i});void 0!==i&&!isElementBind(i)&&window&&(elementHasBindEvent.push(i),addEvent(i,"keydown",e=>{dispatch(e,i)},y),winListendFocus||(winListendFocus=!0,addEvent(window,"focus",()=>{_downKeys=[]},y)),addEvent(i,"keyup",e=>{dispatch(e,i),clearModifier(e)},y))}function trigger(t){let o=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(_handlers).forEach(e=>{_handlers[e].filter(e=>e.scope===o&&e.shortcut===t).forEach(e=>{e&&e.method&&e.method()})})}const _api={getPressedKeyString:getPressedKeyString,setScope:setScope,getScope:getScope,deleteScope:deleteScope,getPressedKeyCodes:getPressedKeyCodes,getAllKeyCodes:getAllKeyCodes,isPressed:isPressed,filter:filter,trigger:trigger,unbind:unbind,keyMap:_keyMap,modifier:_modifier,modifierMap:modifierMap};for(const f0 in _api)Object.prototype.hasOwnProperty.call(_api,f0)&&(hotkeys[f0]=_api[f0]);if("undefined"!=typeof window){const g0=window.hotkeys;hotkeys.noConflict=e=>(e&&window.hotkeys===hotkeys&&(window.hotkeys=g0),hotkeys),window.hotkeys=hotkeys}module.exports=hotkeys; | ||
/*! hotkeys-js v3.13.4 | MIT © 2024 kenny wong <wowohoo@qq.com> https://jaywcjlove.github.io/hotkeys-js */ | ||
"use strict";const isff="undefined"!=typeof navigator&&0<navigator.userAgent.toLowerCase().indexOf("firefox");function addEvent(e,t,n,o){e.addEventListener?e.addEventListener(t,n,o):e.attachEvent&&e.attachEvent("on".concat(t),n)}function removeEvent(e,t,n,o){e.removeEventListener?e.removeEventListener(t,n,o):e.deachEvent&&e.deachEvent("on".concat(t),n)}function getMods(t,e){var n=e.slice(0,e.length-1);for(let e=0;e<n.length;e++)n[e]=t[n[e].toLowerCase()];return n}function getKeys(e){var t=(e=(e="string"!=typeof e?"":e).replace(/\s/g,"")).split(",");let n=t.lastIndexOf("");for(;0<=n;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}function compareArray(e,t){var n=e.length<t.length?t:e,o=e.length<t.length?e:t;let s=!0;for(let e=0;e<n.length;e++)~o.indexOf(n[e])||(s=!1);return s}const _keyMap={backspace:8,"\u232b":8,tab:9,clear:12,enter:13,"\u21a9":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"\u21ea":20,",":188,".":190,"/":191,"`":192,"-":isff?173:189,"=":isff?61:187,";":isff?59:186,"'":222,"[":219,"]":221,"\\":220},_modifier={"\u21e7":16,shift:16,"\u2325":18,alt:18,option:18,"\u2303":17,ctrl:17,control:17,"\u2318":91,cmd:91,command:91},modifierMap={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},_mods={16:!1,18:!1,17:!1,91:!1},_handlers={};for(let e=1;e<20;e++)_keyMap["f".concat(e)]=111+e;let _downKeys=[],winListendFocus=null,_scope="all";const elementEventMap=new Map,code=e=>_keyMap[e.toLowerCase()]||_modifier[e.toLowerCase()]||e.toUpperCase().charCodeAt(0),getKey=t=>Object.keys(_keyMap).find(e=>_keyMap[e]===t),getModifier=t=>Object.keys(_modifier).find(e=>_modifier[e]===t);function setScope(e){_scope=e||"all"}function getScope(){return _scope||"all"}function getPressedKeyCodes(){return _downKeys.slice(0)}function getPressedKeyString(){return _downKeys.map(e=>getKey(e)||getModifier(e)||String.fromCharCode(e))}function getAllKeyCodes(){const s=[];return Object.keys(_handlers).forEach(e=>{_handlers[e].forEach(e=>{var{key:e,scope:t,mods:n,shortcut:o}=e;s.push({scope:t,shortcut:o,mods:n,keys:e.split("+").map(e=>code(e))})})}),s}function filter(e){var e=e.target||e.srcElement,t=e["tagName"];let n=!e.isContentEditable&&("INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t||e.readOnly)?!0:!1;return n}function isPressed(e){return"string"==typeof e&&(e=code(e)),!!~_downKeys.indexOf(e)}function deleteScope(e,t){var n;let o;e=e||getScope();for(const s in _handlers)if(Object.prototype.hasOwnProperty.call(_handlers,s))for(n=_handlers[s],o=0;o<n.length;)n[o].scope===e?n.splice(o,1).forEach(e=>{e=e.element;return removeKeyEvent(e)}):o++;getScope()===e&&setScope(t||"all")}function clearModifier(e){let t=e.keyCode||e.which||e.charCode;var n=_downKeys.indexOf(t);if(n<0||_downKeys.splice(n,1),e.key&&"meta"==e.key.toLowerCase()&&_downKeys.splice(0,_downKeys.length),(t=93!==t&&224!==t?t:91)in _mods){_mods[t]=!1;for(const o in _modifier)_modifier[o]===t&&(hotkeys[o]=!1)}}function unbind(n){if(void 0===n)Object.keys(_handlers).forEach(e=>delete _handlers[e]),removeKeyEvent(null);else if(Array.isArray(n))n.forEach(e=>{e.key&&eachUnbind(e)});else if("object"==typeof n)n.key&&eachUnbind(n);else if("string"==typeof n){for(var o=arguments.length,s=Array(1<o?o-1:0),r=1;r<o;r++)s[r-1]=arguments[r];let[e,t]=s;"function"==typeof e&&(t=e,e=""),eachUnbind({key:n,scope:e,method:t,splitKey:"+"})}}const eachUnbind=e=>{let{key:t,scope:r,method:d,splitKey:i="+"}=e;getKeys(t).forEach(e=>{var e=e.split(i),t=e.length,n=e[t-1],n="*"===n?"*":code(n);if(_handlers[n]){r=r||getScope();const o=1<t?getMods(_modifier,e):[],s=[];_handlers[n]=_handlers[n].filter(e=>{var t=(!d||e.method===d)&&e.scope===r&&compareArray(e.mods,o);return t&&s.push(e.element),!t}),s.forEach(e=>removeKeyEvent(e))}})};function eventHandler(t,n,o,e){if(n.element===e){let e;if(n.scope===o||"all"===n.scope){e=0<n.mods.length;for(const s in _mods)Object.prototype.hasOwnProperty.call(_mods,s)&&(!_mods[s]&&~n.mods.indexOf(+s)||_mods[s]&&!~n.mods.indexOf(+s))&&(e=!1);(0!==n.mods.length||_mods[16]||_mods[18]||_mods[17]||_mods[91])&&!e&&"*"!==n.shortcut||(n.keys=[],n.keys=n.keys.concat(_downKeys),!1===n.method(t,n)&&(t.preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation&&t.stopPropagation(),t.cancelBubble)&&(t.cancelBubble=!0))}}}function dispatch(n,t){var o=_handlers["*"];let e=n.keyCode||n.which||n.charCode;if(hotkeys.filter.call(this,n)){if(93!==e&&224!==e||(e=91),~_downKeys.indexOf(e)||229===e||_downKeys.push(e),["ctrlKey","altKey","shiftKey","metaKey"].forEach(e=>{var t=modifierMap[e];n[e]&&!~_downKeys.indexOf(t)?_downKeys.push(t):!n[e]&&~_downKeys.indexOf(t)?_downKeys.splice(_downKeys.indexOf(t),1):"metaKey"!==e||!n[e]||3!==_downKeys.length||n.ctrlKey||n.shiftKey||n.altKey||(_downKeys=_downKeys.slice(_downKeys.indexOf(t)))}),e in _mods){_mods[e]=!0;for(const y in _modifier)_modifier[y]===e&&(hotkeys[y]=!0);if(!o)return}for(const p in _mods)Object.prototype.hasOwnProperty.call(_mods,p)&&(_mods[p]=n[modifierMap[p]]);n.getModifierState&&(!n.altKey||n.ctrlKey)&&n.getModifierState("AltGraph")&&(~_downKeys.indexOf(17)||_downKeys.push(17),~_downKeys.indexOf(18)||_downKeys.push(18),_mods[17]=!0,_mods[18]=!0);var s=getScope();if(o)for(let e=0;e<o.length;e++)o[e].scope===s&&("keydown"===n.type&&o[e].keydown||"keyup"===n.type&&o[e].keyup)&&eventHandler(n,o[e],s,t);if(e in _handlers){var r=_handlers[e],d=r.length;for(let e=0;e<d;e++)if(("keydown"===n.type&&r[e].keydown||"keyup"===n.type&&r[e].keyup)&&r[e].key){var i=r[e],a=i["splitKey"],l=i.key.split(a),c=[];for(let e=0;e<l.length;e++)c.push(code(l[e]));c.sort().join("")===_downKeys.sort().join("")&&eventHandler(n,i,s,t)}}}}function hotkeys(e,t,n){_downKeys=[];var o,s=getKeys(e);let r=[],d="all",i=document,a=0,l=!1,c=!0,y="+",p=!1,f=!1;for(void 0===n&&"function"==typeof t&&(n=t),"[object Object]"===Object.prototype.toString.call(t)&&(t.scope&&(d=t.scope),t.element&&(i=t.element),t.keyup&&(l=t.keyup),void 0!==t.keydown&&(c=t.keydown),void 0!==t.capture&&(p=t.capture),"string"==typeof t.splitKey&&(y=t.splitKey),!0===t.single)&&(f=!0),"string"==typeof t&&(d=t),f&&unbind(e,d);a<s.length;a++)e=s[a].split(y),r=[],1<e.length&&(r=getMods(_modifier,e)),(e="*"===(e=e[e.length-1])?"*":code(e))in _handlers||(_handlers[e]=[]),_handlers[e].push({keyup:l,keydown:c,scope:d,mods:r,shortcut:s[a],method:n,key:s[a],splitKey:y,element:i});void 0!==i&&window&&(elementEventMap.has(i)||(t=function(){return dispatch(0<arguments.length&&void 0!==arguments[0]?arguments[0]:window.event,i)},o=function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:window.event;dispatch(e,i),clearModifier(e)},elementEventMap.set(i,{keydownListener:t,keyupListenr:o,capture:p}),addEvent(i,"keydown",t,p),addEvent(i,"keyup",o,p)),winListendFocus||(t=()=>{_downKeys=[]},winListendFocus={listener:t,capture:p},addEvent(window,"focus",t,p)))}function trigger(t){let n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(_handlers).forEach(e=>{_handlers[e].filter(e=>e.scope===n&&e.shortcut===t).forEach(e=>{e&&e.method&&e.method()})})}function removeKeyEvent(t){var e,n,o,s=Object.values(_handlers).flat();s.findIndex(e=>{e=e.element;return e===t})<0&&({keydownListener:o,keyupListenr:n,capture:e}=elementEventMap.get(t)||{},o)&&n&&(removeEvent(t,"keyup",n,e),removeEvent(t,"keydown",o,e),elementEventMap.delete(t)),0<s.length&&0<elementEventMap.size||(Object.keys(elementEventMap).forEach(e=>{var{keydownListener:t,keyupListenr:n,capture:o}=elementEventMap.get(e)||{};t&&n&&(removeEvent(e,"keyup",n,o),removeEvent(e,"keydown",t,o),elementEventMap.delete(e))}),elementEventMap.clear(),Object.keys(_handlers).forEach(e=>delete _handlers[e]),winListendFocus&&({listener:n,capture:o}=winListendFocus,removeEvent(window,"focus",n,o),winListendFocus=null))}const _api={getPressedKeyString:getPressedKeyString,setScope:setScope,getScope:getScope,deleteScope:deleteScope,getPressedKeyCodes:getPressedKeyCodes,getAllKeyCodes:getAllKeyCodes,isPressed:isPressed,filter:filter,trigger:trigger,unbind:unbind,keyMap:_keyMap,modifier:_modifier,modifierMap:modifierMap};for(const J0 in _api)Object.prototype.hasOwnProperty.call(_api,J0)&&(hotkeys[J0]=_api[J0]);if("undefined"!=typeof window){const K0=window.hotkeys;hotkeys.noConflict=e=>(e&&window.hotkeys===hotkeys&&(window.hotkeys=K0),hotkeys),window.hotkeys=hotkeys}module.exports=hotkeys; |
/**! | ||
* hotkeys-js v3.13.3 | ||
* hotkeys-js v3.13.4 | ||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. | ||
* | ||
* Copyright (c) 2023 kenny wong <wowohoo@qq.com> | ||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com> | ||
* https://github.com/jaywcjlove/hotkeys-js.git | ||
@@ -20,7 +20,12 @@ * | ||
} else if (object.attachEvent) { | ||
object.attachEvent("on".concat(event), () => { | ||
method(window.event); | ||
}); | ||
object.attachEvent("on".concat(event), method); | ||
} | ||
} | ||
function removeEvent(object, event, method, useCapture) { | ||
if (object.removeEventListener) { | ||
object.removeEventListener(event, method, useCapture); | ||
} else if (object.deachEvent) { | ||
object.deachEvent("on".concat(event), method); | ||
} | ||
} | ||
@@ -158,5 +163,5 @@ // 修饰键转换成对应的键码 | ||
let _downKeys = []; // 记录摁下的绑定键 | ||
let winListendFocus = false; // window是否已经监听了focus事件 | ||
let winListendFocus = null; // window是否已经监听了focus事件 | ||
let _scope = 'all'; // 默认热键范围 | ||
const elementHasBindEvent = []; // 已绑定事件的节点记录 | ||
const elementEventMap = new Map(); // 已绑定事件的节点记录 | ||
@@ -238,3 +243,13 @@ // 返回键码 | ||
for (i = 0; i < handlers.length;) { | ||
if (handlers[i].scope === scope) handlers.splice(i, 1);else i++; | ||
if (handlers[i].scope === scope) { | ||
const deleteItems = handlers.splice(i, 1); | ||
deleteItems.forEach(_ref2 => { | ||
let { | ||
element | ||
} = _ref2; | ||
return removeKeyEvent(element); | ||
}); | ||
} else { | ||
i++; | ||
} | ||
} | ||
@@ -275,2 +290,3 @@ } | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
removeKeyEvent(null); | ||
} else if (Array.isArray(keysInfo)) { | ||
@@ -305,3 +321,3 @@ // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}]) | ||
// 解除绑定某个范围的快捷键 | ||
const eachUnbind = _ref2 => { | ||
const eachUnbind = _ref3 => { | ||
let { | ||
@@ -312,3 +328,3 @@ key, | ||
splitKey = '+' | ||
} = _ref2; | ||
} = _ref3; | ||
const multipleKeys = getKeys(key); | ||
@@ -324,7 +340,11 @@ multipleKeys.forEach(originKey => { | ||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : []; | ||
const unbindElements = []; | ||
_handlers[keyCode] = _handlers[keyCode].filter(record => { | ||
// 通过函数判断,是否解除绑定,函数相等直接返回 | ||
const isMatchingMethod = method ? record.method === method : true; | ||
return !(isMatchingMethod && record.scope === scope && compareArray(record.mods, mods)); | ||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods); | ||
if (isUnbind) unbindElements.push(record.element); | ||
return !isUnbind; | ||
}); | ||
unbindElements.forEach(element => removeKeyEvent(element)); | ||
}); | ||
@@ -453,6 +473,8 @@ }; | ||
if (!(key in _handlers)) return; | ||
for (let i = 0; i < _handlers[key].length; i++) { | ||
if (event.type === 'keydown' && _handlers[key][i].keydown || event.type === 'keyup' && _handlers[key][i].keyup) { | ||
if (_handlers[key][i].key) { | ||
const record = _handlers[key][i]; | ||
const handlerKey = _handlers[key]; | ||
const keyLen = handlerKey.length; | ||
for (let i = 0; i < keyLen; i++) { | ||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) { | ||
if (handlerKey[i].key) { | ||
const record = handlerKey[i]; | ||
const { | ||
@@ -474,7 +496,2 @@ splitKey | ||
} | ||
// 判断 element 是否已经绑定事件 | ||
function isElementBind(element) { | ||
return elementHasBindEvent.indexOf(element) > -1; | ||
} | ||
function hotkeys(key, option, method) { | ||
@@ -538,17 +555,31 @@ _downKeys = []; | ||
// 在全局document上设置快捷键 | ||
if (typeof element !== 'undefined' && !isElementBind(element) && window) { | ||
elementHasBindEvent.push(element); | ||
addEvent(element, 'keydown', e => { | ||
dispatch(e, element); | ||
}, capture); | ||
if (typeof element !== 'undefined' && window) { | ||
if (!elementEventMap.has(element)) { | ||
const keydownListener = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
return dispatch(event, element); | ||
}; | ||
const keyupListenr = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
dispatch(event, element); | ||
clearModifier(event); | ||
}; | ||
elementEventMap.set(element, { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
}); | ||
addEvent(element, 'keydown', keydownListener, capture); | ||
addEvent(element, 'keyup', keyupListenr, capture); | ||
} | ||
if (!winListendFocus) { | ||
winListendFocus = true; | ||
addEvent(window, 'focus', () => { | ||
const listener = () => { | ||
_downKeys = []; | ||
}, capture); | ||
}; | ||
winListendFocus = { | ||
listener, | ||
capture | ||
}; | ||
addEvent(window, 'focus', listener, capture); | ||
} | ||
addEvent(element, 'keyup', e => { | ||
dispatch(e, element); | ||
clearModifier(e); | ||
}, capture); | ||
} | ||
@@ -567,2 +598,54 @@ } | ||
} | ||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听 | ||
function removeKeyEvent(element) { | ||
const values = Object.values(_handlers).flat(); | ||
const findindex = values.findIndex(_ref4 => { | ||
let { | ||
element: el | ||
} = _ref4; | ||
return el === element; | ||
}); | ||
if (findindex < 0) { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(element) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(element, 'keyup', keyupListenr, capture); | ||
removeEvent(element, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(element); | ||
} | ||
} | ||
if (values.length <= 0 || elementEventMap.size <= 0) { | ||
// 移除所有的元素上的监听 | ||
const eventKeys = Object.keys(elementEventMap); | ||
eventKeys.forEach(el => { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(el) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(el, 'keyup', keyupListenr, capture); | ||
removeEvent(el, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(el); | ||
} | ||
}); | ||
// 清空 elementEventMap | ||
elementEventMap.clear(); | ||
// 清空 _handlers | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
// 移除window上的focus监听 | ||
if (winListendFocus) { | ||
const { | ||
listener, | ||
capture | ||
} = winListendFocus; | ||
removeEvent(window, 'focus', listener, capture); | ||
winListendFocus = null; | ||
} | ||
} | ||
} | ||
const _api = { | ||
@@ -569,0 +652,0 @@ getPressedKeyString, |
/**! | ||
* hotkeys-js v3.13.3 | ||
* hotkeys-js v3.13.4 | ||
* A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. | ||
* | ||
* Copyright (c) 2023 kenny wong <wowohoo@qq.com> | ||
* Copyright (c) 2024 kenny wong <wowohoo@qq.com> | ||
* https://github.com/jaywcjlove/hotkeys-js.git | ||
@@ -26,7 +26,12 @@ * | ||
} else if (object.attachEvent) { | ||
object.attachEvent("on".concat(event), () => { | ||
method(window.event); | ||
}); | ||
object.attachEvent("on".concat(event), method); | ||
} | ||
} | ||
function removeEvent(object, event, method, useCapture) { | ||
if (object.removeEventListener) { | ||
object.removeEventListener(event, method, useCapture); | ||
} else if (object.deachEvent) { | ||
object.deachEvent("on".concat(event), method); | ||
} | ||
} | ||
@@ -164,5 +169,5 @@ // 修饰键转换成对应的键码 | ||
let _downKeys = []; // 记录摁下的绑定键 | ||
let winListendFocus = false; // window是否已经监听了focus事件 | ||
let winListendFocus = null; // window是否已经监听了focus事件 | ||
let _scope = 'all'; // 默认热键范围 | ||
const elementHasBindEvent = []; // 已绑定事件的节点记录 | ||
const elementEventMap = new Map(); // 已绑定事件的节点记录 | ||
@@ -244,3 +249,13 @@ // 返回键码 | ||
for (i = 0; i < handlers.length;) { | ||
if (handlers[i].scope === scope) handlers.splice(i, 1);else i++; | ||
if (handlers[i].scope === scope) { | ||
const deleteItems = handlers.splice(i, 1); | ||
deleteItems.forEach(_ref2 => { | ||
let { | ||
element | ||
} = _ref2; | ||
return removeKeyEvent(element); | ||
}); | ||
} else { | ||
i++; | ||
} | ||
} | ||
@@ -281,2 +296,3 @@ } | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
removeKeyEvent(null); | ||
} else if (Array.isArray(keysInfo)) { | ||
@@ -311,3 +327,3 @@ // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}]) | ||
// 解除绑定某个范围的快捷键 | ||
const eachUnbind = _ref2 => { | ||
const eachUnbind = _ref3 => { | ||
let { | ||
@@ -318,3 +334,3 @@ key, | ||
splitKey = '+' | ||
} = _ref2; | ||
} = _ref3; | ||
const multipleKeys = getKeys(key); | ||
@@ -330,7 +346,11 @@ multipleKeys.forEach(originKey => { | ||
const mods = len > 1 ? getMods(_modifier, unbindKeys) : []; | ||
const unbindElements = []; | ||
_handlers[keyCode] = _handlers[keyCode].filter(record => { | ||
// 通过函数判断,是否解除绑定,函数相等直接返回 | ||
const isMatchingMethod = method ? record.method === method : true; | ||
return !(isMatchingMethod && record.scope === scope && compareArray(record.mods, mods)); | ||
const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods); | ||
if (isUnbind) unbindElements.push(record.element); | ||
return !isUnbind; | ||
}); | ||
unbindElements.forEach(element => removeKeyEvent(element)); | ||
}); | ||
@@ -459,6 +479,8 @@ }; | ||
if (!(key in _handlers)) return; | ||
for (let i = 0; i < _handlers[key].length; i++) { | ||
if (event.type === 'keydown' && _handlers[key][i].keydown || event.type === 'keyup' && _handlers[key][i].keyup) { | ||
if (_handlers[key][i].key) { | ||
const record = _handlers[key][i]; | ||
const handlerKey = _handlers[key]; | ||
const keyLen = handlerKey.length; | ||
for (let i = 0; i < keyLen; i++) { | ||
if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) { | ||
if (handlerKey[i].key) { | ||
const record = handlerKey[i]; | ||
const { | ||
@@ -480,7 +502,2 @@ splitKey | ||
} | ||
// 判断 element 是否已经绑定事件 | ||
function isElementBind(element) { | ||
return elementHasBindEvent.indexOf(element) > -1; | ||
} | ||
function hotkeys(key, option, method) { | ||
@@ -544,17 +561,31 @@ _downKeys = []; | ||
// 在全局document上设置快捷键 | ||
if (typeof element !== 'undefined' && !isElementBind(element) && window) { | ||
elementHasBindEvent.push(element); | ||
addEvent(element, 'keydown', e => { | ||
dispatch(e, element); | ||
}, capture); | ||
if (typeof element !== 'undefined' && window) { | ||
if (!elementEventMap.has(element)) { | ||
const keydownListener = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
return dispatch(event, element); | ||
}; | ||
const keyupListenr = function () { | ||
let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event; | ||
dispatch(event, element); | ||
clearModifier(event); | ||
}; | ||
elementEventMap.set(element, { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
}); | ||
addEvent(element, 'keydown', keydownListener, capture); | ||
addEvent(element, 'keyup', keyupListenr, capture); | ||
} | ||
if (!winListendFocus) { | ||
winListendFocus = true; | ||
addEvent(window, 'focus', () => { | ||
const listener = () => { | ||
_downKeys = []; | ||
}, capture); | ||
}; | ||
winListendFocus = { | ||
listener, | ||
capture | ||
}; | ||
addEvent(window, 'focus', listener, capture); | ||
} | ||
addEvent(element, 'keyup', e => { | ||
dispatch(e, element); | ||
clearModifier(e); | ||
}, capture); | ||
} | ||
@@ -573,2 +604,54 @@ } | ||
} | ||
// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听 | ||
function removeKeyEvent(element) { | ||
const values = Object.values(_handlers).flat(); | ||
const findindex = values.findIndex(_ref4 => { | ||
let { | ||
element: el | ||
} = _ref4; | ||
return el === element; | ||
}); | ||
if (findindex < 0) { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(element) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(element, 'keyup', keyupListenr, capture); | ||
removeEvent(element, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(element); | ||
} | ||
} | ||
if (values.length <= 0 || elementEventMap.size <= 0) { | ||
// 移除所有的元素上的监听 | ||
const eventKeys = Object.keys(elementEventMap); | ||
eventKeys.forEach(el => { | ||
const { | ||
keydownListener, | ||
keyupListenr, | ||
capture | ||
} = elementEventMap.get(el) || {}; | ||
if (keydownListener && keyupListenr) { | ||
removeEvent(el, 'keyup', keyupListenr, capture); | ||
removeEvent(el, 'keydown', keydownListener, capture); | ||
elementEventMap.delete(el); | ||
} | ||
}); | ||
// 清空 elementEventMap | ||
elementEventMap.clear(); | ||
// 清空 _handlers | ||
Object.keys(_handlers).forEach(key => delete _handlers[key]); | ||
// 移除window上的focus监听 | ||
if (winListendFocus) { | ||
const { | ||
listener, | ||
capture | ||
} = winListendFocus; | ||
removeEvent(window, 'focus', listener, capture); | ||
winListendFocus = null; | ||
} | ||
} | ||
} | ||
const _api = { | ||
@@ -575,0 +658,0 @@ getPressedKeyString, |
@@ -1,2 +0,2 @@ | ||
/*! hotkeys-js v3.13.3 | MIT © 2023 kenny wong <wowohoo@qq.com> https://jaywcjlove.github.io/hotkeys-js */ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).hotkeys=t()}(this,function(){"use strict";var e="undefined"!=typeof navigator&&0<navigator.userAgent.toLowerCase().indexOf("firefox");function y(e,t,n,o){e.addEventListener?e.addEventListener(t,n,o):e.attachEvent&&e.attachEvent("on".concat(t),()=>{n(window.event)})}function u(t,e){var n=e.slice(0,e.length-1);for(let e=0;e<n.length;e++)n[e]=t[n[e].toLowerCase()];return n}function h(e){var t=(e=(e="string"!=typeof e?"":e).replace(/\s/g,"")).split(",");let n=t.lastIndexOf("");for(;0<=n;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}const o={backspace:8,"\u232b":8,tab:9,clear:12,enter:13,"\u21a9":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"\u21ea":20,",":188,".":190,"/":191,"`":192,"-":e?173:189,"=":e?61:187,";":e?59:186,"'":222,"[":219,"]":221,"\\":220},m={"\u21e7":16,shift:16,"\u2325":18,alt:18,option:18,"\u2303":17,ctrl:17,control:17,"\u2318":91,cmd:91,command:91},p={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},g={16:!1,18:!1,17:!1,91:!1},k={};for(let e=1;e<20;e++)o["f".concat(e)]=111+e;let w=[],v=!1,t="all";const O=[],K=e=>o[e.toLowerCase()]||m[e.toLowerCase()]||e.toUpperCase().charCodeAt(0);function i(e){t=e||"all"}function d(){return t||"all"}function b(n){if(void 0===n)Object.keys(k).forEach(e=>delete k[e]);else if(Array.isArray(n))n.forEach(e=>{e.key&&s(e)});else if("object"==typeof n)n.key&&s(n);else if("string"==typeof n){for(var o=arguments.length,r=Array(1<o?o-1:0),i=1;i<o;i++)r[i-1]=arguments[i];let[e,t]=r;"function"==typeof e&&(t=e,e=""),s({key:n,scope:e,method:t,splitKey:"+"})}}const s=e=>{let{key:t,scope:r,method:i,splitKey:s="+"}=e;h(t).forEach(e=>{var e=e.split(s),t=e.length,n=e[t-1],n="*"===n?"*":K(n);if(k[n]){r=r||d();const o=1<t?u(m,e):[];k[n]=k[n].filter(e=>{return!((!i||e.method===i)&&e.scope===r&&function(e,t){var n=e.length<t.length?t:e,o=e.length<t.length?e:t;let r=!0;for(let e=0;e<n.length;e++)~o.indexOf(n[e])||(r=!1);return r}(e.mods,o))})}})};function x(t,n,o,e){if(n.element===e){let e;if(n.scope===o||"all"===n.scope){e=0<n.mods.length;for(const r in g)Object.prototype.hasOwnProperty.call(g,r)&&(!g[r]&&~n.mods.indexOf(+r)||g[r]&&!~n.mods.indexOf(+r))&&(e=!1);(0!==n.mods.length||g[16]||g[18]||g[17]||g[91])&&!e&&"*"!==n.shortcut||(n.keys=[],n.keys=n.keys.concat(w),!1===n.method(t,n)&&(t.preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation&&t.stopPropagation(),t.cancelBubble)&&(t.cancelBubble=!0))}}}function C(n,t){var o=k["*"];let r=n.keyCode||n.which||n.charCode;if(E.filter.call(this,n)){if(93!==r&&224!==r||(r=91),~w.indexOf(r)||229===r||w.push(r),["ctrlKey","altKey","shiftKey","metaKey"].forEach(e=>{var t=p[e];n[e]&&!~w.indexOf(t)?w.push(t):!n[e]&&~w.indexOf(t)?w.splice(w.indexOf(t),1):"metaKey"!==e||!n[e]||3!==w.length||n.ctrlKey||n.shiftKey||n.altKey||(w=w.slice(w.indexOf(t)))}),r in g){g[r]=!0;for(const e in m)m[e]===r&&(E[e]=!0);if(!o)return}for(const a in g)Object.prototype.hasOwnProperty.call(g,a)&&(g[a]=n[p[a]]);n.getModifierState&&(!n.altKey||n.ctrlKey)&&n.getModifierState("AltGraph")&&(~w.indexOf(17)||w.push(17),~w.indexOf(18)||w.push(18),g[17]=!0,g[18]=!0);var i=d();if(o)for(let e=0;e<o.length;e++)o[e].scope===i&&("keydown"===n.type&&o[e].keydown||"keyup"===n.type&&o[e].keyup)&&x(n,o[e],i,t);if(r in k)for(let e=0;e<k[r].length;e++)if(("keydown"===n.type&&k[r][e].keydown||"keyup"===n.type&&k[r][e].keyup)&&k[r][e].key){var s=k[r][e],l=s["splitKey"],c=s.key.split(l),f=[];for(let e=0;e<c.length;e++)f.push(K(c[e]));f.sort().join("")===w.sort().join("")&&x(n,s,i,t)}}}function E(e,t,n){w=[];var o=h(e);let r=[],i="all",s=document,l=0,c=!1,f=!0,a="+",p=!1,d=!1;for(void 0===n&&"function"==typeof t&&(n=t),"[object Object]"===Object.prototype.toString.call(t)&&(t.scope&&(i=t.scope),t.element&&(s=t.element),t.keyup&&(c=t.keyup),void 0!==t.keydown&&(f=t.keydown),void 0!==t.capture&&(p=t.capture),"string"==typeof t.splitKey&&(a=t.splitKey),!0===t.single)&&(d=!0),"string"==typeof t&&(i=t),d&&b(e,i);l<o.length;l++)e=o[l].split(a),r=[],1<e.length&&(r=u(m,e)),(e="*"===(e=e[e.length-1])?"*":K(e))in k||(k[e]=[]),k[e].push({keyup:c,keydown:f,scope:i,mods:r,shortcut:o[l],method:n,key:o[l],splitKey:a,element:s});void 0!==s&&(t=s,!~O.indexOf(t))&&window&&(O.push(s),y(s,"keydown",e=>{C(e,s)},p),v||(v=!0,y(window,"focus",()=>{w=[]},p)),y(s,"keyup",t=>{C(t,s);{let e=t.keyCode||t.which||t.charCode;var n=w.indexOf(e);if(n<0||w.splice(n,1),t.key&&"meta"==t.key.toLowerCase()&&w.splice(0,w.length),(e=93!==e&&224!==e?e:91)in g){g[e]=!1;for(const o in m)m[o]===e&&(E[o]=!1)}}},p))}var n={getPressedKeyString:function(){return w.map(e=>{return n=e,Object.keys(o).find(e=>o[e]===n)||(t=e,Object.keys(m).find(e=>m[e]===t))||String.fromCharCode(e);var t,n})},setScope:i,getScope:d,deleteScope:function(e,t){var n;let o;e=e||d();for(const r in k)if(Object.prototype.hasOwnProperty.call(k,r))for(n=k[r],o=0;o<n.length;)n[o].scope===e?n.splice(o,1):o++;d()===e&&i(t||"all")},getPressedKeyCodes:function(){return w.slice(0)},getAllKeyCodes:function(){const r=[];return Object.keys(k).forEach(e=>{k[e].forEach(e=>{var{key:e,scope:t,mods:n,shortcut:o}=e;r.push({scope:t,shortcut:o,mods:n,keys:e.split("+").map(e=>K(e))})})}),r},isPressed:function(e){return"string"==typeof e&&(e=K(e)),!!~w.indexOf(e)},filter:function(e){var t=(e=e.target||e.srcElement)["tagName"];let n=!e.isContentEditable&&("INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t||e.readOnly)?!0:!1;return n},trigger:function(t){let n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(k).forEach(e=>{k[e].filter(e=>e.scope===n&&e.shortcut===t).forEach(e=>{e&&e.method&&e.method()})})},unbind:b,keyMap:o,modifier:m,modifierMap:p};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(E[r]=n[r]);if("undefined"!=typeof window){const l=window.hotkeys;E.noConflict=e=>(e&&window.hotkeys===E&&(window.hotkeys=l),E),window.hotkeys=E}return E}); | ||
/*! hotkeys-js v3.13.4 | MIT © 2024 kenny wong <wowohoo@qq.com> https://jaywcjlove.github.io/hotkeys-js */ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).hotkeys=t()}(this,function(){"use strict";var e="undefined"!=typeof navigator&&0<navigator.userAgent.toLowerCase().indexOf("firefox");function y(e,t,n,o){e.addEventListener?e.addEventListener(t,n,o):e.attachEvent&&e.attachEvent("on".concat(t),n)}function i(e,t,n,o){e.removeEventListener?e.removeEventListener(t,n,o):e.deachEvent&&e.deachEvent("on".concat(t),n)}function h(t,e){var n=e.slice(0,e.length-1);for(let e=0;e<n.length;e++)n[e]=t[n[e].toLowerCase()];return n}function m(e){var t=(e=(e="string"!=typeof e?"":e).replace(/\s/g,"")).split(",");let n=t.lastIndexOf("");for(;0<=n;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}const o={backspace:8,"\u232b":8,tab:9,clear:12,enter:13,"\u21a9":13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,ins:45,insert:45,home:36,end:35,pageup:33,pagedown:34,capslock:20,num_0:96,num_1:97,num_2:98,num_3:99,num_4:100,num_5:101,num_6:102,num_7:103,num_8:104,num_9:105,num_multiply:106,num_add:107,num_enter:108,num_subtract:109,num_decimal:110,num_divide:111,"\u21ea":20,",":188,".":190,"/":191,"`":192,"-":e?173:189,"=":e?61:187,";":e?59:186,"'":222,"[":219,"]":221,"\\":220},k={"\u21e7":16,shift:16,"\u2325":18,alt:18,option:18,"\u2303":17,ctrl:17,control:17,"\u2318":91,cmd:91,command:91},u={16:"shiftKey",18:"altKey",17:"ctrlKey",91:"metaKey",shiftKey:16,ctrlKey:17,altKey:18,metaKey:91},g={16:!1,18:!1,17:!1,91:!1},v={};for(let e=1;e<20;e++)o["f".concat(e)]=111+e;let w=[],O=null,t="all";const b=new Map,K=e=>o[e.toLowerCase()]||k[e.toLowerCase()]||e.toUpperCase().charCodeAt(0);function l(e){t=e||"all"}function E(){return t||"all"}function j(n){if(void 0===n)Object.keys(v).forEach(e=>delete v[e]),c(null);else if(Array.isArray(n))n.forEach(e=>{e.key&&s(e)});else if("object"==typeof n)n.key&&s(n);else if("string"==typeof n){for(var o=arguments.length,r=Array(1<o?o-1:0),i=1;i<o;i++)r[i-1]=arguments[i];let[e,t]=r;"function"==typeof e&&(t=e,e=""),s({key:n,scope:e,method:t,splitKey:"+"})}}const s=e=>{let{key:t,scope:i,method:l,splitKey:s="+"}=e;m(t).forEach(e=>{var e=e.split(s),t=e.length,n=e[t-1],n="*"===n?"*":K(n);if(v[n]){i=i||E();const o=1<t?h(k,e):[],r=[];v[n]=v[n].filter(e=>{var t=(!l||e.method===l)&&e.scope===i&&function(e,t){var n=e.length<t.length?t:e,o=e.length<t.length?e:t;let r=!0;for(let e=0;e<n.length;e++)~o.indexOf(n[e])||(r=!1);return r}(e.mods,o);return t&&r.push(e.element),!t}),r.forEach(e=>c(e))}})};function x(t,n,o,e){if(n.element===e){let e;if(n.scope===o||"all"===n.scope){e=0<n.mods.length;for(const r in g)Object.prototype.hasOwnProperty.call(g,r)&&(!g[r]&&~n.mods.indexOf(+r)||g[r]&&!~n.mods.indexOf(+r))&&(e=!1);(0!==n.mods.length||g[16]||g[18]||g[17]||g[91])&&!e&&"*"!==n.shortcut||(n.keys=[],n.keys=n.keys.concat(w),!1===n.method(t,n)&&(t.preventDefault?t.preventDefault():t.returnValue=!1,t.stopPropagation&&t.stopPropagation(),t.cancelBubble)&&(t.cancelBubble=!0))}}}function C(n,t){var o=v["*"];let e=n.keyCode||n.which||n.charCode;if(L.filter.call(this,n)){if(93!==e&&224!==e||(e=91),~w.indexOf(e)||229===e||w.push(e),["ctrlKey","altKey","shiftKey","metaKey"].forEach(e=>{var t=u[e];n[e]&&!~w.indexOf(t)?w.push(t):!n[e]&&~w.indexOf(t)?w.splice(w.indexOf(t),1):"metaKey"!==e||!n[e]||3!==w.length||n.ctrlKey||n.shiftKey||n.altKey||(w=w.slice(w.indexOf(t)))}),e in g){g[e]=!0;for(const d in k)k[d]===e&&(L[d]=!0);if(!o)return}for(const p in g)Object.prototype.hasOwnProperty.call(g,p)&&(g[p]=n[u[p]]);n.getModifierState&&(!n.altKey||n.ctrlKey)&&n.getModifierState("AltGraph")&&(~w.indexOf(17)||w.push(17),~w.indexOf(18)||w.push(18),g[17]=!0,g[18]=!0);var r=E();if(o)for(let e=0;e<o.length;e++)o[e].scope===r&&("keydown"===n.type&&o[e].keydown||"keyup"===n.type&&o[e].keyup)&&x(n,o[e],r,t);if(e in v){var i=v[e],l=i.length;for(let e=0;e<l;e++)if(("keydown"===n.type&&i[e].keydown||"keyup"===n.type&&i[e].keyup)&&i[e].key){var s=i[e],c=s["splitKey"],a=s.key.split(c),f=[];for(let e=0;e<a.length;e++)f.push(K(a[e]));f.sort().join("")===w.sort().join("")&&x(n,s,r,t)}}}}function L(e,t,n){w=[];var o,r=m(e);let i=[],l="all",s=document,c=0,a=!1,f=!0,d="+",p=!1,u=!1;for(void 0===n&&"function"==typeof t&&(n=t),"[object Object]"===Object.prototype.toString.call(t)&&(t.scope&&(l=t.scope),t.element&&(s=t.element),t.keyup&&(a=t.keyup),void 0!==t.keydown&&(f=t.keydown),void 0!==t.capture&&(p=t.capture),"string"==typeof t.splitKey&&(d=t.splitKey),!0===t.single)&&(u=!0),"string"==typeof t&&(l=t),u&&j(e,l);c<r.length;c++)e=r[c].split(d),i=[],1<e.length&&(i=h(k,e)),(e="*"===(e=e[e.length-1])?"*":K(e))in v||(v[e]=[]),v[e].push({keyup:a,keydown:f,scope:l,mods:i,shortcut:r[c],method:n,key:r[c],splitKey:d,element:s});void 0!==s&&window&&(b.has(s)||(t=function(){return C(0<arguments.length&&void 0!==arguments[0]?arguments[0]:window.event,s)},o=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:window.event;C(t,s);{let e=t.keyCode||t.which||t.charCode;var n=w.indexOf(e);if(n<0||w.splice(n,1),t.key&&"meta"==t.key.toLowerCase()&&w.splice(0,w.length),(e=93!==e&&224!==e?e:91)in g){g[e]=!1;for(const o in k)k[o]===e&&(L[o]=!1)}}},b.set(s,{keydownListener:t,keyupListenr:o,capture:p}),y(s,"keydown",t,p),y(s,"keyup",o,p)),O||(t=()=>{w=[]},O={listener:t,capture:p},y(window,"focus",t,p)))}function c(t){var e,n,o,r=Object.values(v).flat();r.findIndex(e=>{e=e.element;return e===t})<0&&({keydownListener:o,keyupListenr:n,capture:e}=b.get(t)||{},o)&&n&&(i(t,"keyup",n,e),i(t,"keydown",o,e),b.delete(t)),0<r.length&&0<b.size||(Object.keys(b).forEach(e=>{var{keydownListener:t,keyupListenr:n,capture:o}=b.get(e)||{};t&&n&&(i(e,"keyup",n,o),i(e,"keydown",t,o),b.delete(e))}),b.clear(),Object.keys(v).forEach(e=>delete v[e]),O&&({listener:n,capture:o}=O,i(window,"focus",n,o),O=null))}var n={getPressedKeyString:function(){return w.map(e=>{return n=e,Object.keys(o).find(e=>o[e]===n)||(t=e,Object.keys(k).find(e=>k[e]===t))||String.fromCharCode(e);var t,n})},setScope:l,getScope:E,deleteScope:function(e,t){var n;let o;e=e||E();for(const r in v)if(Object.prototype.hasOwnProperty.call(v,r))for(n=v[r],o=0;o<n.length;)n[o].scope===e?n.splice(o,1).forEach(e=>{e=e.element;return c(e)}):o++;E()===e&&l(t||"all")},getPressedKeyCodes:function(){return w.slice(0)},getAllKeyCodes:function(){const r=[];return Object.keys(v).forEach(e=>{v[e].forEach(e=>{var{key:e,scope:t,mods:n,shortcut:o}=e;r.push({scope:t,shortcut:o,mods:n,keys:e.split("+").map(e=>K(e))})})}),r},isPressed:function(e){return"string"==typeof e&&(e=K(e)),!!~w.indexOf(e)},filter:function(e){var t=(e=e.target||e.srcElement)["tagName"];let n=!e.isContentEditable&&("INPUT"!==t&&"TEXTAREA"!==t&&"SELECT"!==t||e.readOnly)?!0:!1;return n},trigger:function(t){let n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"all";Object.keys(v).forEach(e=>{v[e].filter(e=>e.scope===n&&e.shortcut===t).forEach(e=>{e&&e.method&&e.method()})})},unbind:j,keyMap:o,modifier:k,modifierMap:u};for(const r in n)Object.prototype.hasOwnProperty.call(n,r)&&(L[r]=n[r]);if("undefined"!=typeof window){const a=window.hotkeys;L.noConflict=e=>(e&&window.hotkeys===L&&(window.hotkeys=a),L),window.hotkeys=L}return L}); |
{ | ||
"name": "hotkeys-js", | ||
"description": "A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.", | ||
"version": "3.13.3", | ||
"version": "3.13.4", | ||
"main": "index.js", | ||
@@ -6,0 +6,0 @@ "types": "index.d.ts", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
96541
2073