1

使用 jQuery 热键,我尝试将Alt+ HAlt+之类的快捷方式绑定C到我网站中的某些特定操作。事件传播在除 IE 之外的所有浏览器中停止(应该如此)。首先,是否有可能实现这一目标?如果是这样,怎么做?

这是一个代码示例:

jQuery(document).bind('keydown', 'Alt+H',
     function (event)
     {
        $this.toggleMenu( 'H' );
        if(jQuery.browser.msie) {
            event.cancelBubble = true;
        }
                    else
                    {
            event.stopPropagation();
        }
        return false;
     } );

在 IE 中,该行$this.toggleMenu( 'H' );被执行,但cancelbubble似乎没有效果(浏览器打开其“帮助”菜单)

4

1 回答 1

1

尝试这总是一件奇怪的事情(由于浏览器的内置热键等),但我很幸运地使用了 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 年代遗留的表单驱动应用程序,并希望获得广泛的键盘支持,这是可以理解的,尤其是当他们为此付费时!)

于 2013-04-11T23:02:44.960 回答