如何知道 .keyup() 是否是字符键(jQuery)
$("input").keyup(function() {
if (key is a character) { //such as a b A b c 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc
/* Do stuff */
}
});
如何知道 .keyup() 是否是字符键(jQuery)
$("input").keyup(function() {
if (key is a character) { //such as a b A b c 5 3 2 $ # ^ ! ^ * # ...etc not enter key or shift or Esc or space ...etc
/* Do stuff */
}
});
您无法通过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));
}
});
keyup
并keydown
为您提供有关按下的物理键的信息。keyCode
在标准布局中的标准美式/英式键盘上,这些事件的属性与它们所代表的字符之间似乎存在相关性。然而,这并不可靠:不同的键盘布局会有不同的映射。
注意:事后看来,这是一个快速而肮脏的答案,可能不适用于所有情况。要获得可靠的解决方案,请参阅Tim Down 的答案(在此处复制粘贴,因为此答案仍在获得意见和支持):
你不能用 keyup 事件可靠地做到这一点。如果您想了解有关输入字符的信息,则必须改用 keypress 事件。
以下示例在大多数浏览器中始终有效,但您应该注意一些边缘情况。对于我认为这方面的权威指南,请参阅 http://unixpapa.com/js/key.html。
$("input").keypress(function(e) { if (e.which !== 0) { alert("Character was typed. It was: " + String.fromCharCode(e.which)); } });
keyup
并keydown
为您提供有关按下的物理键的信息。keyCode
在标准布局中的标准美式/英式键盘上,这些事件的属性与它们所代表的字符之间似乎存在相关性。然而,这并不可靠:不同的键盘布局会有不同的映射。
以下是原始答案,但不正确,可能无法在所有情况下可靠地工作。
将键码与单词字符匹配(例如,a
会匹配。space
不会)
$("input").keyup(function(event)
{
var c= String.fromCharCode(event.keyCode);
var isWordcharacter = c.match(/\w/);
});
好的,这是一个快速的答案。方法是一样的,但要注意 keycode 问题,请参阅 quirksmode 中的这篇文章。
我对给出的其他答案并不完全满意。他们都有某种缺陷。
使用keyPress
withevent.which
是不可靠的,因为您无法捕获退格或删除(如 Tarl 所述)。使用keyDown
(如 Niva 和 Tarl 的答案)要好一些,但该解决方案存在缺陷,因为它尝试使用event.keyCode
with String.fromCharCode()
(keyCode 和 charCode 不一样!)。
但是,我们对keydown
orkeyup
事件所做的是实际按下的键 ( event.key
)。据我所知,任何key
长度为 1 的字符都是字符(数字或字母),无论您使用哪种语言键盘。如果这不是真的,请纠正我!
然后是 asdf 的很长的回答。这可能完美无缺,但似乎有点矫枉过正。
所以这是一个简单的解决方案,可以捕获所有字符、退格和删除。(注意:要么keyup
或keydown
将在这里工作,但keypress
不会)
$("input").keydown(function(event) {
var isWordCharacter = event.key.length === 1;
var isBackspaceOrDelete = event.keyCode === 8 || event.keyCode === 46;
if (isWordCharacter || isBackspaceOrDelete) {
// do something
}
});
这对我有帮助:
$("#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)
{ ...
如果您只需要排除 outenter
和键escape
,spacebar
您可以执行以下操作:
$("#text1").keyup(function(event) {
if (event.keyCode != '13' && event.keyCode != '27' && event.keyCode != '32') {
alert('test');
}
});
您可以在此处参考完整的键码列表以进行进一步修改。
我想做到这一点,我想到了一个涉及keyup和keypress事件的解决方案。
(我没有在所有浏览器中测试过,但是我使用了在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 (i.e. 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);
我从不喜欢关键代码验证。我的方法是查看输入是否有文本(任何字符),确认用户正在输入文本并且没有其他字符
$('#input').on('keyup', function() {
var words = $(this).val();
// if input is empty, remove the word count data and return
if(!words.length) {
$(this).removeData('wcount');
return true;
}
// if word count data equals the count of the input, return
if(typeof $(this).data('wcount') !== "undefined" && ($(this).data('wcount') == words.length)){
return true;
}
// update or initialize the word count data
$(this).data('wcount', words.length);
console.log('user tiped ' + words);
// do you stuff...
});
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<input type="text" name="input" id="input">
</body>
</html>