jQuery热键:阻止IE运行自己的快捷方式,如Alt + H.

时间:2011-02-18 05:52:54

标签: internet-explorer jquery-plugins keyboard-shortcuts event-propagation

使用jQuery热键,我尝试将 Alt + H Alt + 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似乎没有效果(浏览器打开其“帮助”菜单)

1 个答案:

答案 0 :(得分:1)

这总是一个奇怪的尝试(由于浏览器的内置热键等),但我很幸运使用了onKeyUp事件。

keydown的问题在于它一次只能发送一个密钥。因此,如果你点击ALT它是keydown的一个触发器,然后C是第二个触发器。 KeyPress在某些环境中也有probs,因为像ALT和CTRL这样的修饰键不算作按键(我想......任何人都可以更好地解释这个吗?)。

如果您使用键盘,您可以在检查键时检查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属性,但只设置焦点..我想要 单击超链接和/或触发某个元素的click()事件 在一些ALT-X组合上。
  • 虽然这对于企业Web应用程序来说是可以接受的(因为 区域设置和浏览器支持通常是较窄的焦点,并且自用户以来 通常是在软件上进行培训),这可能是不可接受的 网站(由于使用了大量浏览器,本地化 关注增加复杂性等等......)必须考虑它 还有一些。

希望这有助于某人......随意提出建设性的批评,因为这是客户在构建网络应用程序时总是询问的功能。 (他们习惯于80年代和90年代的传统表单驱动应用程序,并且需要大量的键盘支持,这是可以理解的,特别是当他们为此付费时!)