如何使用jQuery检测键盘上的Enter键?

827

我希望能够使用jQuery检测用户是否按下了Enter键。

这是否可能?需要插件吗?

看起来我需要使用keypress()方法。

那个命令有没有浏览器问题-有没有任何浏览器兼容性问题我应该知道的?


这是关于.keypress() | jQuery API Documentation的链接。 - Haim Evgi
6
JavaScript框架中最好的一点就是它们默认情况下应该跨浏览器兼容。它们处理浏览器兼容性检查,这样用户就不必操心了。我没有阅读过jQuery的源代码,但我怀疑在这方面,键盘按键功能也不会有任何不同。 - miek
3
唯一的浏览器兼容性问题是,你应该使用e.which而不是e.keyCode来检测ASCII码。 - Daniel
1
https://dev59.com/_3VC5IYBdhLWcg3wbQXA - Lemo
20个回答

1492

jQuery的整个意义在于您不必担心浏览器差异。我相信您可以安全地在所有浏览器中将enter键视为13。因此,考虑到这一点,您可以这样做:

$(document).on('keypress',function(e) {
    if(e.which == 13) {
        alert('You pressed enter!');
    }
});

9
我提供这个链接是因为我阅读了它并且不理解为什么在IE中无法与$(window)绑定,也就是说keypress不能用。http://www.quirksmode.org/dom/events/keys.html - Incognito
18
e.keyCode并非完全跨浏览器兼容。请使用如下所示的e.which。 - Daniel
15
根据jQuery文档,“event.which”属性规范化了“event.keyCode”和“event.charCode”。建议使用“event.which”来监测键盘输入事件。 - Riccardo Galli
21
$(document).on('keypress', function(e) { 句子的意思是当文档对象接收到按键事件时,执行后面的代码。 - user956584
6
由于事件传播(即警报被触发两次),我正在获得给定函数的多个执行。为了阻止这种情况,请在函数末尾添加e.stopPropagation()。 - dpb
显示剩余7条评论

142

我编写了一个小插件,使绑定“按下回车键”事件更容易:

$.fn.enterKey = function (fnc) {
    return this.each(function () {
        $(this).keypress(function (ev) {
            var keycode = (ev.keyCode ? ev.keyCode : ev.which);
            if (keycode == '13') {
                fnc.call(this, ev);
            }
        })
    })
}

使用方法:

$("#input").enterKey(function () {
    alert('Enter!');
})

这对我不起作用(在<input>字段上我得到了#input - Rápli András
1
如果 #input 元素是动态的呢? - Jigar7521
@mplungjan,不确定您所说的“委派”是什么意思。 - Andrea
$("#input").on("someevent","someselector",function () {}) - mplungjan

70

我无法让Paolo Bergantino发布的代码正常工作,但当我将其更改为$(document)e.which而不是e.keyCode时,我发现它可以完美地工作。

$(document).keypress(function(e) {
    if(e.which == 13) {
        alert('You pressed Enter!');
    }
});

JS Bin上的示例链接


对我来说,e.which在IE上不起作用。它对其他人有效吗? - Umesh Rajbhandari
哪个版本的IE?在我的IE7上运行良好。 - Ian Roke
从jQuery文档中可以得知,“event.which”属性规范化了“event.keyCode”和“event.charCode”。建议使用“event.which”来监控键盘输入。 - Riccardo Galli

56

我发现这个方法在跨浏览器兼容性方面更好:

$(document).keypress(function(event) {
    var keycode = event.keyCode || event.which;
    if(keycode == '13') {
        alert('You pressed a "enter" key in somewhere');    
    }
});

1
你的三元条件语句可以缩短为: var keycode = event.keyCode || event.which; - pistol-pete
1
对于表单内的按钮,在弹出警告(或执行操作)前,我会先加入以下代码: event.preventDefault(); 这能够阻止表单的提交。 - Jorge Mauricio

43

您可以使用jQuery的“keydown”事件处理程序来实现此操作:

$("#start").on("keydown", function(event) {
  if(event.which == 13)
    alert("Entered!");
});

我使用这个答案是因为我需要检查特定的输入ID。谢谢。 - Faisal
由于这是一个键按下事件,我很担心如果用户按住回车键会多次触发。通常我更喜欢键抬起事件。但某些情况下可能需要使用它。这只是我的个人意见。 - Oliver M Grech

24

使用event.key和现代JavaScript!

$(document).keypress(function(event) {
    if (event.key === "Enter") {
        // Do something
    }
});

或者不使用jQuery:

document.addEventListener("keypress", function onEvent(event) {
    if (event.key === "Enter") {
        // Do something better
    }
});

Mozilla 文档

支持的浏览器


9
我想到了这个解决方案:
$(document).ready(function(){

  $('#loginforms').keypress(function(e) {
    if (e.which == 13) {
    //e.preventDefault();
    alert('login pressed');
    }
  });

 $('#signupforms').keypress(function(e) {
    if (e.which == 13) {
      //e.preventDefault();
      alert('register');
    }
  });
});

你应该花一些时间解释你的解决方案。一个解释是必要的。例如, 什么是主意/要点? 来自 帮助中心: "...总是解释为什么你提出的解决方案是合适的以及它是如何工作的". 请通过编辑(修改)你的回答来回应,而不是在这里评论(无需 "编辑:", "更新:" 或类似内容 - 回答应该看起来像是今天写的)。 - Peter Mortensen

7
一个小的扩展Andrea's answer使得帮助方法更有用,当您可能还想捕获修改后的回车键(即,Ctrl + EnterShift + Enter)。例如,这个变量允许绑定像这样的内容:
$('textarea').enterKey(function() {$(this).closest('form').submit(); }, 'ctrl')

当用户在表单的文本区域中聚焦并按下Ctrl + Enter时,提交表单。
$.fn.enterKey = function (fnc, mod) {
    return this.each(function () {
        $(this).keypress(function (ev) {
            var keycode = (ev.keyCode ? ev.keyCode : ev.which);
            if ((keycode == '13' || keycode == '10') && (!mod || ev[mod + 'Key'])) {
                fnc.call(this, ev);
            }
        })
    })
}

(另请参见 *在TEXTAREA中使用jQuery实现Ctrl + Enter

7

有一个keypress()事件方法。按键 Enter 的 ASCII 码是 13,不受使用的浏览器影响。


4
在某些情况下,您可能需要禁用页面的某个区域的ENTER键,但不需要禁用页面的其他区域,比如下面的页面包含一个带有搜索字段的标题<div>
我花了一点时间才弄清楚如何做到这一点,现在我将这个简单而完整的示例发布给社区。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test Script</title>
  <script src="/lib/js/jquery-1.7.1.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    $('.container .content input').keypress(function (event) {
      if (event.keyCode == 10 || event.keyCode == 13) {
        alert('Form Submission needs to occur using the Submit button.');
        event.preventDefault();
      }
    });
  </script>
</head>
  <body>
    <div class="container">
      <div class="header">
        <div class="FileSearch">
          <!-- Other HTML here -->
        </div>
      </div>
      <div class="content">
        <form id="testInput" action="#" method="post">
        <input type="text" name="text1" />
        <input type="text" name="text2" />
        <input type="text" name="text3" />
        <input type="submit" name="Submit" value="Submit" />
        </form>
      </div>
    </div>
  </body>
</html>
JSFiddle Playground链接[提交] 按钮没有任何反应,但从文本框控件中按下 ENTER 键不会提交表单。

但是需要解释一下。它是如何工作的?通过一些DOM魔法吗?这个想法/要点是什么?来自帮助中心:“...始终解释为什么您提出的解决方案是合适的以及它是如何工作的”。请通过编辑(更改)您的答案进行回复,而不是在此处进行评论(不包括“Edit:”,“Update:”或类似内容 - 答案应该看起来像今天编写的)。工作? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接