Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259

Маска для input tel

21.12.2019, 16:21. Показов 6330. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать маску для ввода телефона в форме, и хочу сделать как-бы автодополнение, т.е. пользователь ввёл три цифры - скобка сама закрылась и добавилось тире, еще через три цифры еще тире, и еще через две. Должен получиться ввод типа +7(999)-123-45-67. И всё хорошо получается, но вот если попытаться затереть несколько последних цифр backspace-ом, то он цифры стирает, а дойдя до тире - останавливается.
HTML5
1
<input type="tel" name="phone" placeholder="+7(999)-123-45-67" id="tel-inp">
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let telInp = document.getElementById('tel-inp');
//контроль количества введенных цифр
let howDigits = str => str.split('').filter(el => /\d/.test(el)).length;
//при фокусе подставляем +7(
let whenFocusPhone = e => e.target.value = '+7(';
//чтоб вводились только цифры
let checkPhoneKey = key => key >= '0' && key <= '9';
let checkNumPhone = (e) => {
    if(!checkPhoneKey(e.target.value[e.target.value.length - 1]) || howDigits(e.target.value) > 11)
        e.target.value = e.target.value.slice(0, -1);
    if(e.target.value.length == 6)
        e.target.value += ')-';
    if(e.target.value.length == 11 || e.target.value.length == 14)
        e.target.value += '-';
}
telInp.addEventListener('focus', whenFocusPhone);
telInp.addEventListener('input', checkNumPhone);
telInp.addEventListener('keydown', checkPhoneKey);
Вопросы:
1. Почему backspace не может удалить тире и скобку?
2. Как заставить его это сделать?

P.S. Без автодополнения всё работает как и должно, т.е. проблема только в символах, введенных программно.
Если стрелкой влево перескочить тире то стирает цифру и тире вместе с ней.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2019, 16:21
Ответы с готовыми решениями:

Одинаковая ширина для полей input text & input password
Никак не получается выровнять ширину двух тектовых полей: input type='text' и input type='password' Помогите, пожалуйста.

Маска input для ввода ФИО
Добрый день, дорогие форумчане! Помогите, не могу найти маску для текстового поля. Нужно ФИО разделить на 3 части. Спасибо!

Masked Input - маска для нескольких полей
Здравствуйте. Использую плагин Masked Input для определения маски ввода времени. &lt;input id=&quot;time&quot;...

1
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
22.12.2019, 15:11
Лучший ответ Сообщение было отмечено klopp как решение

Решение

Цитата Сообщение от klopp Посмотреть сообщение
1. Почему backspace не может удалить тире и скобку?
Цитата Сообщение от klopp Посмотреть сообщение
Если стрелкой влево перескочить тире то стирает цифру и тире вместе с ней.
потому, что в обработчике нажатия клавиш Вы со строки 11 при проверке на кол-во цифр равным 6 и в строке 13 - равным 11 или 14, снова дописываете скобку с тире или просто тире. То есть бэкспэйс то работает, но глаз этого не видит из-за того, что скрипт тут же дописывает стертое.
Цитата Сообщение от klopp Посмотреть сообщение
2. Как заставить его это сделать?
пересмотреть алгоритм - https://jsfiddle.net/Qwerty_Wasd/kn87of9v
HTML5
1
<label for="tel-inp">+7 </label><input type="tel" name="phone" placeholder="(999)123-45-67" id="tel-inp">
JavaScript
1
2
3
4
document.getElementById('tel-inp').addEventListener('input', (e) => {
  let x = e.target.value.replace(/\D/g, '').match(/(\d{0,3})(\d{0,3})(\d{0,2})(\d{0,2})/);
  e.target.value = !x[2] ? x[1] : '(' + x[1] + ')' + x[2] + (x[3] ? '-' + x[3] : '') + (x[4] ? '-' + x[4] : '');
});
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2019, 15:11
Помогаю со студенческими работами здесь

Если добавить input динамический маска инпута не работает, почему?
Ест пример динамический добавление инпута сделал максу телефона с помощью mask но он реагирует на добавленные инпута код добавление...

Маска для input
Здравствуйте! Можно ли в input-е сделать маску для времени. делал &lt;input type=&quot;text&quot; required pattern=&quot;\d{2}+(:\d{2})?&quot;...

Маска для input
Привет, друзья! Есть инпут, человеку, например, нужно ввести ссылку на свою страницу в ВК. Можно ли сделать маску или шаблон, который уже...

Маска для input
Для того что бы повесить на id=&quot;telphone&quot; для &lt;inpute&gt;&lt;/inpute&gt; маску. Подключаю в head js скрипт // Call JS $this-&gt;addFile('js',...

Input type='tel:' не видит решетку (#)
Доброго всем Сегодня узнал про Tel URI который может передать номер в звонилку телефона. Номера передаются но возникла проблема со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru