Socket
Socket
Sign inDemoInstall

hotkeys-js

Package Overview
Dependencies
Maintainers
1
Versions
101
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

hotkeys-js - npm Package Compare versions

Comparing version 2.0.2 to 2.0.3

4

dist/hotkeys.min.js

@@ -1,3 +0,3 @@

/*! hotkeys-js v2.0.1 | (c) 2017 kenny wang <wowohoo@qq.com> | https://github.com/jaywcjlove/hotkeys.git */
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).hotkeys=e()}}(function(){function n(){return h||"all"}function t(e,n,t){e.addEventListener?e.addEventListener(n,t,!1):e.attachEvent&&e.attachEvent("on"+n,function(){t(window.event)})}function o(e){var t,o=e.keyCode||e.which||e.charCode,i=m["*"];if(-1===g.indexOf(o)&&g.push(o),93!==o&&224!==o||(o=91),o in y){y[o]=!0;for(var f in p)p[f]===o&&(c[f]=!0);if(!i)return}for(var l in y)y[l]=e[v[l]];if(c.filter.call(this,e)){if(t=n(),i)for(a=0;a<i.length;a++)i[a].scope===t&&r(e,i[a],t);if(o in m)for(var a=0;a<m[o].length;a++)r(e,m[o][a],t)}}function r(e,n,t){var o;if(n.scope===t||"all"===n.scope){o=n.mods.length>0;for(var r in y)(!y[r]&&n.mods.indexOf(+r)>-1||y[r]&&-1===n.mods.indexOf(+r))&&(o=!1);(0!==n.mods.length||y[16]||y[18]||y[17]||y[91])&&!o&&"*"!==n.shortcut||!1===n.method(e,n)&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0))}}function i(e,n){if(e.length!==n.length)return!1;for(var t=0;t<e.length;t++)if(e[t]!==n[t])return!1;return!0}function f(e){for(var n=e.slice(0,e.length-1),t=0;t<n.length;t++)n[t]=p[n[t]];return n}function l(e){var n;return e=e.replace(/\s/g,""),""===(n=e.split(","))[n.length-1]&&(n[n.length-2]+=","),n}function a(n){var t=n.keyCode||e.which||e.charCode,o=g.indexOf(t);if(o>=0&&g.splice(o,1),93!==t&&224!==t||(t=91),t in y){y[t]=!1;for(var r in p)p[r]===t&&(c[r]=!1)}}function c(e,n,t){var o=l(e),r=[],i=0;for(void 0===t&&(t=n,n="all");i<o.length;i++)r=[],(e=o[i].split("+")).length>1&&(r=f(e),e=[e[e.length-1]]),(e="*"===(e=e[0])?"*":w(e))in m||(m[e]=[]),m[e].push({shortcut:o[i],scope:n,method:t,key:o[i],mods:r})}Array.prototype.indexOf||(Array.prototype.indexOf=function(e){for(var n=0;n<this.length;n++)if(this[n]===e)return n;return-1});for(var u,d=navigator.userAgent.toLowerCase().indexOf("firefox")>0,s={backspace:8,tab:9,clear:12,enter:13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,home:36,end:35,pageup:33,pagedown:34,"⇪":20,CapsLock:20,",":188,".":190,"/":191,"`":192,"-":d?173:189,"=":d?61:187,";":d?59:186,"'":222,"[":219,"]":221,"\\":220},h="all",p={"⇧":16,shift:16,"⌥":18,alt:18,option:18,"⌃":17,ctrl:17,control:17,"⌘":d?224:91,command:d?224:91},g=[],v={16:"shiftKey",18:"altKey",17:"ctrlKey"},y={16:!1,18:!1,17:!1},w=function(e){return s[e]||e.toUpperCase().charCodeAt(0)},m={},k=1;k<20;k++)s["f"+k]=111+k;v[d?224:91]="metaKey",y[d?224:91]=!1,t(document,"keydown",function(e){o(e)}),t(document,"keyup",function(e){a(e)}),u={setScope:function(e){h=e||"all"},getScope:n,deleteScope:function(e){var n,t,o;for(n in m)for(t=m[n],o=0;o<t.length;)t[o].scope===e?t.splice(o,1):o++},getPressedKeyCodes:function(e){return g.slice(0)},isPressed:function(e){return"string"==typeof e&&(e=w(e)),-1!==g.indexOf(e)},filter:function(e){var n=(e.target||e.srcElement).tagName;return!("INPUT"===n||"SELECT"===n||"TEXTAREA"===n)},unbind:function(e,t){for(var o,r,a=l(e),c=[],u=0;u<a.length;u++){if((o=a[u].split("+")).length>1&&(c=f(o)),e=o[o.length-1],e=w(e),void 0===t&&(t=n()),!m[e])return;for(var d=0;d<m[e].length;d++)(r=m[e][d]).scope===t&&i(r.mods,c)&&(m[e][d]={})}}};for(var x in u)c[x]=u[x];var C=window.hotkeys;return c.noConflict=function(e){return e&&window.hotkeys===c&&(window.hotkeys=C),c},window.hotkeys=c,c});
/*! hotkeys-js v2.0.2 | MIT (c) 2017 kenny wang <wowohoo@qq.com> | https://github.com/jaywcjlove/hotkeys.git */
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).hotkeys=e()}}(function(){function n(e){return h[e.toUpperCase()]||e.toUpperCase().charCodeAt(0)}function t(e){g=e||"all"}function o(){return g||"all"}function r(e,n,t){e.addEventListener?e.addEventListener(n,t,!1):e.attachEvent&&e.attachEvent("on"+n,function(){t(window.event)})}function i(e){var n,t=e.keyCode||e.which||e.charCode,r=x["*"];if(-1===y.indexOf(t)&&y.push(t),93!==t&&224!==t||(t=91),t in m){m[t]=!0;for(var i in v)v[i]===t&&(d[i]=!0);if(!r)return}for(var a in m)m[a]=e[w[a]];if(d.filter.call(this,e)){if(n=o(),r)for(l=0;l<r.length;l++)r[l].scope===n&&f(e,r[l],n);if(t in x)for(var l=0;l<x[t].length;l++)f(e,x[t][l],n)}}function f(e,n,t){var o;if(n.scope===t||"all"===n.scope){o=n.mods.length>0;for(var r in m)(!m[r]&&n.mods.indexOf(+r)>-1||m[r]&&-1===n.mods.indexOf(+r))&&(o=!1);(0!==n.mods.length||m[16]||m[18]||m[17]||m[91])&&!o&&"*"!==n.shortcut||!1===n.method(e,n)&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0))}}function a(e,n){for(var t=e.length>=n.length?e:n,o=e.length>=n.length?n:e,r=0;r<t.length;r++)if(-1===o.indexOf(t[r]))return!1;return!0}function l(e){for(var n=e.slice(0,e.length-1),t=0;t<n.length;t++)n[t]=v[n[t].toLowerCase()];return n}function c(e){e||(e="");var n,t;for(t=(n=(e=e.replace(/\s/g,"")).split(",")).lastIndexOf("");t>=0;)n[t-1]+=",",n.splice(t,1),t=n.lastIndexOf("");return n}function s(n){var t=n.keyCode||e.which||e.charCode,o=y.indexOf(t);if(o>=0&&y.splice(o,1),93!==t&&224!==t||(t=91),t in m){m[t]=!1;for(var r in v)v[r]===t&&(d[r]=!1)}}function d(e,t,o){var r=c(e),i=[],f=0;for(void 0===o&&(o=t,t="all");f<r.length;f++)i=[],(e=r[f].split("+")).length>1&&(i=l(e)),(e="*"===(e=e[e.length-1])?"*":n(e))in x||(x[e]=[]),x[e].push({shortcut:r[f],scope:t,method:o,key:r[f],mods:i})}Array.prototype.indexOf||(Array.prototype.indexOf=function(e){for(var n=0;n<this.length;n++)if(this[n]===e)return n;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(e){for(var n=this.length-1;n>=0;n--)if(this[n]===e)return n;return-1});for(var u,p=navigator.userAgent.toLowerCase().indexOf("firefox")>0,h={backspace:8,tab:9,clear:12,enter:13,return:13,esc:27,escape:27,space:32,left:37,up:38,right:39,down:40,del:46,delete:46,home:36,end:35,pageup:33,pagedown:34,"⇪":20,capslock:20,",":188,".":190,"/":191,"`":192,"-":p?173:189,"=":p?61:187,";":p?59:186,"'":222,"[":219,"]":221,"\\":220},g="all",v={"⇧":16,shift:16,"⌥":18,alt:18,option:18,"⌃":17,ctrl:17,control:17,"⌘":p?224:91,cmd:p?224:91,command:p?224:91},y=[],w={16:"shiftKey",18:"altKey",17:"ctrlKey"},m={16:!1,18:!1,17:!1},x={},O=1;O<20;O++)h["f"+O]=111+O;w[p?224:91]="metaKey",m[p?224:91]=!1,r(document,"keydown",function(e){i(e)}),r(document,"keyup",function(e){s(e)}),u={setScope:t,getScope:o,deleteScope:function(e,n){var r,i,f;e||(e=o());for(r in x)for(i=x[r],f=0;f<i.length;)i[f].scope===e?i.splice(f,1):f++;o()===e&&t(n||"all")},getPressedKeyCodes:function(){return y.slice(0)},isPressed:function(e){return"string"==typeof e&&(e=n(e)),-1!==y.indexOf(e)},filter:function(e){var n=(e.target||e.srcElement).tagName;return!("INPUT"===n||"SELECT"===n||"TEXTAREA"===n)},unbind:function(e,t){for(var r,i,f=c(e),s=[],d=0;d<f.length;d++){if((r=f[d].split("+")).length>1&&(s=l(r)),e=r[r.length-1],e="*"===e?"*":n(e),t||(t=o()),!x[e])return;for(var u=0;u<x[e].length;u++)(i=x[e][u]).scope===t&&a(i.mods,s)&&(x[e][u]={})}}};for(var k in u)d[k]=u[k];var C=window.hotkeys;return d.noConflict=function(e){return e&&window.hotkeys===d&&(window.hotkeys=C),d},window.hotkeys=d,d});
{
"name": "hotkeys-js",
"version": "2.0.2",
"version": "2.0.3",
"description": "A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies.",

@@ -23,3 +23,4 @@ "author": "kenny wang <wowohoo@qq.com>",

"keyboard",
"shortcuts"
"shortcuts",
"keypress"
],

