我有两个函数。当按下回车键时,函数正常运行,但当按下escape键时,它就不正常了。退出键的正确数字是多少?
$(document).keypress(function(e) {
if (e.which == 13) $('.save').click(); // enter (works as expected)
if (e.which == 27) $('.cancel').click(); // esc (does not work)
});
我有两个函数。当按下回车键时,函数正常运行,但当按下escape键时,它就不正常了。退出键的正确数字是多少?
$(document).keypress(function(e) {
if (e.which == 13) $('.save').click(); // enter (works as expected)
if (e.which == 27) $('.cancel').click(); // esc (does not work)
});
当前回答
我一直用keyup和e.来捕捉escape键。
其他回答
与其硬编码函数中的keycode值,不如考虑使用命名常量来更好地传达你的意思:
var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;
$(document).keyup(function(e) {
if (e.keyCode == KEYCODE_ENTER) $('.save').click();
if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});
一些浏览器(如FireFox,不确定其他浏览器)定义了一个全局KeyEvent对象,为您公开这些类型的常量。这个SO问题也展示了在其他浏览器中定义该对象的好方法。
试试jEscape插件(从谷歌驱动器下载)
$(document).escape(function() {
alert('ESC button pressed');
});
或获得跨浏览器的键码
var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');
也许你可以用开关
var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
case 27:
alert('ESC');
break;
case 13:
alert('ENTER');
break;
}
解释其他答案没有解释的地方;问题是你用的按键。
也许事件只是命名错误,但按键被定义为当插入一个实际字符时触发。即文本。 而你想要的是keydown/keyup,它在用户按下keyey之前或之后触发。也就是键盘上的那些东西。
区别出现在这里,因为esc是一个控制字符(字面上是“非打印字符”),因此不写入任何文本,因此甚至不触发按键。 enter是奇怪的,因为即使你使用它作为一个控制字符(即控制UI),它仍然插入一个换行字符,这将触发按键。
来源:quirksmode
我知道这个问题是在问jquery,但是对于那些使用jqueryui的人来说,许多键码都有常量:
$.ui.keyCode.ESCAPE
http://api.jqueryui.com/jQuery.ui.keyCode/
你最好的选择是
$(document).keyup(function(e) {
if (e.which === 13) $('.save').click(); // enter
if (e.which === 27) $('.cancel').click(); // esc
/* OPTIONAL: Only if you want other elements to ignore event */
e.preventDefault();
e.stopPropagation();
});
总结
哪个比keyCode更可取,因为它是规范化的 Keyup比keydown更可取,因为如果用户一直按下,keydown可能会出现多次。 不要使用按键,除非你想捕捉实际的字符。
有趣的是,Bootstrap在下拉组件中使用keydown和keyCode(从3.0.2开始)!我觉得这是个糟糕的选择。
来自JQuery文档的相关片段
而浏览器使用不同的 属性来存储这些信息,jQuery规范化了 属性,以便您可以可靠地使用它来检索密钥代码。这 代码对应键盘上的一个键,包括特殊的代码 键,如箭头。为了捕获实际的文本输入,.keypress()可能 是一个更好的选择。
其他有趣的项目:JavaScript按键库