2017-02-23 3 views
0

Ich erzeuge Eingaben (mit einer maximalen Länge von 1) dynamisch mit JavaScript, so dass ich sie nicht alle manuell eingeben muss. Ich habe sie so gemacht, dass wenn ich in sie tippe, sie zum nächsten Eingang gehen und wenn ich die Rücktaste drücke, löschen sie den Wert innerhalb der Eingabe und gehen dann zur vorherigen.

erwartetes Verhalten

Wenn ich Backspace drücken, wird es den Buchstaben löschen, dann zum vorherigen Eingang gehen.

Was passiert eigentlich

Wenn ich Backspace drücke, wird es die Buchstaben löschen, dann tun diese seltsamen Shuffle, und dann drücke ich Backspace wieder, und dann geht es weiter zu dem vorherigen Eingang.

Hier ist eine JSFiddle, die reproduziert das Problem, das ich habe.

Da Stack-Überlauf wird ich dies nicht zulassen, veröffentlichen, ohne Code (hier ist der jQuery-Code):

function generateInputRows() { 
    var inputHTML = ""; 
    for (var i = 0; i < 5; i++) { 
     inputHTML += '<div class="inputColumn"><input maxlength="1" type="text"><div>'; 
     inputHTML += (i + 1); 
     inputHTML += '</div></div>'; 
    } 
    inputHTML += '</div>'; 
    return inputHTML; 
} 

function setUpTyping(){ 
    $('.inputColumn input').on('input',function(event){ 
     var inputs = $('.inputColumn input'); 
     var index = inputs.index(this); 
     inputs.eq(index + 1).focus(); 
    }); 

    $('.inputColumn input').on('keyup', function(e) { 
     if(e.keyCode == 8 && $(this).val() == ""){ 
      var inputs = $('.inputColumn input'); 
      var index = inputs.index(this); 
      inputs.eq(index - 1).focus(); 
     } 
    }); 
} 

$('#rows').html(generateInputRows()); 
setUpTyping(); 

Antwort

1

Ich denke, es gibt viele Möglichkeiten, dies zu lösen, wie Tracking an welchem ​​Eingang Sie sind aktiv bearbeiten. Für Ihre aktuelle Logik müssen Sie jedoch nur das Ereignis input anpassen, um zu überprüfen, ob der Wert leer ist, bevor Sie versuchen, das nächste Feld zu fokussieren.

$('.inputColumn input').on('input',function(e){ 
    var inputs = $('.inputColumn input'); 
    var index = inputs.index(this); 
    if ($(this).val() != "") { 
     inputs.eq(index + 1).focus(); 
    } 
}); 
+0

Ich kann nicht glauben, dass es etwas so einfaches war! – silverAndroid

1

Warum nicht das gleiche Ereignis für die Logik verwenden, wie Sie in diesen Fiddle sehen können?

function generateInputRows() { 
    var inputHTML = ""; 
    for (var i = 0; i < 5; i++) { 
    inputHTML += '<div class="inputColumn"><input maxlength="1" type="text"><div>'; 
    inputHTML += (i + 1); 
    inputHTML += '</div></div>'; 
    } 
    inputHTML += '</div>'; 
    return inputHTML; 
} 

function setUpTyping() { 
    $('.inputColumn input').on('keyup', function(e) { 
    if (e.keyCode == 8 && $(this).val() == "") { 
     var inputs = $('.inputColumn input'); 
     var index = inputs.index(this); 
     inputs.eq(index - 1).focus(); 
    } else { 
     var inputs = $('.inputColumn input'); 
     var index = inputs.index(this); 
     inputs.eq(index + 1).focus(); 
    } 
    }); 
} 

$('#rows').html(generateInputRows()); 
setUpTyping(); 
+0

Das hat funktioniert! Hatte das Problem etwas mit dem separaten "Input" -Ereignis zu tun? – silverAndroid

+1

@silverAndroid Ja - im Wesentlichen war es die Wurzel des "Shuffle", die Sie erwähnt haben. Hier ist eine gute Lektüre: http://StackOverflow.com/Questions/17384218/Jquery-Input-Event –

+0

Sie nur nach unten hier, ist, dass Dinge wie Shift/Shift + Tab wird dazu führen, dass eine Box vorwärts bewegen. Offensichtlich gibt es eine andere Logik, die man einbauen könnte, um das zu verhindern, aber ich wollte das nur da rauswerfen. 'keyup' ist nicht immer das Beste, aber es gibt viele Optionen zu prüfen. – Mark

Verwandte Themen