@@ -41,3 +42,4 @@ "repository": {

},
"license": "MIT",
"dependencies": {}
}
}

@@ -9,8 +9,8 @@ # 设置快捷键

```
__ __ __
```text
__ __ __
| |--..-----.| |_ | |--..-----..--.--..-----.
| || _ || _|| < | -__|| | ||__ --|
|__|__||_____||____||__|__||_____||___ ||_____|
|_____|
|_____|
```

@@ -33,8 +33,56 @@

## React中使用
## 使用
[react-hotkeys](https://github.com/jaywcjlove/react-hotkeys),安装如下:
```sh
npm i -S react-hot-keys
```
例子
```js
import React, { Component } from 'react';
import Hotkeys from 'react-hot-keys';
export default class HotkeysDemo extends Component {
constructor(props) {
super(props);
this.state = {
output: 'Hello, I am a component that listens to keydown and keyup of a',
}
}
onKeyUp(keyName, e, handle) {
console.log("test:onKeyUp", e, handle)
this.setState({
output: `onKeyUp ${keyName}`,
});
}
onKeyDown(keyName, e, handle) {
console.log("test:onKeyDown", keyName, e, handle)
this.setState({
output: `onKeyDown ${keyName}`,
});
}
render() {
return (
<Hotkeys
keyName="shift+a,alt+s"
onKeyDown={this.onKeyDown.bind(this)}
onKeyUp={this.onKeyUp.bind(this)}
>
<div style={{ padding: "50px" }}>
{this.state.output}
</div>
</Hotkeys>
)
}
}
```
## 使用
传统调用
```
```html
<script type="text/javascript" src="./js/hotkeys.js"></script>

@@ -99,10 +147,10 @@ ```

`⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, `⌘`。
`⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, `⌘`
`⌘` Command()
`⌃` Control
`⌥` Option(alt)
`⇧` Shift
`⇪` Caps Lock(大写)
~~`fn` 功能键就是fn(不支持)~~
`⌘` Command()
`⌃` Control
`⌥` Option(alt)
`⇧` Shift
`⇪` Caps Lock(大写)
~~`fn` 功能键就是fn(不支持)~~
`↩︎` return/enter

@@ -132,5 +180,7 @@ `space` 空格键

});
hotkeys('ctrl+o, enter', 'scope2', function(){
console.log('你好丑陋啊!');
});
// 你摁 “ctrl+o”组合键

@@ -140,20 +190,31 @@ // 当scope等于 scope1 ,执行 回调事件打印出 “你好看”,

// 通过setScope设定范围scope
hotkeys.setScope('scope1'); // 默认所有事儿都干哦
// 通过setScope设定范围scope
hotkeys.setScope('scope1'); // 默认所有事儿都干哦
```
## 删除标记快捷键
## 标记快捷键范围
删除区域范围标记
**删除** 区域范围标记
```js
hotkeys.deleteScope('issues');
hotkeys.deleteScope('scope1');
```
**获取** 区域范围标记
```js
hotkeys.getScope('scope1');
```
**设置** 区域范围标记
```js
hotkeys.setScope('scope1');
```
## 解除绑定
`hotkeys.unbind("ctrl+o, ctrl+alt+enter")` 解除绑定两组快捷键
`hotkeys.unbind("ctrl+o","files")` 解除绑定名字叫files钟的一组快捷键
`hotkeys.unbind("ctrl+o, ctrl+alt+enter")` 解除绑定两组快捷键
`hotkeys.unbind("ctrl+o","files")` 解除绑定名字叫files钟的一组快捷键
## 键判断

@@ -165,2 +226,3 @@

hotkeys('a', function(){
console.log(hotkeys.isPressed("a")); //=> true
console.log(hotkeys.isPressed("A")); //=> true

@@ -181,7 +243,7 @@ console.log(hotkeys.isPressed(65)); //=> true

## 过滤
`INPUT` `SELECT` `TEXTAREA` 默认不处理。
`hotkeys.filter` 返回 `true` 快捷键设置才会起作用,`flase` 快捷键设置失效。
`INPUT` `SELECT` `TEXTAREA` 默认不处理。
`hotkeys.filter` 返回 `true` 快捷键设置才会起作用,`false` 快捷键设置失效。
```javascript

