2011-01-14 26 views
151

Tôi tự hỏi những gì tôi đang làm sai:jQuery: keyPress Backspace sẽ không kích hoạt?

$('.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(); 
     } 

    }); 

Tôi muốn chức năng doSearch() của tôi cũng được phát sinh khi tôi nhấn Backspace then chốt. Hiện tại, hoàn toàn không có gì xảy ra khi tôi nhấn Backspace trong Chrome và Safari.

bất kỳ ý tưởng nào?

+2

nó không kích hoạt trên Chrome nhưng có trên Firefox. – vsync

+0

Bạn có thể thử plugin jQuery này http://code.google.com/p/js-hotkeys/ và sử dụng bí danh phím "backspace" –

Trả lời

265

Sử dụng keyup thay vì keypress. Điều này nhận được tất cả các mã khóa khi người dùng nhấn vào một cái gì đó

+31

Tại sao 'keyup' lại kích hoạt Backspace khi' nhấn phím 'sẽ không? –

+0

là trường hợp. Keyup kích hoạt backspace, nhấn phím không -> lạ. Có cơ hội để kiểm tra xem hai phím được nhấn như cmd-c hay cmd-v hay cmd-a – matt

+16

Nó thực sự phụ thuộc vào khóa. Bạn muốn sử dụng 'nhấn phím 'cho phím' Enter', 'phím tắt' cho' Backspace' và vv; nếu không bạn sẽ thấy các sự kiện của mình trong một số trình duyệt không thực sự hoạt động như mong đợi, đặc biệt khi bạn muốn ngăn chặn hành vi mặc định cho khóa. Khi bạn sử dụng sai, điều sẽ xảy ra là sự kiện của bạn không bị bắt giữ (như trường hợp của Backspace) hoặc bạn không thể ngăn chặn nó; vì nó đã xảy ra trước khi mã xử lý sự kiện của bạn đến được nó. – srcspider

30

Tôi tự mình gặp phải điều này. Tôi đã sử dụng .on do đó có vẻ hơi khác một chút nhưng tôi đã làm điều này:

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

Thêm công việc của tôi Ở đây. Tôi cần thiết để xóa ssn gõ bởi người sử dụng vì vậy tôi đã làm điều này trong 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(); 
      } 
     } 
    }); 
+0

không hoạt động với firefox. –

+1

hoạt động với firefox nếu bạn sử dụng event.which thay vì event.keyCode http://api.jquery.com/event.which/ – BishopZ

10

Nếu bạn muốn kích hoạt sự kiện duy nhất về sự thay đổi sử dụng đầu vào của bạn:

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

'input' cũng không quan sát các mã phím. Điều này cũng không hiệu quả. –

1

Theo tài liệu jQuery cho. nhấn phím(), nó không bắt được các ký tự không in được, vì vậy backspace sẽ không hoạt động khi nhấn phím, nhưng nó sẽ bị khóa trong keydown và keyup:

Sự kiện nhấn được gửi đến một phần tử khi trình duyệt đăng ký đầu vào bàn phím . Điều này tương tự như sự kiện keydown, ngoại trừ các phím bổ trợ và không in ấn như Shift, Esc và xóa các sự kiện nhấn phím kích hoạt nhưng không phải các sự kiện nhấn phím. Sự khác biệt khác giữa hai sự kiện có thể phát sinh phụ thuộc vào nền tảng và trình duyệt. (https://api.jquery.com/keypress/)

Trong một số trường KeyUp không mong muốn hoặc có tác dụng không mong muốn khác và KeyDown là đủ, vì vậy một trong những cách để xử lý này là sử dụng keydown để bắt tất cả các tổ hợp phím sau đó thiết lập một thời gian chờ của một khoảng thời gian ngắn để rằng khóa được nhập, sau đó thực hiện xử lý trong đó sau.

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