jQuery: Comment capturer la pression de touche TAB dans une zone de texte

145

Je veux capturer la pression sur la touche TAB, annuler l'action par défaut et appeler ma propre fonction javascript.

Jon Erickson
la source

Réponses:

249

Edit: Étant donné que votre élément est inséré dynamiquement, vous devez utiliser déléguéon() comme dans votre exemple, mais vous devez le lier à l'événement keydown, car comme @Marc le commente, dans IE l'événement keypress ne capture pas les touches non-caractères:

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

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

Consultez un exemple ici .

CMS
la source
quand je pousse TAB dans IE6 + l'événement ne se déclenche pas (il se déclenche sur n'importe quelle touche alphanumérique cependant) ... je dois utiliser .live ('keypress', fn)
Jon Erickson
Si cela fonctionne uniquement avec live, peut-être que vous insérez votre élément de zone de texte dynamiquement, si l'élément est déjà sur la page, cela fonctionnera, vérifiez cet exemple: jsbin.com/oguhe
CMS
oui la zone de texte est insérée dynamiquement. mon exemple avec id #textbox était juste pour simplifier la question =)
Jon Erickson
@Jon, la raison pour laquelle vous n'utilisez pas $ (selector) .live ("keydown", fn) est? CMS suggère d'utiliser le keydown car dans IE, la pression sur une touche ne fonctionne pas pour les touches sans caractère, (comme Tab)
Marc
5
@AppleGrew: il le dit, oui, mais ce n'est pas vrai - du moins pour les touches. Pour l'onglet e.qui vaut 0 et e.keyCode vaut 9 (comme il se doit). Testé dans FF 3.5.16, jQuery 1.6.2.
johndodo
19

Exemple de travail dans jQuery 1.9:

$('body').on('keydown', '#textbox', function(e) {
    if (e.which == 9) {
        e.preventDefault();
        // do your code
    }
});
Buzogany Laszlo
la source
2
faire e.preventDefault();double pour éviter d' insérer des espaces dans zone de texte.
Stil
12
$('#textbox').live('keypress', function(e) {
    if (e.keyCode === 9) {
        e.preventDefault();
        // do work
    }
});
Jon Erickson
la source
2
De plus, pour annuler l'action par défaut, utilisez e.preventDefault (); dans la première ligne de la fonction.
Josh Leitzel
@Jon, la pression sur la touche ne capture pas les clés autres que les caractères dans IE
Marc
@Marc Je vois ça, comment puis-je être compatible avec IE et FF?
Jon Erickson
4
^^ L'ironie ... jQuery est censé combler le fossé entre les broswers, pour que vous n'ayez pas à vous soucier de choses comme ça.
Jagd
@Jagd, jQuery ne peut pas déduire d'intention. keypress et keydown ne sont pas équivalents pour une bonne raison. Il se trouve que cette situation n'exige pas la distinction.
Marc
7

Les méthodes ci-dessus n'ont pas fonctionné pour moi, peut-être que j'utilise un peu vieux jquery, puis enfin l'extrait de code ci-dessous fonctionne pour - publier juste au cas où quelqu'un occuperait ma même position

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

Une partie importante de l'utilisation d'une touche vers le bas sur l'onglet est de savoir que l'onglet essaiera toujours de faire quelque chose déjà, n'oubliez pas de «retourner faux» à la fin.

Voici ce que j'ai fait. J'ai une fonction qui fonctionne sur .blur et une fonction qui permute où se trouve mon focus de formulaire. Fondamentalement, il ajoute une entrée à la fin du formulaire et y va tout en exécutant des calculs sur le flou.

$(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 From Freer Tool
la source
4

Essaye ça:

$('#contra').focusout(function (){
    $('#btnPassword').focus();
});
Carlos
la source
1

Supposons que vous ayez TextBox avec l'ID txtName

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

Vous pouvez capturer un onglet d'événement à l'aide de cette API JQuery.

$( "#yourInputTextId" ).keydown(function(evt) {
   if(evt.key === "Tab")
      //call your function
});
héronsanches
la source
cela fonctionne pour moi après avoir ajouté evt.preventDefault (); in the if
LowFieldTheory
-1

Cela a fonctionné pour moi:

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

Ventas Uruguay
la source