Ce que j'essaie de faire est de pointer sur l'onglet suivant lorsque vous remplissez quatre caractères. Chaque champ doit comporter 4 caractères et une fois rempli, il doit passer à la zone de saisie suivante.
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').focus();
}
});
Fiddle .
Votre code fonctionne bien, mais vos éléments d’entrée sont définis sur type="number"
. Le contenu non numérique est ignoré. Par conséquent, si vous entrez "abcd", par exemple, le value
de l'entrée est vide (ce qui signifie un length
de 0
). Si vous entrez "1234" en revanche, la valeur de l'entrée est 1234
.
Si vous souhaitez que votre code se déclenche lorsque du contenu non numérique est entré, modifiez simplement le type de chaque entrée en text
.
<input class="inputs" type="text" maxlength="4" />
Notez également que j'ai également supprimé l'attribut class
en double de chacun de vos éléments dans cet exemple.
Comme krish a mentionné dans les commentaires de votre question, il existe un problème avec votre code car le dernier élément input
continuera à accepter plus de 4 caractères. Pour résoudre ce problème, cochez la case suivante afin de vous assurer qu'il existe un élément next('.inputs')
:
if (this.value.length == this.maxLength) {
var $next = $(this).next('.inputs');
if ($next.length)
$(this).next('.inputs').focus();
else
$(this).blur();
}
Peut-être avez-vous négligé de mettre votre code dans DOM ready. Jsfiddle inclut votre code dans $(window).load(function() { .....})
et c’est pourquoi il fonctionne. Donc, sur votre propre page, utilisez:
$(function() {
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').focus();
}
});
});
Dans jsfiddle, vous pouvez confirmer cela en sélectionnant No wrap - in <head>
, puis cliquez sur Exécuter. Le code ne fonctionnera pas. Mais si vous utilisez ce qui précède, qui est inclus dans DOM ready, cela fonctionne.
Mon premier problème avec cela est que si vous parcourez des champs déjà remplis, vous devez les sélectionner manuellement. Je suggère ceci:
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').select();
}
});
La solution du deuxième problème m'échappe. Fondamentalement, dans la même situation où les champs sont remplis précédemment, si vous tapez trop rapidement, les événements sont déclenchés en tant que tels: KeyDown KeyDown KeyUp KeyUp
Ce que cela provoque, est de sauter la prochaine entrée.
Voici une version améliorée pour tous ceux qui en ont besoin pour un type d’informations fractionnées comme une clé de série ou quelque chose comme ça:
$(document).ready(function(){
$(".amazonInput").keydown(function (e) {
var code = e.which;
$this=$(this);
if ($this.val().length >=$this.data("maxlength") && code != 8) {
if($this.val().length>$this.data("maxlength")){
$this.val($this.val().substring(0,4));
}
$this.next(".amazonInput").focus();
}
if($this.val().length == 0 && code == 8) {
$this.prev(".amazonInput").focus();
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<Script>
$(document).ready(function(){
$(".inputs").keyup(function () {
$this=$(this);
if ($this.val().length >=$this.data("maxlength")) {
if($this.val().length>$this.data("maxlength")){
$this.val($this.val().substring(0,4));
}
$this.next(".inputs").focus();
}
});
});
</Script>
</head>
<body>
<input type="text" class="inputs" data-maxlength="4">
<input type="text" class="inputs" data-maxlength="4">
<input type="text" class="inputs" data-maxlength="4">
<input type="text" class="inputs" data-maxlength="4">
</body>