Was ich versuche zu tun ist, zeigen Sie auf die nächste Registerkarte, wenn Sie vier Zeichen eingeben. Jedes Feld sollte aus 4 Zeichen bestehen und sobald es ausgefüllt ist, sollte es zum nächsten Eingabefeld gelangen.
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').focus();
}
});
Fiddle .
Ihr Code funktioniert gut, Ihre Eingabeelemente sind jedoch als type="number"
festgelegt. Nicht numerischer Inhalt wird ignoriert. Wenn Sie beispielsweise "abcd" eingeben, ist die value
der Eingabe leer (dh eine length
von 0
). Wenn Sie dagegen "1234" eingeben, lautet der Wert der Eingabe 1234
.
Wenn Sie möchten, dass Ihr Code ausgelöst wird, wenn nicht numerischer Inhalt eingegeben wird, ändern Sie einfach den Eingabetyp in text
.
<input class="inputs" type="text" maxlength="4" />
Beachten Sie, dass ich auch das doppelte class
-Attribut aus jedem Ihrer Elemente in diesem Beispiel entfernt habe.
Wie krish in den Kommentaren zu Ihrer Frage erwähnt hat, besteht ein Problem mit Ihrem Code darin, dass das letzte input
-Element weiterhin mehr als 4 Zeichen akzeptiert. Um dies zu beheben, setzen Sie einen Haken, um sicherzustellen, dass es ein next('.inputs')
-Element gibt:
if (this.value.length == this.maxLength) {
var $next = $(this).next('.inputs');
if ($next.length)
$(this).next('.inputs').focus();
else
$(this).blur();
}
Vielleicht haben Sie es versäumt, Ihren Code in DOM ready einzureichen. Jsfiddle schließt Ihren Code in $(window).load(function() { .....})
ein, und deshalb funktioniert es. Also auf deiner eigenen Seite verwenden:
$(function() {
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').focus();
}
});
});
Im jsfiddle können Sie dies bestätigen, indem Sie No wrap - in <head>
auswählen und dann auf Ausführen klicken. Der Code wird nicht funktionieren. Wenn Sie jedoch das oben genannte verwenden, was in DOM ready enthalten ist, funktioniert es.
Mein erstes Problem dabei war, dass Sie beim Durchblättern von Feldern, die bereits ausgefüllt sind, jedes Feld manuell auswählen müssen. Ich schlage folgendes vor:
$(".inputs").keyup(function () {
if (this.value.length == this.maxLength) {
$(this).next('.inputs').select();
}
});
Die Lösung des zweiten Problems entgeht mir. Grundsätzlich werden in der gleichen Situation, in der Felder zuvor gefüllt wurden, die Ereignisse als solche ausgelöst, wenn Sie zu schnell eingeben: KeyDown KeyDown KeyUp KeyUp
Was dies bewirkt, ist das Überspringen der nächsten Eingabe.
Hier ist eine verbesserte Version für alle, die dies für aufgespaltete Informationen wie einen Serienschlüssel oder ähnliches benötigen:
$(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>