【问题标题】:Managing JavaScript hotkeys in Chrome Browser在 Chrome 浏览器中管理 JavaScript 热键
【发布时间】:2012-12-01 01:36:16
【问题描述】:

我在我建立的网站上有以下 jQuery 代码:

$(document).ready(function() {
  // Other Bindings/Initializations Removed

  // Hotkey Event Handler to 'doSomething'
  //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  $(document).keypress("a",function(e) {
    if(e.altKey) { // Doesn't work
      doSomething();
    }
  });

  // Hotkey Event Handler to 'doSomething'
  //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  $(document).keypress("a",function(e) {
    if(e.shiftKey) { //Works as Expected?
      doSomething();
    }
  });

});

代码捕获按键组合事件,在本例中为“Alt-A”,然后继续调用执行适当操作的函数。我在 FireFox 中测试了此功能,并按预期调用了该功能。当我在 Chrome 中测试该功能时,该功能未被调用,而是发出了令人讨厌的错误提示音。我认为也许“Alt-A”与一个重要的浏览器热键组合发生冲突,因此将“A”更改为“N”、“G”,然后是“K”;每次未调用该函数并发出错误音时。但是,当我创建 Shift-A/N/G/K 热键组合时,Chrome 按预期调用了该功能。

  1. 为什么 Chrome 处理“Alt”键的方式不同?

  2. 如何为我的网站定义一个热键,以便它可以使用“Alt”键在 Chrome 中运行?

【问题讨论】:

  • doSomething() 之后添加:e.preventDefault() 是否可以解决问题?
  • 在 doSomething() 之后添加 e.preventDefault() 并不能解决问题。这是建议。

标签: javascript jquery google-chrome cross-browser


【解决方案1】:

这在 Chrome 和 Firefox 中有效,但在 IE 中 Alt+a 打开收藏夹菜单。我不确定你会如何覆盖它。

Fiddle

HTML:

<a accesskey="a">​

Javascript:

$(document).ready(function() {
    // Other Bindings/Initializations Removed
    // Hotkey Event Handler to 'doSomething'
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    $(document).keypress("a", function(e) {

        if (e.shiftKey) { //Works as Expected?
            alert("shift a");
        }

        if (e.altKey) {
            alt_a_function();
        }

    });

    $(document).on("click", "[accesskey=a]", function() {
        alt_a_function();
    });

});

function alt_a_function() {
    alert("alt a");
}​

【讨论】:

    【解决方案2】:

    jQuery 文档说.keypress() 的第一个参数是“将传递给事件处理程序的数据映射”。当该对象是字符串时,jQuery 可能会感到困惑,这会导致 Chrome 出错。

    要检查事件处理程序中的特定键,请改用e.which 来获取字符代码。

    【讨论】:

    • Shift+a/n/g/k 在 Chrome 中有效,但在 Alt+a/n/g/k 中无效...为什么 Chrome 不喜欢 alt 键?
    • 这出现在谷歌快速搜索中:code.google.com/p/chromium/issues/detail?id=24838 这是一张旧票,但原因可能仍然相同。
    • 有趣的是,理性的“按键应该只在按下的键会生成内容时生成事件”似乎不成立,因为 Shift 和 Ctrl 键似乎正在生成 keyPress 事件,并且它们将与 Alt 键属于同一类别;不生成内容。这仍然可能是问题所在,Chrome 浏览器缺陷。
    • 编辑或创建一个新答案,包括对有关 Alt 键的 Chrome 浏览器缺陷的引用,我将接受该答案。
    • 我不确定我是否可以发布声称 Chrome 缺陷的答案 :-) 根据 W3C:w3.org/TR/DOM-Level-3-Events/#event-type-keypress“用户代理必须在按下某个键时发送此事件,如果并且仅当该键通常产生字符值时。”
    猜你喜欢
    • 2020-06-13
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2012-11-14
    • 2017-12-10
    相关资源
    最近更新 更多