jQuery: keyTekan Backspace tidak akan menyala?

186

Saya bertanya-tanya apa yang saya lakukan salah:

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

Saya ingin doSearch()fungsi saya juga dipecat ketika saya menekan Backspacetombol. Saat ini sama sekali tidak ada yang terjadi ketika saya menekan BackspaceChrome dan Safari.

ada ide?

matt
sumber
Anda dapat mencoba kode plugin jQuery ini.google.com/p/js-hotkeys dan menggunakan alias "backspace"
José Manuel Lucas
3
tidak menyala di chrome tetapi di Firefox.
vsync
Maaf untuk necroposting tetapi perlu dicatat bahwa e.which lebih disukai daripada e.keyCode
Henry Howeson

Jawaban:

324

Gunakan keyupsebagai ganti keypress. Ini mendapatkan semua kode kunci ketika pengguna menekan sesuatu

Jonathon Bolster
sumber
37
Mengapa keyupmemecat Backspace padahal keypresstidak?
Aaron Digulla
itu masalahnya. Keyup mengaktifkan backspace, penekanan tombol tidak -> aneh. apakah ada kesempatan juga untuk memeriksa apakah dua tombol ditekan seperti cmd-c, atau cmd-v, atau cmd-a
matt
17
Ini sebenarnya tergantung pada kunci. Anda ingin menggunakan keypressuntuk Enterkunci, keydownuntuk Backspacedan sebagainya; jika tidak, Anda akan menemukan acara Anda di beberapa browser tidak benar-benar berfungsi seperti yang Anda harapkan, terutama ketika Anda ingin mencegah perilaku default untuk kunci tersebut. Ketika Anda menggunakan yang salah, apa yang akan terjadi adalah acara Anda tidak ditangkap sama sekali (seperti halnya untuk Backspace) atau Anda tidak dapat mencegahnya; karena sudah terjadi sebelum kode penanganan acara Anda sampai ke sana.
srcspider
5
Masalah dengan jawaban ini adalah bahwa menggunakan keyupakan merusak tombol angka . Apakah Anda mengetahui jawaban yang memungkinkan mendeteksi dengan benar tombol apa saja pada keyboard lengkap?
Hughes
6
keydownadalah pilihan yang lebih baik untuk semua kunci
artfuldev
32

Saya menemukan ini sendiri. Saya menggunakan .onsehingga terlihat sedikit berbeda tetapi saya melakukan ini:

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

Menambahkan Pekerjaan Saya di Sekitar sini. Saya perlu menghapus ssn yang diketik oleh pengguna jadi saya melakukan ini di 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();
            }
        }
    });
rampok
sumber
1
ini bekerja dengan firefox jika Anda menggunakan event.which alih-alih event.keyCode api.jquery.com/event.which
BishopZ
11

Jika Anda ingin memadamkan acara hanya pada perubahan penggunaan input Anda:

$('.s').bind('input', function(){
  console.log("search!");
  doSearch();
});
Marcos Nunes
sumber
inputjuga tidak memperhatikan kode kunci. Ini juga tidak akan berhasil.
Mark Pieszak - Trilon.io
3

Menurut dokumentasi jQuery untuk .keypress (), itu tidak menangkap karakter yang tidak dapat dicetak, jadi backspace tidak akan bekerja pada penekanan tombol, tetapi terperangkap dalam keydown dan keyup:

Acara penekanan tombol dikirim ke elemen ketika browser mendaftarkan input keyboard. Ini mirip dengan peristiwa keydown, kecuali bahwa pengubah dan kunci non-cetak seperti Shift, Esc, dan menghapus peristiwa keydown pemicu tetapi bukan peristiwa penekanan tombol. Perbedaan lain antara kedua acara dapat muncul tergantung pada platform dan browser. ( https://api.jquery.com/keypress/ )

Dalam beberapa kasus keyup tidak diinginkan atau memiliki efek yang tidak diinginkan lainnya dan keydown cukup, jadi salah satu cara untuk menangani ini adalah dengan menggunakan keydownuntuk menangkap semua penekanan tombol kemudian mengatur batas waktu interval pendek sehingga kunci dimasukkan, kemudian melakukan pemrosesan dalam setelah itu.

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