jQuery:keyPress Backspace不会触发?


186

我想知道我在做什么错:

$(".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键时也能触发我的功能。现在,当我按BackspaceChrome和Safari 时,绝对没有任何反应。

有任何想法吗?


你可以试试这个jQuery插件code.google.com/p/js-hotkeys并使用“退格”键别名
若泽·曼努埃尔·卢卡斯

3
它不会在chrome上启动,但会在Firefox上启动。
vsync

抱歉,无法进行发布,但值得注意的是e.keyCode优于e.keyCode
Henry Howeson '19

Answers:


324

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


37
为什么不keyup为Backspace触发keypress
亚伦·迪古拉

就是这样 Keyup会触发退格键,而keypress则不会->很奇怪。是否有机会检查是否按下了两个键,如cmd-c或cmd-v或cmd-a
哑光

17
它实际上取决于密钥。您想将其keypress用于Enter密钥,keydownfor Backspace等。否则,您会发现某些浏览器中的事件无法按预期运行,特别是当您要防止键的默认行为时。当您使用错误的事件时,将发生以下情况:要么根本不捕获您的事件(例如Backspace),要么您无法阻止它。因为它已经在事件处理代码到达之前发生了。
srcspider 2011年

5
这个答案的问题是使用keyup破坏数字键盘。您是否知道可以正确检测完整键盘上的任何键的答案?
拥抱

6
keydown是所有按键的更好选择
artfuldev

32

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

1
如果您使用event.which而不是event.keyCode api.jquery.com/event.which,
BishopZ 2014年


3

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

当浏览器注册键盘输入时,会将keypress事件发送到一个元素。这与keydown事件类似,除了修饰键和非打印键(例如Shift,Esc和Delete)会触发keydown事件,而不会触发keypress事件。取决于平台和浏览器,这两个事件之间可能会出现其他差异。(https://api.jquery.com/keypress/

在某些情况下,不需要keydown按键或具有其他不良影响,而按键已足够,因此一种解决方法是使用捕获所有按键,然后设置一个短间隔的超时时间,以便输入按键,然后进行处理。之后。

jQuery(el).keydown( function() { 
    var that = this; setTimeout( function(){ 
           /** Code that processes backspace, etc. **/ 
     }, 100 );  
 } );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.