我有一个普通的文本框:
<input type="text">
我使用jQuery处理键盘事件:
$("input:text").keydown(function() {
// keydown code
}).keypress(function() {
// keypress code
}).keyup(function() {
// keyup code
});
用户在文本框中按键盘上的不同按键(如字母、数字、SHIFT、BACKSPACE、SPACE等),我需要检测用户按下了哪个会增加文本框值的键。例如,按下"A"键将增加文本框的长度,而按下"SHIFT"键则不会。我记得曾经看过PPK的一次讲座,在那里他提到了这两者之间的区别。这与事件-keydown与keypress-以及可能与事件属性-key、char、keyCode有关。
更新!
我需要在keydown或keypress处理程序中知道这些信息。我不能等待keyup事件发生。
为什么我需要这个:
我有一个文本框,它的大小根据用户的输入动态改变。您可以查看这个演示:http://vidasp.net/tinydemos/variable-size-text-box.html 在演示中,我有一个keydown和keyup处理程序。 keyup处理程序基于输入值调整文本框大小。但是,keydown处理程序将大小设置为比输入值大1个字符。我这样做的原因是,如果我不这样做,那么字符将溢出文本框,并且只有当用户放开键时,文本框才会扩展。这看起来很奇怪。这就是为什么我必须预测新字符-在每个keydown上扩大文本框,因此,在字符出现在文本框中之前。正如您可以在演示中看到的那样,这种方法看起来很不错。
然而,问题是BACKSPACE和ARROW键-它们也会在keydown上扩展文本框,而只有在keyup时,文本框大小才会得到纠正。
解决方法:
一个解决方法是手动检测BACKSPACE、SHIFT和ARROW键,并根据其进行操作:
// keydown handler
function(e) {
var len = $(this).val().length;
if (e.keyCode === 37 || e.keyCode === 39 ||
e.keyCode === 16) { // ARROW LEFT or ARROW RIGHT or SHIFT key
return;
} else if (e.keyCode === 8) { // BACKSPACE key
$(this).attr("size", len <= 1 ? 1 : len - 1);
} else {
$(this).attr("size", len === 0 ? 1 : len + 1);
}
}
这对于BACKSPACE、SHIFT、ARROW LEFT和ARROW RIGHT起作用(并且看起来很好)。然而,我希望有一个更加稳健的解决方案。