jQuery: keyPress Backspace won't fire?

我想知道我做错了什么:

$(".s").keypress(function(e) {
switch (e.keyCode) {
case 8: // Backspace
//console.log('backspace');
case 9: // Tab
case 13: // Enter
case 37: // Left
case 38: // Up
case 39: // Right
case 40: // Down
break;


default:
doSearch();
}
});

我希望我的doSearch()函数也在我按下退格键时被触发。目前,当我在Chrome和Safari中按退格时,绝对没有发生任何事情。

什么好主意吗?

178497 次浏览

使用keyup代替keypress。当用户按下某个东西时,它会得到所有的键代码

这是我自己发现的。我使用.on,所以它看起来有点不同,但我这样做了:

 $('#element').on('keypress', function() {
//code to be executed
}).on('keydown', function(e) {
if (e.keyCode==8)
$('element').trigger('keypress');
});

在这里添加我的工作。我需要删除用户键入的ssn,所以我在jQuery中这样做了

  $(this).bind("keydown", function (event) {
// Allow: backspace, delete
if (event.keyCode == 46 || event.keyCode == 8)
{
var tempField = $(this).attr('name');
var hiddenID = tempField.substr(tempField.indexOf('_') + 1);
$('#' + hiddenID).val('');
$(this).val('')
return;
}  // Allow: tab, escape, and enter
else if (event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
// Allow: Ctrl+A
(event.keyCode == 65 && event.ctrlKey === true) ||
// Allow: home, end, left, right
(event.keyCode >= 35 && event.keyCode <= 39)) {
// let it happen, don't do anything
return;
}
else
{
// Ensure that it is a number and stop the keypress
if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) &&       (event.keyCode < 96 || event.keyCode > 105))
{
event.preventDefault();
}
}
});

如果你想只在输入使用的变化时触发事件:

$('.s').bind('input', function(){
console.log("search!");
doSearch();
});

根据jQuery的.keypress()文档,它不会捕获不可打印的字符,所以backspace将不会在keypress上工作,但它会在keydown和keyup上捕获:

当浏览器注册键盘输入时,按键事件被发送给元素。这类似于keydown事件,除了修改器和非打印键(如Shift、Esc和delete)触发keydown事件,而不是按键事件。这两个事件之间的其他差异可能取决于平台和浏览器。(https://api.jquery.com/keypress/)

在某些情况下,keyup是不需要的,或者有其他不需要的效果,而keydown就足够了,所以一种处理方法是使用keydown捕获所有击键,然后设置一个短时间间隔的超时,以便输入键,然后在那里进行处理。

jQuery(el).keydown( function() {
var that = this; setTimeout( function(){
/** Code that processes backspace, etc. **/
}, 100 );
} );