覆盖浏览器的键盘快捷键

IT技术 javascript
2021-01-18 01:33:10

我想通过拦截文档对象的 keypress 事件处理程序,而不是 accesskey 属性,为我的 Web 应用程序中的几个页面添加对键盘快捷键的支持。

问题是,每个浏览器都有自己的组合键,因此不可能拿出一套键盘组合可在所有网络浏览器的工作,但一致的。(例如,它会是愚蠢的,如果在保存快捷为Ctrl+ Shift+ S,而删除的一个是Alt+ D。)

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

撇开所有不利因素不谈,这可能吗?如果是这样,你怎么做?

4个回答
onkeydown = function(e){
  if(e.ctrlKey && e.keyCode == 'S'.charCodeAt(0)){
    e.preventDefault();
    //your saving code
  }
}
在很多情况下,我认为这行不通。使用像“tab”这样的键,许多浏览器会在脚本正确改变键的行为之前拦截命令。
2021-03-18 01:33:10
TJ> 你的意思是 jQuery 甚至可以在 IE 上覆盖键盘快捷键?
2021-03-18 01:33:10
event.preventDefault 只在 W3C 兼容浏览器上工作(当它工作时),而不是(比如)通用网络上的主导浏览器,微软的——当然,除非你使用像 jQuery 这样的库为你添加它。
2021-04-08 01:33:10

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

至于这是否应该完成,stackoverflow 的问题编辑器覆盖了相当多的键而不会破坏太多(将鼠标悬停在工具栏按钮上)。

您应该直接在 Stack Overflow 上回答问题,而不是链接到其他地方(外部链接可能会中断或更改或不直接回答问题)。请参阅仅包含别处链接的答案真的是“好答案”吗?.
2021-03-26 01:33:10
不过,当我使用 StackOverflow 的问题编辑器时,我真的很讨厌 Ctrl-L 被盗的方式。在编辑问题时更难进行网络搜索。
2021-04-03 01:33:10
你需要处理的keydown与事件e.preventDefault(); e.stopPropagation();在处理 keydown 时要记住的一件事是,如果用户按住键的时间更长一点,它可能会发生多次。
2021-04-05 01:33: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;
    }
  }
}
这并没有阻止 ALT+E 调出浏览器编辑菜单。
2021-03-18 01:33:10
我们可以覆盖“ctrl + u”、“f12”吗?如果我们不能覆盖,我在想至少什么时候会按下键,我会在内部再次触发事件。然后,如果它被打开,它将被关闭。
2021-04-08 01:33:10

这是我的解决方案:

document.onkeydown = function () {
                       if ((window.event.keyCode == 121) && (window.event.ctrlKey))) {
               window.event.returnValue = false;
               window.event.cancelBubble = true;
               window.event.keyCode = 0;
               return false;
           }
       }
这只会更改事件键代码,所选默认键不会执行任何操作
2021-03-15 01:33:10