jQuery: Cara menangkap penekanan tombol TAB dalam kotak teks


145

Saya ingin menangkap penekanan tombol TAB, membatalkan tindakan default dan memanggil fungsi javascript saya sendiri.

Jawaban:


249

Sunting: Karena elemen Anda dimasukkan secara dinamis, Anda harus menggunakan yang didelegasikanon() seperti dalam contoh Anda, tetapi Anda harus mengikatnya ke acara keydown, karena seperti @Marc komentar, di IE acara penekanan tombol tidak menangkap kunci non-karakter:

$("#parentOfTextbox").on('keydown', '#textbox', function(e) { 
  var keyCode = e.keyCode || e.which; 

  if (keyCode == 9) { 
    e.preventDefault(); 
    // call custom function here
  } 
});

Lihat contoh di sini .


ketika saya mendorong TAB di IE6 + acara tidak api (kebakaran pada setiap tombol alfanumerik meskipun) ... saya perlu menggunakan .live ( 'tekan tombol', fn)
Jon Erickson

Jika hanya bekerja dengan live, mungkin Anda memasukkan elemen kotak teks Anda secara dinamis, jika elemen tersebut sudah ada di halaman, itu akan berfungsi, periksa contoh ini: jsbin.com/oguhe
CMS

ya kotak teks dimasukkan secara dinamis. Misalnya saya dengan id #textbox hanya untuk menyederhanakan pertanyaan =)
Jon Erickson

@ Jon, alasan Anda tidak menggunakan $ (pemilih). Live ("keydown", fn) adalah? CMS menyarankan menggunakan keydown karena di IE, penekanan tombol tidak berfungsi untuk kunci noncharacter, (seperti Tab)
Marc

5
@ AppleGrew: katanya begitu, ya, tapi itu tidak benar - setidaknya untuk penekanan tombol. Untuk Tab e.which adalah 0 dan e.keyCode adalah 9 (sebagaimana mestinya). Diuji dalam FF 3.5.16, jQuery 1.6.2.
johndodo

19

Contoh kerja di jQuery 1.9:

$('body').on('keydown', '#textbox', function(e) {
    if (e.which == 9) {
        e.preventDefault();
        // do your code
    }
});

2
make e.preventDefault();double untuk mencegah memasukkan spasi putih ke dalam kotak teks.
stil

12
$('#textbox').live('keypress', function(e) {
    if (e.keyCode === 9) {
        e.preventDefault();
        // do work
    }
});

2
Juga, untuk membatalkan tindakan default, gunakan e.preventDefault (); di baris pertama fungsi.
Josh Leitzel

@ Jon, penekanan tombol tidak menangkap kunci noncharacter di IE
Marc

@ Mark Saya melihat itu, bagaimana saya bisa kompatibel dengan IE dan FF?
Jon Erickson

4
^^ Ironisnya ... jQuery seharusnya menjembatani kesenjangan antara broswers, sehingga Anda tidak perlu khawatir tentang hal-hal seperti ini.
Jagd

@Jagd, jQuery tidak dapat menyimpulkan maksud. penekanan tombol dan keydown tidak setara untuk alasan yang baik. Kebetulan saja, situasi ini tidak memerlukan pembedaan.
Marc

7

Metode yang ditunjukkan di atas tidak bekerja untuk saya, mungkin saya menggunakan jquery agak lama, lalu akhirnya potongan kode yang ditampilkan di bawah ini berfungsi untuk - memposting kalau-kalau ada orang di posisi yang sama dengan saya

$('#textBox').live('keydown', function(e) {
    if (e.keyCode == 9) {
        e.preventDefault();
        alert('tab');
    }
});

5

Bagian penting dari menggunakan tombol pada tab adalah mengetahui bahwa tab akan selalu mencoba untuk melakukan sesuatu, jangan lupa untuk "kembali salah" di akhir.

Inilah yang saya lakukan. Saya memiliki fungsi yang berjalan di blur dan fungsi yang bertukar di mana fokus bentuk saya. Pada dasarnya itu menambahkan input ke ujung formulir dan pergi ke sana sambil menjalankan perhitungan blur.

$(this).children('input[type=text]').blur(timeEntered).keydown(function (e) {
        var code = e.keyCode || e.which;
        if (code == "9") {
            window.tabPressed = true;
            // Here is the external function you want to call, let your external
            // function handle all your custom code, then return false to
            // prevent the tab button from doing whatever it would naturally do.
            focusShift($(this));
            return false;
        } else {
            window.tabPressed = false;
        }
        // This is the code i want to execute, it might be different than yours
        function focusShift(trigger) {
            var focalPoint = false;
            if (tabPressed == true) {
                console.log($(trigger).parents("td").next("td"));
                focalPoint = $(trigger).parents("td").next("td");

            }
            if (focalPoint) {
                $(focalPoint).trigger("click");
            }
        }
    });

4

Coba ini:

$('#contra').focusout(function (){
    $('#btnPassword').focus();
});

1

Misalkan Anda memiliki TextBox dengan Id txtName

$("[id*=txtName]").on('keydown', function(e) { 
  var keyCode = e.keyCode || e.which; 
  if (keyCode == 9) {
     e.preventDefault();
     alert('Tab Pressed');
 }
}); 

1

Anda dapat menangkap tab acara menggunakan API JQuery ini .

$( "#yourInputTextId" ).keydown(function(evt) {
   if(evt.key === "Tab")
      //call your function
});

ini berfungsi untuk saya setelah menambahkan evt.preventDefault (); di if
LowFieldTheory

-1

Ini bekerja untuk saya:

$("[id*=txtName]").on('keydown', function(e) { var keyCode = e.keyCode || e.which; if (keyCode == 9) { e.preventDefault(); alert('Tab Pressed'); } });

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.