覆盖浏览器的键盘快捷键

Tom*_*ker 42 javascript

我想通过截取文档对象的keypress事件处理程序而不是accesskey属性,在我的Web应用程序中添加对键盘快捷键的支持.

问题是每个浏览器都有自己的键盘组合,因此不可能提出一组适用于所有Web浏览器并且一致的键盘组合.(例如,如果保存的快捷方式是Ctrl+ Shift+ S,那将是愚蠢的.一个删除是Alt+ D.)

所以我认为在我的几页中完全覆盖浏览器快捷方式会更简单.

抛开所有缺点,是否有可能?如果是这样,你怎么做?

ant*_*r15 35

onkeydown = function(e){
  if(e.ctrlKey && e.keyCode == 'S'.charCodeAt(0)){
    e.preventDefault();
    //your saving code
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 在很多情况下,我认为这不会起作用.使用像'tab'这样的键,很多浏览器会在脚本正确改变键的行为之前拦截命令. (7认同)
  • `event.preventDefault`只能在符合W3C标准的浏览器上运行(当它这样做时),而不是(比如说)一般网络上的主流浏览器,微软的 - 除非,当然,你正在使用像jQuery这样的库来添加它您. (4认同)
  • TJ>你的意思是jQuery甚至可以在IE上覆盖键盘快捷键? (4认同)

Bra*_*son 14

这里有一个很好的报道:http://unixpapa.com/js/key.html

至于是否应该这样做,stackoverflow的问题编辑器会覆盖相当多的键而不会中断太多(将鼠标悬停在工具栏按钮上).

  • 您应该直接在Stack Overflow上回答问题,而不是在其他地方链接(外部链接可能会中断或更改或不直接回答问题).请参阅[其他地方只包含链接的答案真的是"好的答案"吗?](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers ). (8认同)
  • 你需要使用`e.preventDefault();处理*keydown*事件; e.stopPropagation();`.处理keydown时要记住的一件事是,如果用户按下按键的时间更长,它可能会发生多次. (5认同)
  • 不过,当我使用 StackOverflow 的问题编辑器时,我真的很讨厌 Ctrl-L 被盗。使得编辑问题时进行网络搜索变得更加困难。 (2认同)

小智 10

以下是我对此问题的解决方案:

大多数(如果不是全部)浏览器的快捷方式都将被覆盖.只有系统的,如Alt+ TabWindows键不会.

document.onkeydown = overrideKeyboardEvent;
document.onkeyup = overrideKeyboardEvent;
var keyIsDown = {};

function overrideKeyboardEvent(e){
  switch(e.type){
    case "keydown":
      if(!keyIsDown[e.keyCode]){
        keyIsDown[e.keyCode] = true;
        // do key down stuff here
      }
    break;
    case "keyup":
      delete(keyIsDown[e.keyCode]);
      // do key up stuff here
    break;
  }
  disabledEventPropagation(e);
  e.preventDefault();
  return false;
}
function disabledEventPropagation(e){
  if(e){
    if(e.stopPropagation){
      e.stopPropagation();
    } else if(window.event){
      window.event.cancelBubble = true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这并不能阻止ALT + E显示浏览器的"编辑"菜单. (4认同)