UNPKG

26.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.bundled.js","sources":["../../node_modules/hotkeys-js/dist/hotkeys.esm.js","index.js"],"sourcesContent":["/*!\n * hotkeys-js v3.8.1\n * A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.\n * \n * Copyright (c) 2020 kenny wong <wowohoo@qq.com>\n * http://jaywcjlove.github.io/hotkeys\n * \n * Licensed under the MIT license.\n */\n\nvar isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false; // 绑定事件\n\nfunction addEvent(object, event, method) {\n if (object.addEventListener) {\n object.addEventListener(event, method, false);\n } else if (object.attachEvent) {\n object.attachEvent(\"on\".concat(event), function () {\n method(window.event);\n });\n }\n} // 修饰键转换成对应的键码\n\n\nfunction getMods(modifier, key) {\n var mods = key.slice(0, key.length - 1);\n\n for (var i = 0; i < mods.length; i++) {\n mods[i] = modifier[mods[i].toLowerCase()];\n }\n\n return mods;\n} // 处理传的key字符串转换成数组\n\n\nfunction getKeys(key) {\n if (typeof key !== 'string') key = '';\n key = key.replace(/\\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等\n\n var keys = key.split(','); // 同时设置多个快捷键,以','分割\n\n var index = keys.lastIndexOf(''); // 快捷键可能包含',',需特殊处理\n\n for (; index >= 0;) {\n keys[index - 1] += ',';\n keys.splice(index, 1);\n index = keys.lastIndexOf('');\n }\n\n return keys;\n} // 比较修饰键的数组\n\n\nfunction compareArray(a1, a2) {\n var arr1 = a1.length >= a2.length ? a1 : a2;\n var arr2 = a1.length >= a2.length ? a2 : a1;\n var isIndex = true;\n\n for (var i = 0; i < arr1.length; i++) {\n if (arr2.indexOf(arr1[i]) === -1) isIndex = false;\n }\n\n return isIndex;\n}\n\nvar _keyMap = {\n backspace: 8,\n tab: 9,\n clear: 12,\n enter: 13,\n return: 13,\n esc: 27,\n escape: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n del: 46,\n delete: 46,\n ins: 45,\n insert: 45,\n home: 36,\n end: 35,\n pageup: 33,\n pagedown: 34,\n capslock: 20,\n '⇪': 20,\n ',': 188,\n '.': 190,\n '/': 191,\n '`': 192,\n '-': isff ? 173 : 189,\n '=': isff ? 61 : 187,\n ';': isff ? 59 : 186,\n '\\'': 222,\n '[': 219,\n ']': 221,\n '\\\\': 220\n}; // Modifier Keys\n\nvar _modifier = {\n // shiftKey\n '⇧': 16,\n shift: 16,\n // altKey\n '⌥': 18,\n alt: 18,\n option: 18,\n // ctrlKey\n '⌃': 17,\n ctrl: 17,\n control: 17,\n // metaKey\n '⌘': 91,\n cmd: 91,\n command: 91\n};\nvar modifierMap = {\n 16: 'shiftKey',\n 18: 'altKey',\n 17: 'ctrlKey',\n 91: 'metaKey',\n shiftKey: 16,\n ctrlKey: 17,\n altKey: 18,\n metaKey: 91\n};\nvar _mods = {\n 16: false,\n 18: false,\n 17: false,\n 91: false\n};\nvar _handlers = {}; // F1~F12 special key\n\nfor (var k = 1; k < 20; k++) {\n _keyMap[\"f\".concat(k)] = 111 + k;\n}\n\nvar _downKeys = []; // 记录摁下的绑定键\n\nvar _scope = 'all'; // 默认热键范围\n\nvar elementHasBindEvent = []; // 已绑定事件的节点记录\n// 返回键码\n\nvar code = function code(x) {\n return _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);\n}; // 设置获取当前范围(默认为'所有')\n\n\nfunction setScope(scope) {\n _scope = scope || 'all';\n} // 获取当前范围\n\n\nfunction getScope() {\n return _scope || 'all';\n} // 获取摁下绑定键的键值\n\n\nfunction getPressedKeyCodes() {\n return _downKeys.slice(0);\n} // 表单控件控件判断 返回 Boolean\n// hotkey is effective only when filter return true\n\n\nfunction filter(event) {\n var target = event.target || event.srcElement;\n var tagName = target.tagName;\n var flag = true; // ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>\n\n if (target.isContentEditable || (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {\n flag = false;\n }\n\n return flag;\n} // 判断摁下的键是否为某个键,返回true或者false\n\n\nfunction isPressed(keyCode) {\n if (typeof keyCode === 'string') {\n keyCode = code(keyCode); // 转换成键码\n }\n\n return _downKeys.indexOf(keyCode) !== -1;\n} // 循环删除handlers中的所有 scope(范围)\n\n\nfunction deleteScope(scope, newScope) {\n var handlers;\n var i; // 没有指定scope,获取scope\n\n if (!scope) scope = getScope();\n\n for (var key in _handlers) {\n if (Object.prototype.hasOwnProperty.call(_handlers, key)) {\n handlers = _handlers[key];\n\n for (i = 0; i < handlers.length;) {\n if (handlers[i].scope === scope) handlers.splice(i, 1);else i++;\n }\n }\n } // 如果scope被删除,将scope重置为all\n\n\n if (getScope() === scope) setScope(newScope || 'all');\n} // 清除修饰键\n\n\nfunction clearModifier(event) {\n var key = event.keyCode || event.which || event.charCode;\n\n var i = _downKeys.indexOf(key); // 从列表中清除按压过的键\n\n\n if (i >= 0) {\n _downKeys.splice(i, 1);\n } // 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题\n\n\n if (event.key && event.key.toLowerCase() === 'meta') {\n _downKeys.splice(0, _downKeys.length);\n } // 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除\n\n\n if (key === 93 || key === 224) key = 91;\n\n if (key in _mods) {\n _mods[key] = false; // 将修饰键重置为false\n\n for (var k in _modifier) {\n if (_modifier[k] === key) hotkeys[k] = false;\n }\n }\n}\n\nfunction unbind(keysInfo) {\n // unbind(), unbind all keys\n if (!keysInfo) {\n Object.keys(_handlers).forEach(function (key) {\n return delete _handlers[key];\n });\n } else if (Array.isArray(keysInfo)) {\n // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])\n keysInfo.forEach(function (info) {\n if (info.key) eachUnbind(info);\n });\n } else if (typeof keysInfo === 'object') {\n // support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})\n if (keysInfo.key) eachUnbind(keysInfo);\n } else if (typeof keysInfo === 'string') {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n // support old method\n // eslint-disable-line\n var scope = args[0],\n method = args[1];\n\n if (typeof scope === 'function') {\n method = scope;\n scope = '';\n }\n\n eachUnbind({\n key: keysInfo,\n scope: scope,\n method: method,\n splitKey: '+'\n });\n }\n} // 解除绑定某个范围的快捷键\n\n\nvar eachUnbind = function eachUnbind(_ref) {\n var key = _ref.key,\n scope = _ref.scope,\n method = _ref.method,\n _ref$splitKey = _ref.splitKey,\n splitKey = _ref$splitKey === void 0 ? '+' : _ref$splitKey;\n var multipleKeys = getKeys(key);\n multipleKeys.forEach(function (originKey) {\n var unbindKeys = originKey.split(splitKey);\n var len = unbindKeys.length;\n var lastKey = unbindKeys[len - 1];\n var keyCode = lastKey === '*' ? '*' : code(lastKey);\n if (!_handlers[keyCode]) return; // 判断是否传入范围,没有就获取范围\n\n if (!scope) scope = getScope();\n var mods = len > 1 ? getMods(_modifier, unbindKeys) : [];\n _handlers[keyCode] = _handlers[keyCode].map(function (record) {\n // 通过函数判断,是否解除绑定,函数相等直接返回\n var isMatchingMethod = method ? record.method === method : true;\n\n if (isMatchingMethod && record.scope === scope && compareArray(record.mods, mods)) {\n return {};\n }\n\n return record;\n });\n });\n}; // 对监听对应快捷键的回调函数进行处理\n\n\nfunction eventHandler(event, handler, scope) {\n var modifiersMatch; // 看它是否在当前范围\n\n if (handler.scope === scope || handler.scope === 'all') {\n // 检查是否匹配修饰符(如果有返回true)\n modifiersMatch = handler.mods.length > 0;\n\n for (var y in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, y)) {\n if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {\n modifiersMatch = false;\n }\n }\n } // 调用处理程序,如果是修饰键不做处理\n\n\n if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {\n if (handler.method(event, handler) === false) {\n if (event.preventDefault) event.preventDefault();else event.returnValue = false;\n if (event.stopPropagation) event.stopPropagation();\n if (event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n} // 处理keydown事件\n\n\nfunction dispatch(event) {\n var asterisk = _handlers['*'];\n var key = event.keyCode || event.which || event.charCode; // 表单控件过滤 默认表单控件不触发快捷键\n\n if (!hotkeys.filter.call(this, event)) return; // Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致\n // Webkit左右 command 键值不一样\n\n if (key === 93 || key === 224) key = 91;\n /**\n * Collect bound keys\n * If an Input Method Editor is processing key input and the event is keydown, return 229.\n * https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229\n * http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n */\n\n if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);\n /**\n * Jest test cases are required.\n * ===============================\n */\n\n ['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(function (keyName) {\n var keyNum = modifierMap[keyName];\n\n if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {\n _downKeys.push(keyNum);\n } else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {\n _downKeys.splice(_downKeys.indexOf(keyNum), 1);\n } else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {\n /**\n * Fix if Command is pressed:\n * ===============================\n */\n if (!(event.ctrlKey || event.shiftKey || event.altKey)) {\n _downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));\n }\n }\n });\n /**\n * -------------------------------\n */\n\n if (key in _mods) {\n _mods[key] = true; // 将特殊字符的key注册到 hotkeys 上\n\n for (var k in _modifier) {\n if (_modifier[k] === key) hotkeys[k] = true;\n }\n\n if (!asterisk) return;\n } // 将 modifierMap 里面的修饰键绑定到 event 中\n\n\n for (var e in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, e)) {\n _mods[e] = event[modifierMap[e]];\n }\n }\n /**\n * https://github.com/jaywcjlove/hotkeys/pull/129\n * This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.\n * An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.\n * Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate\n */\n\n\n if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {\n if (_downKeys.indexOf(17) === -1) {\n _downKeys.push(17);\n }\n\n if (_downKeys.indexOf(18) === -1) {\n _downKeys.push(18);\n }\n\n _mods[17] = true;\n _mods[18] = true;\n } // 获取范围 默认为 `all`\n\n\n var scope = getScope(); // 对任何快捷键都需要做的处理\n\n if (asterisk) {\n for (var i = 0; i < asterisk.length; i++) {\n if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {\n eventHandler(event, asterisk[i], scope);\n }\n }\n } // key 不在 _handlers 中返回\n\n\n if (!(key in _handlers)) return;\n\n for (var _i = 0; _i < _handlers[key].length; _i++) {\n if (event.type === 'keydown' && _handlers[key][_i].keydown || event.type === 'keyup' && _handlers[key][_i].keyup) {\n if (_handlers[key][_i].key) {\n var record = _handlers[key][_i];\n var splitKey = record.splitKey;\n var keyShortcut = record.key.split(splitKey);\n var _downKeysCurrent = []; // 记录当前按键键值\n\n for (var a = 0; a < keyShortcut.length; a++) {\n _downKeysCurrent.push(code(keyShortcut[a]));\n }\n\n if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {\n // 找到处理内容\n eventHandler(event, record, scope);\n }\n }\n }\n }\n} // 判断 element 是否已经绑定事件\n\n\nfunction isElementBind(element) {\n return elementHasBindEvent.indexOf(element) > -1;\n}\n\nfunction hotkeys(key, option, method) {\n _downKeys = [];\n var keys = getKeys(key); // 需要处理的快捷键列表\n\n var mods = [];\n var scope = 'all'; // scope默认为all,所有范围都有效\n\n var element = document; // 快捷键事件绑定节点\n\n var i = 0;\n var keyup = false;\n var keydown = true;\n var splitKey = '+'; // 对为设定范围的判断\n\n if (method === undefined && typeof option === 'function') {\n method = option;\n }\n\n if (Object.prototype.toString.call(option) === '[object Object]') {\n if (option.scope) scope = option.scope; // eslint-disable-line\n\n if (option.element) element = option.element; // eslint-disable-line\n\n if (option.keyup) keyup = option.keyup; // eslint-disable-line\n\n if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line\n\n if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line\n }\n\n if (typeof option === 'string') scope = option; // 对于每个快捷键进行处理\n\n for (; i < keys.length; i++) {\n key = keys[i].split(splitKey); // 按键列表\n\n mods = []; // 如果是组合快捷键取得组合快捷键\n\n if (key.length > 1) mods = getMods(_modifier, key); // 将非修饰键转化为键码\n\n key = key[key.length - 1];\n key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键\n // 判断key是否在_handlers中,不在就赋一个空数组\n\n if (!(key in _handlers)) _handlers[key] = [];\n\n _handlers[key].push({\n keyup: keyup,\n keydown: keydown,\n scope: scope,\n mods: mods,\n shortcut: keys[i],\n method: method,\n key: keys[i],\n splitKey: splitKey\n });\n } // 在全局document上设置快捷键\n\n\n if (typeof element !== 'undefined' && !isElementBind(element) && window) {\n elementHasBindEvent.push(element);\n addEvent(element, 'keydown', function (e) {\n dispatch(e);\n });\n addEvent(window, 'focus', function () {\n _downKeys = [];\n });\n addEvent(element, 'keyup', function (e) {\n dispatch(e);\n clearModifier(e);\n });\n }\n}\n\nvar _api = {\n setScope: setScope,\n getScope: getScope,\n deleteScope: deleteScope,\n getPressedKeyCodes: getPressedKeyCodes,\n isPressed: isPressed,\n filter: filter,\n unbind: unbind\n};\n\nfor (var a in _api) {\n if (Object.prototype.hasOwnProperty.call(_api, a)) {\n hotkeys[a] = _api[a];\n }\n}\n\nif (typeof window !== 'undefined') {\n var _hotkeys = window.hotkeys;\n\n hotkeys.noConflict = function (deep) {\n if (deep && window.hotkeys === hotkeys) {\n window.hotkeys = _hotkeys;\n }\n\n return hotkeys;\n };\n\n window.hotkeys = hotkeys;\n}\n\nexport default hotkeys;\n","import hotkeys from 'hotkeys-js';\n\n/**\n * @param {HTMLElement} [element=window] - The element to attach the hotkey listener to\n * @param {String[]} keyAry - A string of keys IE: 'enter', 'space', etc\n * @param {Object} [hotkeyOptions={}] - only supports scope and splitKey\n * documentation found here: https://github.com/jaywcjlove/hotkeys#option\n *\n * @param {string} hotkeyOptions.scope - The scope of the listener\n * @param {string} hotkeyOptions.splitKey - What to use as a split key, used for modifiers\n * @param {Object} [eventOptions={}] -\n * Possible options found here https://developer.mozilla.org/en-US/docs/Web/API/Event/Event\n * eventOptions also supports the detail: key\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent\n */\n\nfunction register({\n element = window,\n keys,\n hotkeyOptions = {},\n eventOptions = {}\n}) {\n keys.forEach(key => {\n Object.assign(eventOptions, {\n detail: {\n key: key\n }\n });\n const keyupEvent = new CustomEvent(`keyup:${key}`, eventOptions);\n const keydownEvent = new CustomEvent(`keydown:${key}`, eventOptions);\n const keyup = {\n keyup: true,\n keydown: false,\n element: element,\n scope: hotkeyOptions.scope,\n splitKey: hotkeyOptions.splitKey\n };\n const keydown = Object.assign(keyup, {\n keyup: false,\n keydown: true\n });\n hotkeys(key, keyup, () => element.dispatchEvent(keyupEvent));\n hotkeys(key, keydown, () => element.dispatchEvent(keydownEvent));\n });\n}\n\nconst hotkeyListener = {\n register\n};\n\nexport default hotkeyListener;\n//# sourceMappingURL=index.js.map\n"],"names":["isff","navigator","userAgent","toLowerCase","indexOf","addEvent","object","event","method","addEventListener","attachEvent","concat","window","getMods","modifier","key","mods","slice","length","i","getKeys","keys","replace","split","index","lastIndexOf","splice","_keyMap","backspace","tab","clear","enter","return","esc","escape","space","left","up","right","down","del","delete","ins","insert","home","end","pageup","pagedown","capslock","_modifier","shift","alt","option","ctrl","control","cmd","command","modifierMap","shiftKey","ctrlKey","altKey","metaKey","_mods","_handlers","k","_downKeys","_scope","elementHasBindEvent","code","x","toUpperCase","charCodeAt","setScope","scope","getScope","eachUnbind","_ref","_ref$splitKey","splitKey","forEach","originKey","unbindKeys","len","lastKey","keyCode","map","record","a1","a2","arr1","arr2","isIndex","compareArray","eventHandler","handler","modifiersMatch","y","Object","prototype","hasOwnProperty","call","shortcut","preventDefault","returnValue","stopPropagation","cancelBubble","dispatch","asterisk","which","charCode","hotkeys","filter","this","push","keyName","keyNum","e","getModifierState","type","keydown","keyup","_i","keyShortcut","_downKeysCurrent","a","sort","join","element","document","undefined","toString","isElementBind","clearModifier","_api","deleteScope","newScope","handlers","getPressedKeyCodes","isPressed","target","srcElement","tagName","flag","isContentEditable","readOnly","unbind","keysInfo","Array","isArray","info","_len","arguments","args","_key","_hotkeys","noConflict","deep","hotkeyListener","register","hotkeyOptions","eventOptions","assign","detail","keyupEvent","CustomEvent","keydownEvent","dispatchEvent"],"mappings":"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"}
\No newline at end of file