jQuery: SEKME tuş basımı bir metin kutusu içinde nasıl yakalanır


145

SEKME tuşa basmayı yakalamak, varsayılan eylemi iptal etmek ve kendi javascript işlevimi çağırmak istiyorum.

Yanıtlar:


249

Düzenleme: Öğeniz dinamik olarak eklendiğinden, örneğinizde olduğu gibi temsilcion() seçmeniz gerekir, ancak @Marc yorumları olarak IE'de keypress olayı karakter olmayan anahtarları yakalamadığı için keydown olayına bağlamanız gerekir:

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

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

Buradan bir örnek kontrol edin .


IE6 + 'da SEKME tuşuna bastığımda olay tetiklenmiyor (herhangi bir alfasayısal tuşa basar) ... .live (' keypress ', fn) kullanmalıyım
Jon Erickson

Yalnızca canlı yayınla çalışıyorsa, metin kutusu öğenizi
CMS

evet metin kutusu dinamik olarak eklenir. #textbox kimliğine sahip örneğim sadece soruyu basitleştirmekti =)
Jon Erickson

@Jon, $ (selector) .live ("keydown", fn) kullanmamanızın nedeni? IE'de tuş basımı önermektedir çünkü IE'de tuş basımı karakter olmayan tuşlar için çalışmaz (Tab gibi)
Marc

5
@AppleGrew: evet diyor, ama doğru değil - en azından tuşa basmak için. Tab e. için 0 ve e.keyCode 9'dur (olması gerektiği gibi). FF 3.5.16, jQuery 1.6.2'de test edilmiştir.
johndodo

19

JQuery 1.9 çalışma örneği:

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

2
e.preventDefault();boşlukları metin kutusuna eklemeyi önlemek için iki kat yapın.
stil

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

2
Ayrıca, varsayılan eylemi iptal etmek için e.preventDefault (); fonksiyonun ilk satırında.
Josh Leitzel

@Jon, keypress IE'de karakter olmayan anahtarları yakalamıyor
Marc

@Marc IE ve FF ile nasıl uyumlu olabilirim?
Jon Erickson

4
^^ İroni ... jQuery, broswers arasındaki boşluğu kapatmalı, böylece böyle şeyler hakkında endişelenmenize gerek yok.
Jagd

@Jagd, jQuery niyetini çıkaramaz. keypress ve keydown iyi bir nedenden dolayı eşdeğer değildir. Öyle ki, bu durum ayrım gerektirmez.
Marc

7

Yukarıda gösterilen yöntemler benim için işe yaramadı, ben biraz eski jquery kullanıyorum olabilir, o zaman nihayet aşağıda gösterilen kod snippet'i çalışır - aynı pozisyonda biri olması durumunda gönderme

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

5

Sekmede bir anahtar kullanmanın önemli bir kısmı, sekmenin her zaman zaten bir şey yapmaya çalışacağını bilmektir, sonunda "yanlış döndürmeyi" unutmayın.

İşte yaptığım şey. Ben .blur üzerinde çalışan bir işlevi ve form odak nerede takas bir işlevi var. Temelde formun sonuna bir girdi ekler ve bulanıklık üzerinde hesaplamalar yaparken oraya gider.

$(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

Bunu dene:

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

1

TxtName kimliğine sahip TextBox'ınız olduğunu varsayalım

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

1

Bu JQuery API'sını kullanarak bir olay sekmesi yakalayabilirsiniz .

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

evt.preventDefault () ekledikten sonra benim için çalışıyor; eğer
LowFieldTheory

-1

Bu benim için çalıştı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.