【问题标题】:javascript capture browser shortcuts (ctrl+t/n/w)javascript 捕获浏览器快捷方式 (ctrl+t/n/w)
【发布时间】:2011-09-03 19:52:26
【问题描述】:

是否可以捕获这些快捷方式?

  • Ctrl+N
  • Ctrl+T
  • Ctrl+W

我试过了,但它不起作用:

$(window).keydown(function(event) {
  console.log(event.keyCode);
  event.preventDefault();
});

当我按 T 时,它会在控制台中显示84,但如果我按 Ctrl+T 它什么也不显示,然后打开一个新标签。

我想捕获这些快捷方式并阻止任何浏览器操作。

【问题讨论】:

  • 忘记 CTRL + 键盘命令。以上就是 JavaScript...
  • 我可以覆盖 Ctrl+S、Ctrl+R 等等。我认为只有 3-4 个快捷方式不能被覆盖。
  • 如果您曾经在 StackOverflow 上输入过问题或答案,您肯定会发现它可能的。你有没有按过Ctrl+L?您希望光标跳转到地址栏,但 StackOverflow 会捕获它,并希望您的问题或答案中有一个 URL 链接。 DropBox 和 Google Docs 上也捕获了 Ctrl 快捷键。本着@Juhana 评论的精神,这很不幸。 (无论如何,这在 Linux 下是正确的。我不了解 Windows,也不了解它如何与 Apple 的专有修饰键配合使用。)

标签: jquery events browser keyboard-shortcuts


【解决方案1】:

在 Javascript 中捕获 Ctrl 键盘事件

示例代码:

$(window).keydown(function(event) {
  if(event.ctrlKey && event.keyCode == 84) { 
    console.log("Hey! Ctrl+T event captured!");
    event.preventDefault(); 
  }
  if(event.ctrlKey && event.keyCode == 83) { 
    console.log("Hey! Ctrl+S event captured!");
    event.preventDefault(); 
  }
});

火狐

(6.0.1 已测试)

在 Firefox 中,两个事件监听器都有效。如果您按 CtrlTCtrlS 组合键,您将在控制台和浏览器上同时收到消息不会打开标签,也不会要求保存。

有趣的是,如果您使用 alert 而不是 console.logevent.preventDefault() 将不起作用,并打开一个新选项卡或要求保存。也许这个错误需要修复。


Chrome3

在 Chrome 3 中它的工作方式与在 Firefox 中一样。


Chrome4

(已测试)

在 Chrome4 中,某些控制键组合已为浏览器保留 仅供使用,不能再被客户端 JavaScript 拦截 在网页中。
这些限制在 Chrome3 中不存在,并且与两者不一致 Firefox3/3.5 和 IE7/8(在 Windows 上)。

在 Chrome 4 中,它的工作方式类似于 Firefox,除了一些键盘组合:

  • CtrlN

  • CtrlShiftN

  • CtrlT

  • CtrlShiftT

  • CtrlW

  • CtrlShiftW

这些组合无法被 Javascript 捕获,嵌入插件可以捕获这些。例如,如果您专注于 Youtube 视频并按 CtrlT,浏览器将不会打开新标签页。


IE7/8

它就像在 Firefox 或 Chrome3 中一样工作。


IE9

(已测试)

IE9 又是一只害群之马,因为它不允许 javascript 捕获任何 Ctrl? 键盘事件。我用许多键盘组合(R、T、P、S、N、T)进行了测试,但都没有奏效。嵌入应用程序也无法捕获事件。用 Youtube 视频测试。


感谢@Lime 提供了很棒的link

【讨论】:

  • 我有 IE 9.0.6,我可以在 keydownup 以及 documentwindow.
  • @Yousef,你能阻止Ctrl+O吗?好像这个其他键不能被IE9困住。
  • @Yousef 您能否更新一下您是如何为 IE9 捕获 CTRL + 事件的?谢谢
  • @MuthuRaman 这是我的脚本:jsfiddle.net/pssxpgus 在 IE 中取消操作由 try { event.keyCode = 0; } catch(e) {} event.cancelBubble = true; event.returnValue = false; 完成
  • @Gergely Fehérvári @gkiko Ctrl+WCtrl+T 不再工作
