149 votes

jQuery : Comment capturer l'appui sur la touche TAB dans une zone de texte ?

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

257voto

CMS Points 315406

Editar: Puisque 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 l'indique @Marc, dans IE, l'événement keypress ne prend pas en compte les touches sans caractère :

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

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

Vérifiez un exemple aquí .

0 votes

Lorsque j'appuie sur la touche TAB dans IE6+, l'événement ne se déclenche pas (il se déclenche pourtant sur n'importe quelle touche alphanumérique)... J'ai besoin d'utiliser .live('keypress', fn)

0 votes

Si cela ne fonctionne qu'en direct, peut-être que vous insérez votre élément textbox de manière dynamique, si l'élément est déjà sur la page, cela fonctionnera, vérifiez cet exemple : jsbin.com/oguhe

0 votes

Oui, la zone de texte est insérée dynamiquement. mon exemple avec id #textbox était juste pour simplifier la question =)

20voto

weblap.ro Points 160

Exemple de travail dans jQuery 1.9 :

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

2 votes

Faire e.preventDefault(); double pour empêcher l'insertion d'espaces blancs dans la zone de texte.

12voto

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

2 votes

De même, pour annuler l'action par défaut, utilisez e.preventDefault() ; dans la première ligne de la fonction.

0 votes

@Jon, keypress ne capture pas les touches sans caractère dans IE.

0 votes

@Marc je vois ça, comment puis-je être compatible avec IE et FF ?

7voto

Oxi Points 431

Les méthodes présentées ci-dessus n'ont pas fonctionné pour moi, peut-être que j'utilise un peu vieux jquery, puis finalement l'extrait de code ci-dessous a fonctionné pour moi - poster juste au cas où quelqu'un dans ma même position

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

5voto

Une partie importante de l'utilisation d'une touche vers le bas sur tab est de savoir que tab va toujours essayer de faire quelque chose déjà, n'oubliez pas de "retourner false" à la fin.

Voici ce que j'ai fait. J'ai une fonction qui s'exécute sur .blur et une fonction qui change l'endroit où se trouve le focus de mon formulaire. En gros, elle ajoute une entrée à la fin du formulaire et s'y rend tout en effectuant 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");
            }
        }
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X