2011-01-14 141 views
151

我不知道我做錯了什麼: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(); 
     } 

    }); 

我想我doSearch()功能也當我打的退格鍵被解僱。目前,在Chrome和Safari中按Backspace時絕對沒有任何反應。

有什麼想法?

+2

它不會在Chrome上觸發,但會在Firefox上觸發。 – vsync 2013-02-10 21:42:03

+0

你可以試試這個jQuery插件http://code.google.com/p/js-hotkeys/並使用「退格」鍵別名 – 2011-01-14 11:11:59

回答

265

使用keyup代替keypress。當用戶按下某個東西時,這會得到所有的關鍵代碼

+31

爲什麼會`keyup`火Backspace鍵時`keypress`不會呢? – 2011-01-14 11:11:40

+0

就是這樣。 Keyup觸發退格鍵,按鍵不會 - >奇怪。是否有機會檢查是否按下了兩個按鍵,如cmd-c或cmd-v或cmd-a – matt 2011-01-14 11:28:27

30

我自己碰到這個。我用.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(); 
      } 
     } 
    }); 
10

這樣做。如果你只想在你的投入使用改變觸發事件:

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

據jQuery的文檔。按鍵(),它並沒有趕上非打印字符,所以退格將無法在按鍵工作,但它是夾在KeyDown和KEYUP:

的按鍵事件被髮送到一個元素時,瀏覽器註冊鍵盤輸入。這與keydown事件類似,不同之處在於,修飾符和非打印鍵(如Shift,Esc和刪除)會觸發keydown事件,但不會觸發按鍵事件。這兩個事件之間的其他差異可能會因平臺和瀏覽器而有所不同。 (https://api.jquery.com/keypress/

在KEYUP是不期望的或具有其它不希望的效果和KEYDOWN是足夠的,所以一個處理這種方式是使用​​捕獲所有擊鍵然後設置一個短的時間間隔的超時這樣一些情況下輸入密鑰,然後在那裏進行處理。

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