尝试这总是一件奇怪的事情(由于浏览器的内置热键等),但我很幸运地使用了 onKeyUp 事件。
keydown 的问题在于它可能一次只发送一个密钥。因此,如果您按 ALT 它是 keydown 的一个触发器,然后 C 是第二个触发器。KeyPress 在某些环境中也有问题,因为 ALT 和 CTRL 之类的修饰键不算作按键(我认为.. 谁能更好地解释这一点?)。
如果您使用 keyup,您可以检查是否按住 ALT 同时检查键。仍在解决问题,但试试这个(我只在 win7: ie9 和 chrome 中验证过):
$(window).keyup(function (e)
{
// warning: only tested with EN-US keyboard / locale
// check whether ALT pressed (and not ALT+CTRL, ALT+SHIFT, etc)
var key = e.key || String.fromCharCode(e.keyCode);
if (e.altKey && !e.ctrlKey && !e.shiftKey && key)
{
// if ALT pressed, handle the keycode shortcut
var keyPressed = key.toUpperCase(); // normalize input
switch (keyPressed)
{
case "C":
// do stuff for ALT-C
break;
case "H":
// do stuff for ALT-H
break;
}
}
});
问题/疑问:
- 使用 jQuery,但纯 JS 解决方案并不太复杂
- 是否可以通过取消事件来防止默认浏览器行为?
- 它可以在 Chrome 和 IE9 以外的浏览器中运行吗?(可能是FF和Safari)
- 如果用户在释放字母键之前释放 ALT 键,则它不起作用
- 如果用户在按 ALT 键之前按字母键,则它不起作用
- 尝试使用 ACCESSKEY 属性,但这只会设置焦点。我想单击超链接和/或基于某些 ALT-X 组合触发某些元素的 click() 事件。
- 虽然这对于企业 Web 应用程序来说可能是可以接受的(因为区域设置和浏览器支持通常是较窄的关注点,并且因为用户通常接受过软件培训),但对于网站来说可能是不可接受的(由于使用大量浏览器,增加复杂性的本地化问题等)......将不得不考虑更多。
希望这对某人有所帮助...随时提出建设性的批评,因为这是客户在我构建 Web 应用程序时总是询问的功能。(他们习惯了 80 年代和 90 年代遗留的表单驱动应用程序,并希望获得广泛的键盘支持,这是可以理解的,尤其是当他们为此付费时!)