jQuery:keyPress Backspace不会开火?

mat*_*att 180 jquery keypress backspace

我想知道我做错了什么:

$(".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();
   }
});
Run Code Online (Sandbox Code Playgroud)

doSearch()当我按下Backspace键时,我希望我的功能也被触发.目前,当我Backspace在Chrome和Safari中按下时,绝对没有任何反应.

有任何想法吗?

Jon*_*ter 311

keyup而不是keypress.当用户按下某些内容时,这将获得所有密钥代码

  • 当`keypress`没有时,为什么`keyup`会为Backspace触发? (36认同)
  • 它实际上取决于密钥.你想用'keypress`代表`Enter`键,`keydown`代表`Backspace`等等; 否则你会发现某些浏览器中的事件并不像你期望的那样真正起作用,尤其是当你想要阻止密钥的默认行为时.当你使用错误的一个时,会发生的事情是你的事件根本没有被捕获(如Backspace的情况)或你无法阻止它; 因为它已经在您的事件处理代码到达它之前发生. (17认同)
  • `keydown`是所有键的更好选择 (6认同)
  • 这个答案的问题是使用`keyup`将[打破数字键盘](http://stackoverflow.com/questions/5630918/get-correct-keycode-for-keypadnumpad-keys).你知道一个答案,可以正确检测全键盘上的任何键吗? (5认同)

小智 31

我自己也遇到了这个.我使用.on它看起来有点不同但我这样做:

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

在这里添加我的工作.我需要删除用户输入的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();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)


Mar*_*nes 9

如果您只想在输入使用的更改时触发事件:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});
Run Code Online (Sandbox Code Playgroud)


Hal*_*yon 8

根据 .keypress() 的 jQuery 文档,它不会捕获不可打印的字符,因此退格键在按键时不起作用,但它会在 keydown 和 keyup 中捕获:

当浏览器注册键盘输入时,按键事件被发送到元素。这与 keydown 事件类似,只不过修饰键和非打印键(例如 Shift、Esc 和 delete)会触发 keydown 事件,但不会触发 keypress 事件。根据平台和浏览器的不同,两个事件之间可能会出现其他差异。(https://api.jquery.com/keypress/

在某些情况下,不需要 keyup 或具有其他不良效果,而 keydown 就足够了,因此处理此问题的一种方法是使用keydown捕获所有击键,然后设置一个短间隔的超时,以便输入密钥,然后在之后。

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