79 votes

Entrez la clé de la presse se comporte comme un Onglet en Javascript

Je cherche à créer un formulaire en appuyant sur la touche entrée causes concentrer pour aller à la "prochaine" d'élément de formulaire sur la page. La solution que j'ai trouve sur le web est...

 <body onkeydown="if(event.keyCode==13){event.keyCode=9; return event.keyCode}">

Malheureusement, cela ne semble que le travail dans IE. Donc, la vraie viande de cette question est si quelqu'un connaît une solution qui fonctionne pour FF et Chrome? En outre, je préfèrerais ne pas avoir à ajouter de l' onkeydown événements à la forme des éléments eux-mêmes, mais si c'est la seule façon, il aura à faire.

Ce problème est similaire à la question 905222, mais digne de sa propre question, à mon avis.

Edit: aussi, j'ai vu des gens poser la question que ce n'est pas de bon style, comme il s'écarte de la forme de comportement que les utilisateurs sont habitués. Je suis d'accord! C'est une demande du client :(

92voto

tcdona Points 261

J'ai utilisé la logique proposée par Andrew qui est très efficace. Et c'est ma version:

$('body').on('keydown', 'input, select, textarea', function(e) {
    var self = $(this)
      , form = self.parents('form:eq(0)')
      , focusable
      , next
      ;
    if (e.keyCode == 13) {
        focusable = form.find('input,a,select,button,textarea').filter(':visible');
        next = focusable.eq(focusable.index(this)+1);
        if (next.length) {
            next.focus();
        } else {
            form.submit();
        }
        return false;
    }
});

11voto

Merci pour le bon script.

J'ai juste ajouté le changement de l'événement sur la fonction ci-dessus pour revenir en arrière entre les éléments, je pensais que quelqu'un peut avoir besoin de cette.

$('body').on('keydown', 'input, select, textarea', function(e) {
var self = $(this)
  , form = self.parents('form:eq(0)')
  , focusable
  , next
  , prev
  ;

if (e.shiftKey) {
 if (e.keyCode == 13) {
     focusable =   form.find('input,a,select,button,textarea').filter(':visible');
     prev = focusable.eq(focusable.index(this)-1); 

     if (prev.length) {
        prev.focus();
     } else {
        form.submit();
    }
  }
}
  else
if (e.keyCode == 13) {
    focusable = form.find('input,a,select,button,textarea').filter(':visible');
    next = focusable.eq(focusable.index(this)+1);
    if (next.length) {
        next.focus();
    } else {
        form.submit();
    }
    return false;
}
});

4voto

Damien Sawyer Points 469

J'ai retravaillé la Fpo solution dans un knock-out de liaison et j'ai pensé le partager. Merci beaucoup :-)

Voici un Violon

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js" type="text/javascript"></script>


</head>
<body>

    <div data-bind="nextFieldOnEnter:true">
        <input type="text" />
        <input type="text" />
        <select>
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="mercedes">Mercedes</option>
          <option value="audi">Audi</option>
        </select>
        <input type="text" />
        <input type="text" />
    </div>


    <script type="text/javascript">
    ko.bindingHandlers.nextFieldOnEnter = {
        init: function(element, valueAccessor, allBindingsAccessor) {
            $(element).on('keydown', 'input, select', function (e) {
                var self = $(this)
                , form = $(element)
                  , focusable
                  , next
                ;
                if (e.keyCode == 13) {
                    focusable = form.find('input,a,select,button,textarea').filter(':visible');
                    var nextIndex = focusable.index(this) == focusable.length -1 ? 0 : focusable.index(this) + 1;
                    next = focusable.eq(nextIndex);
                    next.focus();
                    return false;
                }
            });
        }
    };

    ko.applyBindings({});
    </script>
</body>
</html>

4voto

Andrew Points 58

Changer ce comportement crée en fait une bien meilleure expérience utilisateur que le comportement par défaut mis en œuvre de manière native. Considérer que le comportement de la touche "entrée" est déjà incohérent de l'utilisateur du point de vue, parce que dans une seule ligne de saisie, entrez tend à soumettre un formulaire, alors que dans un multi-ligne textarea, il suffit d'ajouter une nouvelle ligne pour le contenu du champ.

Récemment, j'ai fait comme ceci (utilise jQuery):

$('input.enterastab, select.enterastab, textarea.enterastab').live('keydown', function(e) {
 if (e.keyCode==13) {
  var focusable = $('input,a,select,button,textarea').filter(':visible');
  focusable.eq(focusable.index(this)+1).focus();
  return false;
 }
});

Ce n'est pas vraiment efficace, mais fonctionne assez bien et est fiable - il suffit d'ajouter le "enterastab' classe à tout élément de saisie doit se comporter de cette façon.

-2voto

Byron Whitlock Points 29863

Vous pourriez par programmation à parcourir les éléments de formulaire ajout de la onkeydown gestionnaire comme vous allez. De cette façon, vous pouvez réutiliser le code.

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