加上快捷键,让你的网站酷起来

伟大的程序员都懒 。
这话是我从《PHP 与 MySQL 程序设计》中看来的,来自于 Larry Wall 的一句话:
Most of you arewith theof a . There are three, of : , , and .
懒的程序员的特征是:能花一步完成的事绝不花两步,即便花一步那一步的时间也是越少越好 。所以他们做了很多工具来快捷完成一些繁琐耗时长的任务;放到 Web 上,就有人做了快捷键;这个技术难度并不高,但是把一些非常频繁的操作利用快捷键来触发的话,速度会快不少;毕竟,用鼠标在屏幕上定位一个点然后点击,是比定位键盘按键速度慢的 。
下图分别是 、、、微博、知乎、 的快捷键,不知道你以前有没有注意过,如果没有,下次打开这些网站的时候,在页面中输入「?」试试 。

加上快捷键,让你的网站酷起来

文章插图

加上快捷键,让你的网站酷起来

文章插图

加上快捷键,让你的网站酷起来

文章插图

加上快捷键,让你的网站酷起来

文章插图

加上快捷键,让你的网站酷起来

文章插图

加上快捷键,让你的网站酷起来

文章插图
键码与键名的映射表
首先你需要定义一张键码与键名的映射表:因为我们在文档上监听键盘相关的事件,keyup和,事件触发时根据我们获取的事件对象,能让我们判断是哪个按键的,只有事件对象的which和属性,而这都是以键码给出的,并不直观,尤其是在插件完成后注册快捷键时,非常不容易记忆和理解;
把你希望构成快捷键组合的所有按键,全部存进映射表中,可用如下方式给出:

在后续的程序中必要的时候,我们都需要把获取到的键码转换成键名,方便理解 。
思路
实际上,我们要解决的最主要的两个大问题:判断按键组合,触发组合事件;通俗地说就是:如何获取用户按下的快捷键(或者组合);用户按下组合按键后如何触发事件 。
判断按键组合
我之前一直说的是按键组合,但其实不一定要全部定义多个按键按下才能触发快捷功能,我们完全可以定义某个单个按键被按下时就触发某个行为;总体来说,各个实现了快捷键功能的网站,快捷键种类有以下三种:
加上快捷键,让你的网站酷起来

文章插图
当我们想做一个比较合格的插件时,需要能够处理以上三种情况;以及这三种情况的冲突解决 。这里的冲突的指的是:假如我们既定义了a执行某个功能Fa,又定义了b+a执行某个功能Fb,那么当用户按下b键之后继续按下a键,那么程序应当如何响应?是执行Fa还是Fb或者是两者都执行 。
我的建议是:在注册快捷键,尽量避免这样的冲突;如果实在无法避免,那这种情况下必须执行Fb,因为如果连用户已经按了多个按键,程序还不触发组合按键事件,那组合快捷键就永远捕获不到了;优先捕获按键组合,其次捕获单个按键 。
在网站上有一个快捷键组合m+y,可以快捷跳转到所有指派给「我」完成的问题;后面的叙述以这个例子来说明 。
在快捷键的触发过程中,当某个按键被按下时,我们需要获取它与当前被按下的其他按键所能构成的组合 。所以必然需要一个变量(数组)来保存任意时刻被按下的按键,因此我们需要监听keyup和事件;
当时,逻辑稍微复杂点,并且这也是整个快捷键功能的核心;