Задать вопрос
ItzIsonn
@ItzIsonn
Type something...

Как можно улучшить перескакивание по input'am и их проверку на заполненость?

У меня есть 2 строки с input'ами в которые помещается только 1 символ. Мне надо, чтобы при введении символа перескакивало на следующий input, а при удалении - на предыдущий. Сейчас так и работает. Мне бы хотелось добавить, что если человек написал половину слова и остановился на пустом input'e, чтобы он мог "стереть" его и перейти на предыдущий. И там еще есть функция, которая проверяет, заполнены ли они все и при нажатии на enter выполняется действие.

Также, подскажите, можно ли уменьшить этот код, и чтобы можно было использовать не для 2-ух строк, а для 5, к примеру?

HTML
<div class="row1">
                <input class="input11" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=11 style="margin-left: 155px;">
                <input class="input12" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=12>
                <input class="input13" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=13>
                <input class="input14" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=14>
                <input class="input15" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=15>
                <input class="input16" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=16>
            </div>

            <div class="row2">
                <input class="input21" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=21 style="margin-left: 155px;">
                <input class="input22" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=22>
                <input class="input23" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=23>
                <input class="input24" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=24>
                <input class="input25" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=25>
                <input class="input26" type="text" maxlength="1" oninput='this.value=this.value.replace(/[^а-яё]+/g, "");' data-n=26>
            </div>


JavaScript
const inputs1 = document.querySelectorAll('.row1');
const inputs2 = document.querySelectorAll('.row2');



inputs1.forEach(i => {
  i.addEventListener('input', onInput);
  i.addEventListener('keydown', onKeyDown);
})

function onInput(e) {
  e.target.value = e.target.value[e.target.value.length - 1] || "";
  const n = e.target.dataset.n
  const next = document.querySelector(`input[data-n="${+n + 1}"]`)
  if (e.target.value == "") {
    if (n == 1) {
      document.querySelector(`input[data-n=1]`).focus();
    } else {
      document.querySelector(`input[data-n="${+n - 1}"]`).focus();
    }
  } else {
    if (next) {
      next.focus()
    }
  }
}

function onKeyDown(e) {
  if (e.key === 'Enter') {
    e.preventDefault();
    if (checkinputs1()) {
      checkRight();
    }
  }
}

function checkinputs1() {
  let isFilled = true;
  inputs1.forEach(i => {
    if (!i.value) {
      isFilled = false;
    }
  });
  return isFilled;
}

inputs2.forEach(i => {
  i.addEventListener('input', onInput);
  i.addEventListener('keydown', onKeyDown);
})

function onInput(e) {
  e.target.value = e.target.value[e.target.value.length - 1] || "";
  const n = e.target.dataset.n
  const next = document.querySelector(`input[data-n="${+n + 1}"]`)
  if (e.target.value == "") {
    if (n == 1) {
      document.querySelector(`input[data-n=1]`).focus();
    } else {
      document.querySelector(`input[data-n="${+n - 1}"]`).focus();
    }
  } else {
    if (next) {
      next.focus()
    }
  }
}

function onKeyDown(e) {
  if (e.key === 'Enter') {
    e.preventDefault();
    if (checkinputs2()) {
      checkRight();
    }
  }
}

function checkinputs2() {
  let isFilled = true;
  inputs2.forEach(i => {
    if (!i.value) {
      isFilled = false;
    }
  });
  return isFilled;
}

//дальше там 2 функции с выполняемым кодом при успешной обработке


Мне этот код подсказали, поэтому могу много чего не понимать
  • Вопрос задан
  • 69 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