Автоматическая вкладка в следующее поле ввода при заполнении 4 символов

То, что я пытаюсь сделать, - указать на следующую вкладку при заполнении четырех символов. Каждое поле должно содержать 4 символа, и после его завершения он должен перейти к следующему полю ввода.

 $(".inputs").keyup(function () {
        if (this.value.length == this.maxLength) {
          $(this).next('.inputs').focus();
        }
  });

Скрипт.

Ответ 1

Ваш код работает отлично, однако ваши входные элементы задаются как type="number". Нечисловое содержимое игнорируется, поэтому, если вы вводите "abcd", например, входное value пусто (что означает length 0). Если вы вводите "1234", с другой стороны, входное значение равно 1234.

Если вы хотите, чтобы ваш код срабатывал при вводе нечислового содержимого, просто измените каждый тип ввода на text.

<input class="inputs" type="text" maxlength="4" />

JSFiddle демо.

Обратите внимание, что я также удалил атрибут duplicate class из каждого из ваших элементов в этом примере.


Как сказал криш в комментариях к вашему вопросу, в вашем коде есть проблема с тем, что последний элемент input будет продолжать принимать более 4 символов. Чтобы исправить это, поставьте чек на место, чтобы убедиться, что есть next('.inputs') элемент next('.inputs'):

if (this.value.length == this.maxLength) {
  var $next = $(this).next('.inputs');
  if ($next.length)
      $(this).next('.inputs').focus();
  else
      $(this).blur();
}

JSFiddle демо.

Ответ 2

Возможно, вы пренебрегли приложением своего кода в DOM. Jsfiddle заключает ваш код в $(window).load(function() {.....}) и почему он работает. Поэтому на вашей собственной странице используйте:

$(function() {
    $(".inputs").keyup(function () {
        if (this.value.length == this.maxLength) {
          $(this).next('.inputs').focus();
        }
    });
});

В jsfiddle вы можете подтвердить, что, выбрав No wrap - in <head> а затем нажмите кнопку run. Код не будет работать. Но если вы используете выше, который заключен в DOM готов, он работает.

Ответ 3

<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>

Ответ 4

Вот улучшенная версия для всех, кому это нужно для каких-то разделенных Информаций, таких как серийный ключ или что-то в этом роде:

$(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>

Ответ 5

Моя первая проблема с этим была в том, что если вы заполняете поля, которые уже заполнены, вам нужно выбрать каждое поле вручную. Я предлагаю следующее:

    $(".inputs").keyup(function () {
        if (this.value.length == this.maxLength) {
          $(this).next('.inputs').select(); 
        }
});

Решение второй проблемы ускользает от меня. В принципе, в той же ситуации, когда поля были заполнены ранее, если вы набираете слишком быстро, события будут запускаться как таковые: KeyDown KeyDown KeyUp KeyUp

Это приводит к пропуску следующего ввода.