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.

Jon Erickson
sumber

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 .

CMS
sumber
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
    }
});
Buzogany Laszlo
sumber
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
    }
});
Jon Erickson
sumber
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');
    }
});
Oxi
sumber
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");
            }
        }
    });
Jordan Dari Freer Tool
sumber
4

Coba ini:

$('#contra').focusout(function (){
    $('#btnPassword').focus();
});
Carlos
sumber
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');
 }
}); 
UJS
sumber
1

Anda dapat menangkap tab acara menggunakan API JQuery ini .

$( "#yourInputTextId" ).keydown(function(evt) {
   if(evt.key === "Tab")
      //call your function
});
peternakan miliknya
sumber
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'); } });

Ventas Uruguay
sumber