Project Icon

hotkeys-js

JavaScript键盘快捷键库 体积小巧功能丰富

hotkeys-js是一个轻量级JavaScript键盘快捷键库,体积仅6kB且无依赖。支持组合键、作用域和过滤等功能,可方便地在Web应用中定义和管理快捷键。兼容主流浏览器,不干扰其他库或框架。开发者可通过npm或CDN使用,轻松实现快捷键功能。

快捷键

给我买杯咖啡 无依赖 GitHub Actions CI 覆盖率状态 jaywcjlove/hotkeys-js jaywcjlove/hotkeys-js

HotKeys.js 是一个具有一些特殊功能的输入捕获库,易于上手和使用,体积合理(~6kB)(gzip压缩后:2.8kB),且没有依赖。它不应该干扰任何JavaScript库或框架。官方文档演示预览更多示例

╭┈┈╮          ╭┈┈╮  ╭┈┈╮
┆  ├┈┈..┈┈┈┈┈.┆  └┈╮┆  ├┈┈..┈┈┈┈┈..┈┈.┈┈..┈┈┈┈┈.
┆     ┆┆  □  ┆┆   ┈┤┆    < ┆  -__┘┆  ┆  ┆┆__ ┈┈┤
╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈┈╯╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈  ┆╰┈┈┈┈┈╯
                                  ╰┈┈┈┈┈╯

使用方法

你需要在系统上安装 Node.js

npm install hotkeys-js --save
import hotkeys from 'hotkeys-js';

hotkeys('f5', function(event, handler){
  // 阻止 WINDOWS 系统下的默认刷新事件
  event.preventDefault()
  alert('你按下了 F5!')
});

或者手动下载并在你的 HTML 中链接 hotkeys.js,也可以通过 UNPKG 下载:

CDN:UNPKG | jsDelivr | Githack | Statically | bundle.run

<script src="https://unpkg.com/hotkeys-js/dist/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 中使用

react-hotkeys 是一个监听键盘按下和释放事件的 React 组件,用于定义和分发键盘快捷键。详细使用方法请参见其文档 react-hotkeys

react-hotkeys-hook - 用于在组件中使用键盘快捷键的 React 钩子。请确保你安装的 react 和 react-dom 版本至少为 16.8,否则钩子将无法工作。

浏览器支持

Hotkeys.js 已经经过测试,应该可以在以下浏览器中工作。

Internet Explorer 6+
Safari
Firefox
Chrome

支持的按键

HotKeys 支持以下修饰键:shiftoptionaltctrlcontrolcommand

以下特殊键可用于快捷键:backspace、tab、clear、enter、return、esc、escape、space、up、down、left、right、home、end、pageup、pagedown、del、delete、f1 到 f19、num_0 到 num_9、num_multiply、num_add、num_enter、num_subtract、num_decimal、num_divide。

Command() Control Option(alt) Shift Caps Lock(Capital) fn 不支持 fn ↩︎ return/Enter space

定义快捷键

暴露了一个全局方法 key,直接调用即可定义快捷键。

hotkeys([keys:<String>], [option:[string|object|function]], [callback:<function>])
hotkeys('f5', function(event, handler) {
  // 阻止 WINDOWS 系统下的默认刷新事件
  event.preventDefault();
  alert('你按下了 F5!');
});

// 返回 false 可以阻止事件并防止默认浏览器事件
// Mac OS 系统将 `command + r` 定义为刷新快捷键
hotkeys('ctrl+r, command+r', function() {
  alert('停止刷新!');
  return false;
});

// 单个按键
hotkeys('a', function(event,handler){
  //event.srcElement: input
  //event.target: input
  if(event.target === "input"){
      alert('你按下了 a!')
  }
  alert('你按下了 a!')
});

// 组合键
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);
  }
});

hotkeys('ctrl+a+s', function() {
    alert('你按下了 ctrl+a+s!');
});

// 使用作用域
hotkeys('*','wcj', function(event){
  console.log('做些事情', event);
});

选项

  • scope<String>
  • element<HTMLElement>
  • keyup<Boolean>
  • keydown<Boolean>
  • splitKey<string> (默认为 +)
  • capture<Boolean>
  • single<Boolean>
hotkeys('o, enter', {
  scope: 'wcj',
  element: document.getElementById('wrapper'),
}, function() {
  console.log('做些其他事情');
});

