маску на два инпута для ввода телефона

179
09 февраля 2020, 03:40

Вот макет

Вот HTML

   <div class="tel_inputs_wrapp">
        <p>+7</p>
        <div class="input_1">
            <p>(</p>
            <input type="number" alt="" placeholder="" />
            <p>)</p>
        </div>
        <div class="input_2">
            <input type="number" alt="" placeholder="" />
        </div>
    </div>

Сверстать макет можно как пожелаете, главное чтобы было похоже. Нужно чтобы при вводе трех цифр в первый инпут тот что в скобках курсор автоматически переходил на следующий инпут еще для 7 цифр. Как такую маску сделать?

Answer 1

Записал на четырех инпутах... Наверно можно было бы покороче, но тут оно тупо берет и проверяет количество введенных символов при вводе. Если кол-во оказывается больше, чем надо - переключает фокус на следующий инпут.

(!) UPD → Вероятно через slice() можно было и вовсе на одном инпуте всё организовать и куда проще. Просто я как начал на 4-х, так и довел до конца.

JsFiddle

(function(){ 
 
const moo = document.getElementsByClassName('moo'); 
//сразу ставим фокус при клике на div id="focus".  
//click можно заменить на mouseenter и смотреть что там получается 
document.getElementById('focus').addEventListener('click',function(){ 
  const L0 = moo[0].value.length; 
  const L1 = moo[1].value.length; 
  const L2 = moo[2].value.length; 
  const L3 = moo[3].value.length; 
  //проверяем, если везде всё заполнено - возвращаемся и ничего не трогаем 
  if( L0 == 3 && L1 == 3 && L2 == 2 && L3 == 2 ) {return;} 
  //если оно не вернулось и всё еще тут - проверит остальные варианты заполнения 
  //(на случай, если пользователь заполнил не всё. Чтобы всегда фокус не ставился на первом) 
       if( L0 < 3 ) { moo[0].focus(); } 
  else if( L0 == 3 && L1 < 3) { moo[1].focus(); } 
  else if( L0 == 3 && L1 == 3 && L2 < 2) { moo[2].focus(); } 
  else if( L0 == 3 && L1 == 3 && L2 == 2) { moo[3].focus(); } 
});//Символ && означает "и" = одновременное выполнение нескольких условий 
 
//Само переключение фокуса при вводе 
for(let i = 0; i < moo.length; i++){ 
  moo[i].addEventListener('input', function(){ 
    //для этого в HTML добавил data-num=".." чтобы здесь получить это число 
    //и не добавлять лишних условий. Условие i < 3, чтобы не было ошибки 
    if( i < 3 && this.value.length == Number( this.dataset.num ) ){ 
      moo[(i+1)].focus(); 
    } 
    //на последнем инпуте не переключение фокуса нужно, а запрет... 
    //Если введенное число оказалось 3-м, режем введенное через slice() 
    //оставляя только первые 2 символа 
    if( moo[3].value.length > 2 ){ 
      moo[3].value = moo[3].value.slice(0,2); 
    } 
  }); 
   
  //keyup дает возможность определить нажатую кнопку. 
  //если внутри текущего инпута пусто, а был нажат b-space, переключаем фокус 
  moo[i].addEventListener('keyup', function(e){ 
    if( e.key.match(/Backspace/ig) && this.value.length == 0 && i > 0) { 
        moo[(i-1)].focus(); 
    } 
  }); 
} 
 
})();
.black {font-size:20px;display:inline-block;} 
.orange {border-bottom: 2px solid orange;display:inline-block;} 
.moo { 
  border:none; 
  outline:none; 
  width: 30px; 
  text-align:center; 
}
<div id="focus"> 
  <div class="black">+7 ( </div> 
  <div class="orange"> 
    <input class="moo" data-num="3" placeholder="* * *"> 
  </div> 
  <div class="black"> ) </div> 
  <div class="orange"> 
    <input class="moo" data-num="3" placeholder="* * *"> -  
    <input class="moo" data-num="2" placeholder="* *"> -  
    <input class="moo" data-num="2" placeholder="* *"> 
  </div> 
</div>

Немного поигрался... Mouseenter выглядит лучше, чем click. Но он позволяет в одном инпуте напечатать больше символов чем надо. Задолбался условия добавлять и оставил это дело вам)) [например покрасить число в красный, если оно оказалось длиннее чем надо]

READ ALSO
CryptoPro ошибка spki.algorithm.parameters

CryptoPro ошибка spki.algorithm.parameters

При переходе на новый алгоритм шифрования ГОСТ Р 3410-2012 256 сервер начал выдавать ошибку spki

183
Для чего нужно поле ConcurrencyStamp таблицы AspNetUsers в identity?

Для чего нужно поле ConcurrencyStamp таблицы AspNetUsers в identity?

Внимание! Это перевод вопроса What is the purpose of the ConcurrencyStamp column in the AspNetUsers table in the new ASPNET MVC 6 identity?

188
Не работает ImageSource.FromStream Xamarin Forms

Не работает ImageSource.FromStream Xamarin Forms

Нужно загрузить картинку с использованием HttpClientНо нижеприведенный код не работает

192
Как называется класс, у которого все поля (свойства) открытые

Как называется класс, у которого все поля (свойства) открытые

Яркий пример - модели в том же EntityFramework наNET

149