Javascript 覆盖浏览器';键盘快捷键

Javascript 覆盖浏览器';键盘快捷键,javascript,Javascript,我想通过截取document对象的keypress事件处理程序,而不是accesskey属性,为我的web应用程序中的几个页面添加对键盘快捷键的支持 问题是,每个浏览器都有自己的键盘组合,因此不可能找到一组适用于所有web浏览器且一致的键盘组合。(例如,如果保存的快捷键是Ctrl+Shift+s,而删除的快捷键是Alt+d,那就太傻了。) 所以我想用我的浏览器在几页中完全覆盖浏览器快捷方式会更简单 撇开所有不利因素不谈,有可能吗?如果是这样的话,你是如何做到的?这里有一个很好的报道: onkey

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

问题是,每个浏览器都有自己的键盘组合,因此不可能找到一组适用于所有web浏览器且一致的键盘组合。(例如,如果保存的快捷键是Ctrl+Shift+s,而删除的快捷键是Alt+d,那就太傻了。)

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


撇开所有不利因素不谈,有可能吗?如果是这样的话,你是如何做到的?

这里有一个很好的报道:

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

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

以下是我解决这个问题的方法:

浏览器的大部分(如果不是全部)快捷方式将被覆盖。只有系统键,如Alt+Tab或Windows键不会

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;
    }
  }
}
以下是我的解决方案:

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;
           }
       }

在很多情况下,我认为这是行不通的。对于像“tab”这样的键,很多浏览器会在脚本能够正确改变键的行为之前拦截命令。
event.preventDefault
只在W3C兼容的浏览器上有效(如果有效),而不是(比如)通用web上的主控浏览器,微软的——当然,除非,您正在使用类似jQuery的库为您添加它。T.J.>您的意思是jQuery甚至可以在IE上覆盖键盘快捷键?您需要使用
e.preventDefault()处理按键事件;e、 停止传播()。在处理keydown时,需要记住的一点是,如果用户长时间按住该键,可能会出现多次。您应该在堆栈溢出时直接回答问题,而不是链接到其他地方(外部链接可能中断或更改,或者不直接回答问题)。看,我真的很讨厌当我使用StackOverflow的问题编辑器时Ctrl-L被偷走的方式。使编辑问题时进行web搜索变得更加困难。这并没有阻止ALT+E打开浏览器的编辑菜单。我们可以覆盖“ctrl+u”、“f12”吗。如果我们无法覆盖,我在想,当至少按下键时,我会再次在内部触发事件。然后,如果它被打开,它将被关闭。出于个人考虑,请避免覆盖浏览器之间一致的常见浏览器快捷方式,例如
C-w
C-t
C-s-t
。。。谷歌的一些产品覆盖了常见的浏览器快捷方式,这让人非常恼火!很难知道什么是“常见的”用户快捷方式。例如,许多用户是否使用
C-e
,或者覆盖是否相对较好?如果有一张使用每种浏览器快捷方式的用户百分比图表就太好了。@JKillian确实是,但是你在哪里衡量截止值呢?1%或0.5%的人仍然会感到恼火。我相信谷歌的工程师们都知道他们是区块捷径,但他们试图找到对更广泛受众有用的捷径。(还有一个问题,它们对更广泛的受众有用吗?)!这只会更改事件键代码,所选默认键不会执行任何操作