介绍
HotKeys.js是一个强大的Javascript库,用于捕获输入的键盘输入和键组合,而且是没有其他依赖关系(gzipped: 1.73kb)。如果你直接访问官方文档将能够直接体验到它强大的交互功能,
代码仓库
https://github.com/jaywcjlove/hotkeys/ https://gitee.com/jaywcjlove/hotkeys
PS:一下部分代码来自码云
为什么使用它?
在某些业务处理场景,在以往的桌面端软件开发中键鼠操作相对简单,而在Web开发中显得相对复杂,Hotkeys则帮助我们更好的在Web开发中让键盘操作变得更加简单,特别是一些没有鼠标的场景下显得尤为意义重大!
安装使用
使用npm进行安装
npm install hotkeys-js --save
import hotkeys from 'hotkeys-js';
hotkeys('f5', function(event, handler){
// 阻止WINDOWS系统下的默认刷新事件
event.preventDefault()
alert('you pressed F5!')
});
或者直接使用js文件
<script src="../hotkeys.min.js"></script>
<script type="text/javascript">
hotkeys('ctrl+a,ctrl+b,r,f', function (event, handler){
switch (handler.key) {
case 'ctrl+a': alert('您按下了 ctrl+a!');
break;
case 'ctrl+b': alert('您按下了 ctrl+b!');
break;
case 'r': alert('您按下了 r!');
break;
case 'f': alert('您按下了 f!');
break;
default: alert(event);
}
});
</script>
react中使用
npm install react-hot-keys --save
修饰键判断
可以对下面的修饰键判断 shift alt option ctrl control command,特别注意+和=键值相同,组合键设置⌘+=
hotkeys('shift+a,alt+d, w', function(e){
if(hotkeys.shift) console.log('您摁下了 shift 键!');
if(hotkeys.ctrl) console.log('您摁下了 ctrl 键!');
if(hotkeys.alt) console.log('您摁下了 alt 键!');
if(hotkeys.option) console.log('您摁下了 option 键!');
if(hotkeys.control) console.log('您摁下了 control 键!');
if(hotkeys.cmd) console.log('您摁下了 cmd 键!');
if(hotkeys.command) console.log('您摁下了 command 键!');
});
定义快捷键
看代码
hotkeys([keys:<String>], [option:[string|object|function]], [callback:<function>])
配置
- scope<String>
- element<HTMLElement>
- keyup<Boolean>
- keydown<Boolean>
hotkeys('o, enter', {
scope: 'wcj',
element: document.getElementById('warpper'),
}, function(){
console.log('do something else');
});
// 定义 F5 快捷键
hotkeys('f5', function(event,handler){
//event.srcElement: input //event.target: input// 阻止WINDOWS系统下的默认刷新事件
event.preventDefault()
alert('你按下了 F5 键!')
});
// 返回 false 将停止活动,并阻止默认浏览器事件
// Mac OS 系统 定义 `command+r` 为刷新快捷键
hotkeys('ctrl+r, command+r', function(){
alert('停止刷新!');
return false;
});
// 定义a快捷键
hotkeys('a', function(event,handler){
//event.srcElement: input //event.target: inputif(event.target === "input"){alert('你在输入框中按下了 a!')
}
alert('你按下了 a!')
});
// 定义 ctrl+a、ctrl+b、r、f 四组快捷键
hotkeys('ctrl+a,ctrl+b,r,f', function(event,handler){
switch(handler.key){
case "ctrl+a": alert('你按下了ctrl+a!'); break;
case "ctrl+b": alert('你按下了ctrl+b!'); break;
case "r": alert('你按下了r!'); break;
case "f": alert('你按下了f!'); break;
}
//handler.scope 范围
});
// 多个快捷方式做同样的事情
hotkeys('⌘+r, ctrl+r', function(){ });
// 对所有摁键执行任务
hotkeys('*','wcj', function(e){
console.log('干点活儿',e);
console.log("key.getScope()::",hotkeys.getScope());
if(hotkeys.shift) console.log('大哥你摁下了 shift 键!');
if(hotkeys.ctrl) console.log('大哥你摁下了 ctrl 键!');
if(hotkeys.alt) console.log('大哥你摁下了 alt 键!');
});
// 可以设置自定义的分割符
hotkeys('ctrl-y, ctrl-a', {splitKey: '-'}, function(e){
console.log('you press bind keys')
})
切换快捷键
如果在单页面在不同的区域,相同的快捷键,干不同的事儿,之间来回切换。
// 一个快捷键,有可能干的活儿不一样哦
hotkeys('ctrl+o, ctrl+alt+enter', 'scope1', function(){
console.log('你好看');
});
hotkeys('ctrl+o, enter', 'scope2', function(){
console.log('你好丑陋啊!');
});
// 你摁 “ctrl+o”组合键
// 当scope等于 scope1 ,执行 回调事件打印出 “你好看”,
// 当scope等于 scope2 ,执行 回调事件打印出 “你好丑陋啊!”,
// 通过setScope设定范围scope
hotkeys.setScope('scope1'); // 默认所有事儿都干
标记快捷键范围
删除 区域范围标记
hotkeys.deleteScope('scope1');
获取 区域范围标记
hotkeys.getScope();
设置 区域范围标记
hotkeys.setScope('scope1');
解除绑定
hotkeys.unbind() 解除绑定的所有快捷键 hotkeys.unbind("ctrl+o, ctrl+alt+enter") 解除绑定两组快捷键hotkeys.unbind("ctrl+o","files") 解除绑定名字叫files钟的一组快捷键
// 解除绑定 'a' 程序函数
hotkeys.unbind('a');
// 仅针对单个范围解除绑定快捷键
// 如果未指定范围,则默认为当前范围(hotkeys.getScope())
hotkeys.unbind('o, enter', 'issues');
hotkeys.unbind('o, enter', 'files');
- 通过函数来解除绑定
function example(){}
hotkeys('a', example);
hotkeys.unbind('a', example);
hotkeys('a', 'issues', example);
hotkeys.unbind('a', 'issues', example);
可以通过传入对象解除绑定的快捷键
hotkeys.unbind({
key: 'ctrl-e,ctrl-u',
scope: 'issues',
spitKey: '-'
})
传入数组可同时解除多个scope下绑定的快捷键
hotkeys.unbind([
{
key: 'a, ctrl+r',
scope: 'issues',
},
{
key: '+, ctrl-y',
scope: 'test',
splitKey: '-'
}
])
键判断
判断摁下的键是否为某个键
hotkeys('a', function(){
console.log(hotkeys.isPressed("a")); //=> trueconsole.log(hotkeys.isPressed("A")); //=> trueconsole.log(hotkeys.isPressed(65)); //=> true
});
获取摁下键值
获取摁下绑定键的键值
hotkeys.getPressedKeyCodes()
hotkeys('command+ctrl+shift+a,f', function(){
console.log(hotkeys.getPressedKeyCodes()); //=> [17, 65] 或者 [70]
})
keyup
key down 和 key up 将都执行回调事件。
hotkeys('ctrl+a,alt+a+s', { keyup: true }, (evn, handler) => {
if(evn.type === 'keydown') {
console.log('keydown:', evn.type, handler, handler.key);
}
if(evn.type === 'keyup') {
console.log('keyup:', evn.type, handler, handler.key);
}
});
过滤
INPUT SELECT TEXTAREA 默认不处理。 hotkeys.filter 返回 true 快捷键设置才会起作用,false 快捷键设置失效。
hotkeys.filter = function(event){
return true;
}
// 如何增加过滤可编辑标签 <div contentEditable="true"></div>
// contentEditable老浏览器不支持滴
hotkeys.filter = function(event) {
var tagName = (event.target || event.srcElement).tagName;
return !(tagName.isContentEditable ||
tagName == 'INPUT' ||
tagName == 'SELECT' ||
tagName == 'TEXTAREA');
}
//
hotkeys.filter = function(event){
var tagName = (event.target || event.srcElement).tagName;
hotkeys.setScope(/^(INPUT|TEXTAREA|SELECT)$/.test(tagName) ? 'input' : 'other');
return true;
}
兼容模式
var k = hotkeys.noConflict();
k('a', function() {
console.log("这里可以干一些事儿")
});
hotkeys()
// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
// @ VM2170:2InjectedScript._evaluateOn
// @ VM2165:883InjectedScript._evaluateAndWrap
// @ VM2165:816InjectedScript.evaluate @ VM2165:682
浏览器兼容性
浏览器兼容性不用担心,其具有相当高的兼容性,支持以下浏览器
- Internet Explorer 6+
- Safari
- Firefox
- Chrome
总结
Hotkeys让在Web开发中键盘操作更加简单,而且功能丰富、覆盖面广,非常容易集成到自己的Web项目中,如果你的项目需要类似的需求,那么Hotkeys将是你不二的选择,enjoy it!
PS:点击关注,获得更多Web方面的知识和推荐,感谢您的阅读!祝所有人新春快乐,平安健康!