hotkeys('ctrl-+', { splitKey: '-' }, function(e) {
  console.log('你按下了 ctrl 和 +');
});

hotkeys('+', { splitKey: '-' }, function(e){
  console.log('你按下了 +');
})

keyup

按键按下按键释放都执行回调事件。

hotkeys('ctrl+a,alt+a+s', {keyup: true}, function(event, handler) {
  if (event.type === 'keydown') {
    console.log('keydown:', event.type, handler, handler.key);
  }

  if (event.type === 'keyup') {
    console.log('keyup:', event.type, handler, handler.key);
  }
});

API 参考

星号 "*"

修饰键判断

hotkeys('*', function() {
  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 被按下!');
  }
});

setScope

使用 hotkeys.setScope 方法设置作用域。除了 'all' 之外,只能有一个活动作用域。默认情况下,'all' 始终处于活动状态。

// 使用作用域定义快捷键
hotkeys('ctrl+o, ctrl+alt+enter', 'issues', function() {
  console.log('做些事情');
});
hotkeys('o, enter', 'files', function() {
  console.log('做些其他事情');
});

// 设置作用域(只有 'all' 和 'issues' 的快捷键会生效)
hotkeys.setScope('issues'); // 默认作用域是 'all'

getScope

使用 hotkeys.getScope 方法获取作用域。

hotkeys.getScope();

deleteScope

使用 hotkeys.deleteScope 方法删除作用域。这也会删除与之关联的所有热键。

hotkeys.deleteScope('issues');

如果需要在删除后设置新的作用域,可以使用第二个参数。

hotkeys.deleteScope('issues', 'newScopeName');

unbind

与定义快捷键类似,可以使用 hotkeys.unbind 解绑快捷键。

// 解绑 '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();

isPressed

例如,如果当前按下 M 键,则 hotkeys.isPressed(77) 为 true。

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

trigger

触发快捷键事件

hotkeys.trigger('ctrl+o');
hotkeys.trigger('ctrl+o', 'scope2');

getPressedKeyCodes

返回当前按下的键码数组。

hotkeys('command+ctrl+shift+a,f', function() {
  console.log(hotkeys.getPressedKeyCodes()); //=> [17, 65] 或 [70]
})

getPressedKeyString

返回当前按下的键码数组。

hotkeys('command+ctrl+shift+a,f', function() {
  console.log(hotkeys.getPressedKeyString()); //=> ['⌘', '⌃', '⇧', 'A', 'F']
})

getAllKeyCodes

获取所有注册的键码列表。

hotkeys('command+ctrl+shift+a,f', function() {
  console.log(hotkeys.getAllKeyCodes());
  // [
  //   { scope: 'all', shortcut: 'command+ctrl+shift+a', mods: [91, 17, 16], keys: [91, 17, 16, 65] },
  //   { scope: 'all', shortcut: 'f', mods: [], keys: [42] }
  // ]
})

filter

默认情况下,热键在 INPUTSELECTTEXTAREA 元素中不会启用。Hotkeys.filter 返回 true 时快捷键设置生效,返回 false 时快捷键设置失效。

hotkeys.filter = function(event){
  return true;
}
// 如何为可编辑标签添加过滤器。<div contentEditable="true"></div>
// "contentEditable" 不支持的旧浏览器会忽略
hotkeys.filter = function(event) {
  var target = event.target || event.srcElement;
  var tagName = target.tagName;
  return !(target.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;
}

noConflict

放弃 HotKeys 对 hotkeys 变量的控制。

var k = hotkeys.noConflict();
k('a', function() {
  console.log("do something")
});

hotkeys()
// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
// @ VM2170:2InjectedScript._evaluateOn
// @ VM2165:883InjectedScript._evaluateAndWrap
// @ VM2165:816InjectedScript.evaluate @ VM2165:682

开发

要进行开发,请安装依赖并获取代码:

$ git https://github.com/jaywcjlove/hotkeys.git
$ cd hotkeys     # 进入目录
$ npm install    # 或  yarn install

要进行开发,运行自动重载的构建:

$ npm run watch

运行文档网站环境。

$ npm run doc

要贡献,请 fork Hotkeys.js,添加您的补丁和相应的测试(在 test/ 文件夹中),然后提交一个拉取请求。

$ npm run test
$ npm run test:watch # 开发模式

贡献者

一如既往,感谢我们了不起的贡献者!

使用 github-action-contributors 制作。

许可证

MIT © Kenny Wong

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号