如何知道.keyup()是一个字符键(jQuery)

如何知道.keyup()是一个字符键(jQuery)

$("input").keyup(function() { if (key is a character) { //such as ab A bc 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc /* Do stuff */ } }); 

注意:事后看来,这是一个快速和肮脏的答案,可能不适用于所有情况。 要有一个可靠的解决scheme,请参阅Tim Down的答案 (复制粘贴在这里,因为这个答案仍然得到意见和upvotes):

使用keyup事件不能可靠地做到这一点。 如果你想知道键入的字符,就必须使用keypress事件。

以下示例将在大多数浏览器中一直运行,但有一些边缘情况应该注意。 关于这方面的权威指南,请参阅http://unixpapa.com/js/key.html

 $("input").keypress(function(e) { if (e.which !== 0) { alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); } }); 

keyupkeydown给你关于被按下的物理键的信息。 在标准布局的美国/英国标准键盘上,看起来这些事件的keyCode属性和它们所代表的字符之间有相关性。 但是,这是不可靠的:不同的键盘布局将有不同的映射。


以下是最初的答案,但不正确,可能在所有情况下都不可靠。

为了使键码与单词字符相匹配(例如, a匹配space不会)

 $("input").keyup(function(event) { var c= String.fromCharCode(event.keyCode); var isWordcharacter = c.match(/\w/); }); 

好的,这是一个快速的答案。 方法是一样的,但要小心keycode问题,请参阅quirksmode中的这篇文章 。

使用keyup事件不能可靠地做到这一点。 如果你想知道键入的字符,就必须使用keypress事件。

以下示例将在大多数浏览器中一直运行,但有一些边缘情况应该注意。 关于这方面的权威指南,请参阅http://unixpapa.com/js/key.html

 $("input").keypress(function(e) { if (e.which !== 0) { alert("Charcter was typed. It was: " + String.fromCharCode(e.which)); } }); 

keyupkeydown给你关于被按下的物理键的信息。 在标准布局的美国/英国标准键盘上,看起来这些事件的keyCode属性和它们所代表的字符之间存在相关性。 但是,这是不可靠的:不同的键盘布局将有不同的映射。

这对我有帮助:

 $("#input").keyup(function(event) { //use keyup instead keypress because: //- keypress will not work on backspace and delete //- keypress is called before the character is added to the textfield (at least in google chrome) var searchText = $.trim($("#input").val()); var c= String.fromCharCode(event.keyCode); var isWordCharacter = c.match(/\w/); var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); // trigger only on word characters, backspace or delete and an entry size of at least 3 characters if((isWordCharacter || isBackspaceOrDelete) && searchText.length > 2) { ... 

我对其他答案并不完全满意。 他们都有一些缺陷给他们。

使用keyPressevent.which是不可靠的,因为你不能赶上一个退格或删除(如Tarl所述)。 使用keyDown (如Tarl的答案)稍微好一些,但是解决scheme是有缺陷的,因为它尝试使用event.keyCodeString.fromCharCode() (keyCode和charCode不一样!)。

但是,我们对keydownkeyup事件所做的事情是被按下的实际键( event.key )。 据我所知,长度为1的任何key都是一个字符(数字或字母),无论您使用哪种语言的键盘。 如果不是这样,请纠正我的错误!

那么从asdf那里得到很长的回答。 这可能完美,但似乎是矫枉过正。


所以这是一个简单的解决scheme,可以捕获所有字符,退格和删除。 (注意: keyup或者keydown都可以在这里工作,但是keypress不会)

 $("input").keydown(function(e) { var isWordCharacter = event.key.length === 1; var isBackspaceOrDelete = (event.keyCode == 8 || event.keyCode == 46); if (isWordCharacter || isBackspaceOrDelete) { } }); 

如果您只需要排除enterescapespacebar键,则可以执行以下操作:

 $("#text1").keyup(function(event) { if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') { alert('test'); } }); 

看到它在这里的行动。

您可以参考完整的键码列表,以便进一步修改。

我想要做到这一点,我想到了一个解决scheme, 包括 keyup按键事件。

(我没有在所有的浏览器中testing过,但是我使用了http://unixpapa.com/js/key.html编译的信息);

编辑:重写它作为一个jQuery插件。

 (function($) { $.fn.normalkeypress = function(onNormal, onSpecial) { this.bind('keydown keypress keyup', (function() { var keyDown = {}, // keep track of which buttons have been pressed lastKeyDown; return function(event) { if (event.type == 'keydown') { keyDown[lastKeyDown = event.keyCode] = false; return; } if (event.type == 'keypress') { keyDown[lastKeyDown] = event; // this keydown also triggered a keypress return; } // 'keyup' event var keyPress = keyDown[event.keyCode]; if ( keyPress && ( ( ( keyPress.which >= 32 // not a control character //|| keyPress.which == 8 || // \b //|| keyPress.which == 9 || // \t //|| keyPress.which == 10 || // \n //|| keyPress.which == 13 // \r ) && !( keyPress.which >= 63232 && keyPress.which <= 63247 ) && // not special character in WebKit < 525 !( keyPress.which == 63273 ) && // !( keyPress.which >= 63275 && keyPress.which <= 63277 ) && // !( keyPress.which === event.keyCode && // not End / Home / Insert / Delete (ie in Opera < 10.50) ( keyPress.which == 35 || // End keyPress.which == 36 || // Home keyPress.which == 45 || // Insert keyPress.which == 46 || // Delete keyPress.which == 144 // Num Lock ) ) ) || keyPress.which === undefined // normal character in IE < 9.0 ) && keyPress.charCode !== 0 // not special character in Konqueror 4.3 ) { // Normal character if (onNormal) onNormal.call(this, keyPress, event); } else { // Special character if (onSpecial) onSpecial.call(this, event); } delete keyDown[event.keyCode]; }; })()); }; })(jQuery);