@@ -191,9 +253,9 @@ hotkeys.filter = function(event){

}
//如何增加过滤可编辑标签 <div contentEditable="true"></div>
//contentEditable老浏览器不支持滴
// 如何增加过滤可编辑标签 <div contentEditable="true"></div>
// contentEditable老浏览器不支持滴
hotkeys.filter = function(event) {
var tagName = (event.target || event.srcElement).tagName;
return !(tagName.isContentEditable ||
tagName == 'INPUT' ||
tagName == 'SELECT' ||
return !(tagName.isContentEditable ||
tagName == 'INPUT' ||
tagName == 'SELECT' ||
tagName == 'TEXTAREA');

@@ -219,6 +281,6 @@ }

hotkeys()
// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
// @ VM2170:2InjectedScript._evaluateOn
// @ VM2165:883InjectedScript._evaluateAndWrap
// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
// @ VM2170:2InjectedScript._evaluateOn
// @ VM2165:883InjectedScript._evaluateAndWrap
// @ VM2165:816InjectedScript.evaluate @ VM2165:682
```
//IE对indexOf方法的支持
if(!Array.prototype.indexOf){
Array.prototype.indexOf = function(obj){
for(var i=0; i<this.length; i++) if(this[i]===obj) return i;
return -1;
};
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj) {
for (var i = 0; i < this.length; i++) if (this[i] === obj) return i;
return -1;
};
}
var _api,//对外API
isff = navigator.userAgent.toLowerCase().indexOf('firefox') > 0,
_keyMap = {//特殊键
backspace: 8, tab: 9, clear: 12,
enter: 13, 'return': 13,
esc: 27, escape: 27, space: 32,
left: 37, up: 38, right: 39, down: 40,
del: 46, 'delete': 46,
home: 36, end: 35,
pageup: 33, pagedown: 34,'⇪': 20,'CapsLock': 20,
',': 188, '.': 190, '/': 191,
'`': 192, '-': isff?173:189, '=': isff?61:187,
';': isff?59:186, '\'': 222,
'[': 219, ']': 221, '\\': 220
},
_scope = 'all',//默认热键范围
_modifier = {//修饰键
'⇧': 16, shift: 16,
'⌥': 18, alt: 18, option: 18,
'⌃': 17, ctrl: 17, control: 17,
'⌘': isff?224:91, command: isff?224:91
},
_downKeys=[],//记录摁下的绑定键
modifierMap = {
16:'shiftKey',
18:'altKey',
17:'ctrlKey'
},
_mods = { 16: false, 18: false, 17: false},
//返回键码
code = function(x){
return _keyMap[x] || x.toUpperCase().charCodeAt(0);
},
_handlers={};
// IE对lastIndexOf方法的支持
if (!Array.prototype.lastIndexOf) {
Array.prototype.lastIndexOf = function (obj) {
for (var i = this.length - 1; i >= 0; i--) if (this[i] === obj) return i;
return -1;
}
}
var _api, // 对外API
isff = navigator.userAgent.toLowerCase().indexOf('firefox') > 0,
_keyMap = { // 特殊键
backspace: 8, tab: 9, clear: 12,
enter: 13, 'return': 13,
esc: 27, escape: 27, space: 32,
left: 37, up: 38, right: 39, down: 40,
del: 46, 'delete': 46,
home: 36, end: 35,
pageup: 33, pagedown: 34,'⇪': 20,'capslock': 20,
',': 188, '.': 190, '/': 191,
'`': 192, '-': isff?173:189, '=': isff?61:187,
';': isff?59:186, '\'': 222,
'[': 219, ']': 221, '\\': 220
},
_scope = 'all', //默认热键范围
_modifier = { //修饰键
'⇧': 16, shift: 16,
'⌥': 18, alt: 18, option: 18,
'⌃': 17, ctrl: 17, control: 17,
'⌘': isff?224:91, cmd: isff?224:91, command: isff?224:91
},
_downKeys=[], // 记录摁下的绑定键
modifierMap = {
16:'shiftKey',
18:'altKey',
17:'ctrlKey'
},
_mods = { 16: false, 18: false, 17: false},
_handlers={};
// F1~F12 特殊键
for(var k=1;k<20;k++) {
_keyMap['f'+k] = 111+k;
for (var k=1; k<20; k++) {
_keyMap['f' + k] = 111 + k;
}
// 兼容Firefox处理
modifierMap[isff?224:91] = 'metaKey';
_mods[isff?224:91] = false;
modifierMap[isff ? 224 : 91] = 'metaKey';
_mods[isff ? 224 : 91] = false;
//设置获取当前范围(默认为'所有')
function setScope(scope){ _scope = scope || 'all';}
function getScope(){ return _scope || 'all';}
//绑定事件
// 返回键码
function code(x) { return _keyMap[x.toUpperCase()] || x.toUpperCase().charCodeAt(0); }
// 设置获取当前范围(默认为'所有')
function setScope(scope) { _scope = scope || 'all'; }
// 获取当前范围
function getScope() { return _scope || 'all'; }
// 绑定事件
function addEvent(object, event, method) {
if (object.addEventListener){
object.addEventListener(event, method, false);
}else if(object.attachEvent){
object.attachEvent('on'+event, function(){ method(window.event); });
}
if (object.addEventListener){
object.addEventListener(event, method, false);
} else if (object.attachEvent){
object.attachEvent('on'+event, function(){ method(window.event); });
}
}
//判断摁下的键是否为某个键,返回true或者false
// 判断摁下的键是否为某个键,返回true或者false
function isPressed(keyCode) {
if(typeof(keyCode) === 'string'){
keyCode = code(keyCode);//转换成键码
}
return _downKeys.indexOf(keyCode) !==-1;
if (typeof(keyCode) === 'string'){
keyCode = code(keyCode); // 转换成键码
}
return _downKeys.indexOf(keyCode) !== -1;
}
//获取摁下绑定键的键值
function getPressedKeyCodes (argument) { return _downKeys.slice(0);}
//处理keydown事件
function dispatch (event) {
var key = event.keyCode || event.which || event.charCode,
scope,asterisk = _handlers['*'];
//搜集绑定的键
if(_downKeys.indexOf(key)===-1) _downKeys.push(key);
//Gecko(Friefox)的command键值224,在Webkit(Chrome)中保持一致
//Webkit左右command键值不一样
if(key === 93 || key === 224) key = 91;
if(key in _mods) {
_mods[key] = true;
// 将特殊字符的key注册到 hotkeys 上
for(var k in _modifier)if(_modifier[k] === key) hotkeys[k] = true;
if(!asterisk) return;
}
//将modifierMap里面的修饰键绑定到event中
for(var e in _mods) _mods[e] = event[modifierMap[e]];
//表单控件控件过滤 默认表单控件不触发快捷键
if(!hotkeys.filter.call(this,event)) return;
//获取范围 默认为all
scope = getScope();
// 获取摁下绑定键的键值
function getPressedKeyCodes() { return _downKeys.slice(0); }
//对任何按键做处理
if(asterisk) for (i = 0; i < asterisk.length; i++) {
if(asterisk[i].scope === scope) eventHandler(event,asterisk[i],scope);
// 处理keydown事件
function dispatch(event) {
var key = event.keyCode || event.which || event.charCode,
scope,
asterisk = _handlers['*'];
// 搜集绑定的键
if (_downKeys.indexOf(key) === -1) _downKeys.push(key);
// Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致
// Webkit左右command键值不一样
if (key === 93 || key === 224) key = 91;
if (key in _mods) {
_mods[key] = true;
// 将特殊字符的key注册到 hotkeys 上
for (var k in _modifier) if (_modifier[k] === key) hotkeys[k] = true;
if(!asterisk) return;
}
// 将modifierMap里面的修饰键绑定到event中
for (var e in _mods) _mods[e] = event[modifierMap[e]];
// 表单控件过滤 默认表单控件不触发快捷键
if (!hotkeys.filter.call(this, event)) return;
// 获取范围 默认为all
scope = getScope();
// 对任何快捷键都需要做的处理
if (asterisk) {
for (i = 0; i < asterisk.length; i++) {
if (asterisk[i].scope === scope) eventHandler(event, asterisk[i], scope);
}
}
// key 不在_handlers中返回
if (!(key in _handlers)) return;
// key 不在_handlers中返回
if (!(key in _handlers)) return;
for(var i = 0; i < _handlers[key].length; i++) {
//找到处理内容
eventHandler(event,_handlers[key][i],scope);
}
for (var i = 0; i < _handlers[key].length; i++) {
// 找到处理内容
eventHandler(event, _handlers[key][i], scope);
}
}
function eventHandler(event,handler,scope){
var modifiersMatch;
//看它是否在当前范围
if(handler.scope === scope || handler.scope === 'all'){
//检查是否匹配修饰符(如果有返回true)
modifiersMatch = handler.mods.length > 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 eventHandler(event, handler, scope) {
var modifiersMatch;
// 看它是否在当前范围
if (handler.scope === scope || handler.scope === 'all') {
//检查是否匹配修饰符(如果有返回true)
modifiersMatch = handler.mods.length > 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);
// 解除绑定某个范围的快捷键
function unbind (key, scope) {
var multipleKeys = getKeys(key),
keys,
mods = [],
obj;
//判断是否传入范围,没有就获取范围
if(scope === undefined) scope = getScope();
for (var i = 0; i < multipleKeys.length; i++) {
// 将组合快捷键拆分为数组
keys = multipleKeys[i].split('+');
//如何key不在 _handlers 中返回不做处理
if (!_handlers[key]) return;
// 记录每个组合键中的修饰键的键码 返回数组
if (keys.length > 1) mods = getMods(keys);
//清空 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] = {};
}
}
// 获取除修饰键外的键值key
key = keys[keys.length - 1];
key = key === '*' ? '*' : code(key);
// 判断是否传入范围,没有就获取范围
if(!scope) 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++;
}
// 循环删除handlers中的所有 scope(范围)
function deleteScope(scope, newScope){
var key,
handlers,
i;
// 没有指定scope,获取scope
if (!scope) scope = getScope();
for (key in _handlers) {
handlers = _handlers[key];
for (i = 0; i < handlers.length; ) {
if (handlers[i].scope === scope) handlers.splice(i, 1);
else i++;
}
}
// 如果scope被删除,将scope重置为all
if (getScope() === scope) setScope(newScope || 'all');
}
//比较修饰键的数组
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;
var arr1 = a1.length >= a2.length ? a1 : a2
var arr2 = a1.length >= a2.length ? a2 : a1
for (var i = 0; i < arr1.length; i++) {
if (arr2.indexOf(arr1[i]) === -1) return false;
}
return true;
}
//表单控件控件判断 返回 Boolean
function filter(event){
var tagName = (event.target || event.srcElement).tagName;
//忽略这些标签情况下快捷键无效
return !(tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA');
// 表单控件控件判断 返回 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;
var mods = key.slice(0, key.length - 1);
for (var i = 0; i < mods.length; i++) mods[i] = _modifier[mods[i].toLowerCase()];
return mods;
}
//处理传的key字符串转换成数组
// 处理传的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;
if (!key) key = '';
var keys,index;
key = key.replace(/\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等
keys = key.split(','); // 同时设置多个快捷键,以','分割
index = keys.lastIndexOf('');
// 快捷键可能包含',',需特殊处理
for (; index >= 0;) {
keys[index - 1] += ',';
keys.splice(index, 1);
index = keys.lastIndexOf('');
}
return keys;
}
//在全局document上设置快捷键
// 在全局document上设置快捷键
addEvent(document, 'keydown', function(event) {
dispatch(event);
dispatch(event);
});
addEvent(document, 'keyup',function(event){
clearModifier(event);
clearModifier(event);
});
//清除修饰键
function clearModifier(event){
var key = event.keyCode || e.which || e.charCode,
i = _downKeys.indexOf(key);
if(i>=0) _downKeys.splice(i,1);
// 清除修饰键
function clearModifier(event) {
var key = event.keyCode || e.which || e.charCode,
i = _downKeys.indexOf(key);
//修饰键 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;
}
// 从列表中清除按压过的键
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;
// 将修饰键重置为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});
}
// 主体hotkeys函数
function hotkeys(key, scope, method){
var keys = getKeys(key), // 需要处理的快捷键列表
mods = [],
i = 0;
// 对为设定范围的判断
if (method === undefined) {
method = scope;
scope = 'all'; // 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 === '*' ? '*' : 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
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;
if ( deep && window.hotkeys === hotkeys ) {
window.hotkeys = _hotkeys;
}
return hotkeys;
};
window.hotkeys = hotkeys;
return hotkeys;
return hotkeys;

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc