Je crée une application mobile. Je souhaite implémenter cette fonction où, en appuyant sur la touche, le prochain champ de saisie est ciblé. J'ai essayé beaucoup de choses mais aucune ne semble fonctionner. Ceci est mon code. J'ai essayé d'utiliser onClick, mais lorsque je le touche, il passe au champ suivant.
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
Je veux une solution pure Jquery ou Javascript . Merci d'avance.
Que diriez-vous:
$('input.mobile-verify.pass').on('keyup', function() {
if ($(this).val()) {
$(this).next().focus();
}
});
Donc, touche en haut, s'il y a une valeur, concentrez-vous sur la suivante. L'utilisation de keyup vous permet de valider le contenu plutôt que de sauter immédiatement. Par exemple, ils pourraient basculer en mode numérique sur iOS, ce qui déclencherait la mise en évidence si vous utilisiez simplement le clavier.
Codepen: http://codepen.io/anon/pen/qaGKzk
Utilisez .next()
et .trigger()
:
$(".mobile-verify.pass").on("keypress", function(e){
$(this).next().trigger("focus");
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" class="mobile-verify pass" name="code[]" />
<input type="number" class="mobile-verify pass" name="code[]" />
<input type="number" class="mobile-verify pass" name="code[]" />
<input type="number" class="mobile-verify pass" name="code[]" />
Note latérale: Trouvez une autre solution pour la fonctionnalité d'attribut maxlength
, comme indiqué dans maxlength ignoré pour le type d'entrée = "numéro"
Utilisez . les touches () et .focus ()
L'extrait:
$(document).ready(function (){
$("input.mobile-verify.pass").keypress(function(){
$(this).next().trigger('focus');
//or $(this).next().focus();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
Avec full JS
var allElements = document.querySelectorAll('.mobile-verify.pass');
var i;
for (i = 0; i < allElements.length; i++) {
var el = allElements[i];
el.addEventListener("keypress", function () {
this.nextSibling.nextSibling.focus();
});
}
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
NB: si vous demandez pourquoi 2 nextSibling, la réponse est que le premier frère est le texte représentant le petit espace entre 2 éléments
Essayez les fonctions .keypress () et .focus () dans jQuery
JavaScript et les événements keypress
et focus
ainsi que la validation des numéros de clé:
var elems = [].slice.call(document.querySelectorAll('.mobile-verify.pass'));
elems.forEach(function(el, i, array) {
el.onkeypress = function(event) {
// Validate key is a number
var keycode = event.which;
if (!(event.shiftKey === false &&
(keycode === 46 || keycode === 8 || keycode === 37 || keycode === 39 ||
(keycode >= 48 && keycode <= 57)))) {
return;
}
var nextInput = i + 1;
if (nextInput < array.length) {
array[nextInput].focus();
}
};
});
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
<input type="number" class="mobile-verify pass" maxlength="1" name="code[]" />
D'autres ont déjà écrit les solutions. Je voulais juste ajouter que la partie
[].slice.call
est ce qui a résolu mon problème. Je ne pouvais pas concentrer un élément car il était de type Element et non pas HtmlElement. Mais d’une manière ou d’une autre, cette partie du code est en train de convertir ma liste d’éléments querySelectorAll en HtmlElements.
Merci Yosvel Quintero