【解决方案2】:

截至 2012 年 3 月 20 日,Chrome 修复程序允许 Web 应用程序在 js keydown 事件中处理 Chrome 中的 Control+NWT(因此它可以在纯 javascript 或任何类似 jQuery 的库中工作)。

如果 Chrome 在应用程序模式下打开,此修复允许 javascript 处理此组合键,可以通过以下方式完成:

这里记录了修复:

【讨论】:

  • 谢谢。可悲的是,对于我们这些希望阻止我们的用户使用 CTRL + W 的人来说,这是唯一的选择。我想要其他选项,因为我通过人们可能会意外关闭的浏览器界面运行管理工具。 :{ 像我这样的人可以有一个“你真的要关闭这个吗?”确认框。
  • @VaelVictus:对于您的特定用例,您应该能够通过window.onbeforeunload检测标签关闭事件
  • @Mark 谢谢!但是,它似乎不适用于我的 Chrome。 :/ 它只需要在 CTRL + W 上,并且在每一页上,无论它们是在“编辑”还是要保存一些东西。这是我的小提琴:jsfiddle.net/2qb3j
  • @VaelVictus:是的,我认为您无法通过事件检测到是否按下了 Ctrl 键,因为触发事件的不是按键,而是窗口关闭,它有不同的一组属性。但是,您可以跟踪键盘状态以查看是否按下了 Ctrl:jsfiddle.net/2qb3j/7 虽然如果窗口没有聚焦,onkeyup 不会正确触发......所以您可能需要一些摆弄。
  • 没有。触发事件的不是窗口关闭,而是按键本身。按键事件发生在窗口尝试关闭之前,因此您可以禁止此按键的默认事件处理(关闭窗口)并做任何您想做的事情。我有一个正在生产中的应用程序,正如解释的那样,使用 3 个键可以完美运行。所以这不仅仅是理论。你有没有在应用程序模式下打开你的小提琴?如果不是你的小提琴是完全没用的。它仅适用于应用程序模式。
【解决方案3】:

扩展其他答案:

在 Chrome/Chromium is defined here 中阻止某些组合的代码,我总结,F11 退出全屏模式并阻止所有操作和导航选项卡或窗口的内容:

[Shift]Ctrl(Q|N|W|T|制表符↹)

【讨论】:

    【解决方案4】:

    detect when the window is closed 可能是一个有效的选项,而不是捕获 Ctrl+W 热键:

    "当窗口、文档及其资源即将被卸载时触发 beforeunload 事件。

    当一个非空字符串分配给 returnValue 事件属性时,会出现一个对话框,要求用户确认离开页面(参见下面的示例)。当没有提供值时,事件被静默处理。”

    【讨论】:

      【解决方案5】:

      答案很简单:如果没有javascript中的一些技巧,这是不可能直接实现的。

      这取决于浏览器。大多数浏览器都会捕获此快捷方式并将其用于自己的事件。 (例如打开新标签)快捷方式永远不会到达 javascript 引擎。

      然而,使用 Flash 捕捉快捷方式很容易。但这与用户友好的网站相差甚远。

      更新:

      这里是一个简短的例子。当按下 Ctrl+y 时,大多数浏览器都会显示警报。 (y = 89)

      document.onkeydown = keyDownEvent;
      document.onkeyup = keyUpEvent;
      
      var isCtrl = false;
      
      function keyDownEvent() {
          var keyid = event.keyCode;
      
          if(keyid == 17) {
              isCtrl = true;
          }
      }
      
      function keyUpEvent() {
          var keyid = event.keyCode;
      
          if(keyid == 17) {
              isCtrl = false;
          }
      
          if(keyid == 89 && isCtrl == true) {
              alert('CTRL-Y pressed');   
          }
      }
      

      如果将 84 替换为代表 t 的 89,则不会发生任何事情。你可以试试on jsfiddle.net

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多