jQuery:keyPress Backspace 不会触发?

Posted

技术标签:

【中文标题】jQuery:keyPress Backspace 不会触发?【英文标题】:jQuery: keyPress Backspace won't fire? 【发布时间】:2011-06-09 02:04:51 【问题描述】:

我想知道我做错了什么:

$(".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() 函数在我按下 Backspace 键时也会被触发。目前,当我在 Chrome 和 Safari 中按 Backspace 时,绝对没有任何反应。

有什么想法吗?

【问题讨论】:

你可以试试这个 jQuery 插件code.google.com/p/js-hotkeys 并使用 "backspace" 键别名 它不会在 chrome 上触发,但在 Firefox 上会触发。 抱歉发布了 necroposting 但值得注意的是 e.which 优于 e.keyCode 【参考方案1】:

使用keyup 而不是keypress。当用户按下某物时,这将获取所有键码

【讨论】:

为什么 keyup 会触发 Backspace 而 keypress 不会触发? 就是这样。 Keyup 会触发退格键,keypress 不会 -> 奇怪。是否有机会检查是否按下了两个键,例如 cmd-c、cmd-v 或 cmd-a 其实是依赖key的。您想使用keypressEnter 键,keydownBackspace 等等;否则你会发现你在某些浏览器中的事件并没有像你期望的那样工作,特别是当你想阻止键的默认行为时。当您使用错误的事件时,将发生的情况是您的事件根本没有被捕获(就像 Backspace 的情况一样),或者您无法阻止它;因为它在你的事件处理代码到达它之前就已经发生了。 这个答案的问题是使用keyup会break the number pad。您知道可以正确检测全键盘上的任何键的答案吗? keydown 是所有键的更好选择【参考方案2】:

我自己也遇到过。我使用了.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();
            
        
    );

【讨论】:

如果您使用 event.which 而不是 event.keyCode api.jquery.com/event.which,这适用于 firefox【参考方案3】:

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

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

【讨论】:

input 也不遵守 keyCodes。这也行不通。【参考方案4】:

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

当浏览器注册键盘输入时,keypress 事件被发送到一个元素。这类似于 keydown 事件,不同之处在于修饰键和非打印键(如 Shift、Esc 和删除)触发 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 );  
  );

【讨论】:

以上是关于jQuery:keyPress Backspace 不会触发?的主要内容,如果未能解决你的问题,请参考以下文章

在 JS/jQuery 中触发 keypress/keydown/keyup 事件?

jQuery事件--keypress([[data],fn])和trigger(type,[data])

jquery 键盘事件 keypress() keydown() keyup()

“Keypress”事件无法正常工作,使用 jQuery 和 Select2

JQuery——键盘事件.keydown().keyup()和.keypress()

TextBox实现仅允许输入数字