Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Дополнительная проверка введения телефона (https://javascript.ru/forum/dom-window/76654-dopolnitelnaya-proverka-vvedeniya-telefona.html)

Igorsrt 30.01.2019 13:00

Дополнительная проверка введения телефона
 
Здравствуйте!
На сайте установлен скрипт mask-input с форматом "+7 (999) 999-99-99", но клиенты все равно уперто вводят свою восьмерку в начало телефонного номера. Можно ли сделать, что бы эта "8" игнорировалась (удалялась), если ее вставляют в начало номера?
<form class="form-send" data-yaid="zakaz_form">
			    <h2>Заказать звонок</h2>
			    <h3>Наш специалист свяжется с вами в ближайшее время</h3>
				<input type="text" name="name" placeholder="Ваше имя*" class="required">
				<input type="text" name="phone" placeholder="Ваш телефон*" class="required">
				<input type="submit" value="Заказать звонок" class="btn" return="" true;"="">
				<input type="hidden" name="form" value="Заказ звонка">
				<label style="display: block;font-size: 12px;text-align: center;margin: 20px 0;" class="accept">
				    <input type="checkbox" name="accept"> 
				    Нажимая на кнопку, вы даете <a target="_blank" href="/docs/policy.pdf">согласие</a> на обработку своих персональных данных
				</label>
			</form>

laimas 30.01.2019 13:58

"Маска телефона II" ? :)

А телефона 8 899 ... не может быть?

Igorsrt 30.01.2019 14:19

мне почему-то кажется, что все телефоны на 9 начинаются... но если не прав, то поправьте. Как тогда быть?

laimas 30.01.2019 14:30

Цитата:

Сообщение от Igorsrt
мне почему-то кажется

Когда кажется, тогда крестятся ;)

http://www.1sn.ru/25874.html

laimas 30.01.2019 14:33

Цитата:

Сообщение от Igorsrt
Как тогда быть

Выбрасывайте плагин, пусть вводят как хотят и как привыкли. Пишите свой обработчик, задача которого просто проверять чтобы было 11 цифр в итоге и в начале 7 (с плюсом или нет, не важно) или 8. А отформатировать телефон при выводе на страницах можно как вашей душе угодно, это не есть проблема.

Nexus 30.01.2019 14:41

Цитата:

Сообщение от laimas
Выбрасывайте плагин, пусть вводят как хотят и как привыкли.

А почему вы не рассматриваете вариант с банальным изменением маски на тот, к примеру, что ниже?
9 (999) 999-99-99

Igorsrt 30.01.2019 14:47

не знаю, мне почему-то идея с удалением восьмерки кажется прикольной (пусть у "горячих линий" телефон на 8 начинается, но с них же обратных звонков не заказывают обычно)...
ну или какой обработчик, что бы он позволял и 10 и 11 цифр ввести

laimas 30.01.2019 14:51

Цитата:

Сообщение от Nexus
А почему вы не рассматриваете вариант с банальным изменением маски на тот, к примеру, что ниже?

Первую серию эпопеи прочтите. :) Насколько можно судить, проблема не в первой цифре маски, которая уже набрана, а в том, что ее вводят в позицию второй цифры. Если плагин маски позволяет вводить все цифры номера, тогда я не понимаю проблемы.

laimas 30.01.2019 15:01

Цитата:

Сообщение от Igorsrt
обработчик, что бы он позволял и 10 и 11 цифр ввести

<input name="phone" />
<script>
document.querySelector('[name="phone"]').addEventListener('input', function() {
    this.value = this.value.trim().replace(/^[^\+78]/, '')
})
</script>


То есть, если первый символ, это не + или 7, или 8, то удаляется. А далее ввод, а вводить кто как любит, кто через пробелы, кто через дефисы, кто со скобками, кто без, них, а проще просто цифры. Перед тем как отправлять форму, это поле можно проверить, удалив из его значения все не цифры - должно быть 11 цифр, иначе генерируем ошибку.

PS. Нет, такой шаблон не пойдет, оно позволяет после + ввести любое, надо подумать.

Dilettante_Pro 30.01.2019 15:10

Цитата:

Сообщение от Igorsrt
пусть у "горячих линий" телефон на 8 начинается

Не только у горячих.
Например, телефонный код Санкт-Петербурга +7 812, Самары +7 846 и т.п.
Или вы предполагаете, что могут указывать только номера сотовых телефонов?

Igorsrt 30.01.2019 15:17

что-то не работает (

laimas 30.01.2019 15:19

Цитата:

Сообщение от Igorsrt
что-то не работает

Шаблон другой должен быть.

Nexus 30.01.2019 15:23

Цитата:

Сообщение от laimas
Первую серию эпопеи прочтите. Насколько можно судить, проблема не в первой цифре маски, которая уже набрана, а в том, что ее вводят в позицию второй цифры. Если плагин маски позволяет вводить все цифры номера, тогда я не понимаю проблемы.

Из мухи слона сделали.
На одном проекте были точно такие же проблемы, смена маски её решила за 2 минуты и никаких эпопей.

laimas 30.01.2019 15:30

Цитата:

Сообщение от Nexus
смена маски её решила за 2 минуты

Ну так в чем проблема?

Nexus 30.01.2019 15:32

Цитата:

Сообщение от laimas
Ну так в чем проблема?

Не у меня спрашивать нужно.
В прошлой теме я уже предлагал решить проблему этим способом.

Igorsrt 30.01.2019 15:36

Проблема в том. Что в маске телефона 10 цифр. Если человек начинает вводить "по привычке" с восьмеркой 8962.... то последняя цифра не сохраняется, в результате перезванивать некуда...
Я за любое разумное решение данной проблемы )

Nexus 30.01.2019 15:40

Цитата:

Сообщение от Igorsrt
Я за любое разумное решение данной проблемы

Я уже три раза точно написал решение проблемы.
Вы издеваетесь?

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script>

<input type="text"/>

<script>$('input').mask('9 (999) 999-99-99');</script>

laimas 30.01.2019 15:42

Цитата:

Сообщение от Nexus
В прошлой теме я уже предлагал решить проблему этим способом.

Заинтриговали :D Сподобился тоже подключить сей плагин и попробовать, вывод - маска 9 (.... позволяет начать номер и с девятки, то есть мало одной проблемы, еще одну добавили? )

Nexus 30.01.2019 15:44

laimas, если человек захочет что-то сломать - он это сделает.
Адекватный человек введет корректный номер телефона и никаких проблем ни у кого не возникнет.

laimas 30.01.2019 15:56

Цитата:

Сообщение от Nexus
Адекватный человек введет корректный номер телефона

Вашими устами да мед пить. :) На то они и проверки, и прочий мусор, который приходится закачивать пользователю, чтобы отсечь всяких неадекватов.

Igorsrt 30.01.2019 16:10

Цитата:

Сообщение от Nexus (Сообщение 502953)
Я уже три раза точно написал решение проблемы.
Вы издеваетесь?

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script>

<input type="text"/>

<script>$('input').mask('9 (999) 999-99-99');</script>

я извиняюсь, а в чем здесь решение? что человеку в обязательном порядке нужно вводить 11 цифр а не 10?

Nexus 30.01.2019 16:30

Цитата:

Сообщение от laimas
Вашими устами да мед пить.

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script>

<input type="text"/>

<script>
$('input').mask('# (999) 999-99-99',{
	translation:{
		'#':{
			pattern:/(7|8)/
		}
	}
});
</script>

Nexus 30.01.2019 16:34

Цитата:

Сообщение от Igorsrt
что человеку в обязательном порядке нужно вводить 11 цифр а не 10?

Именно в этом.

j0hnik 30.01.2019 22:40

Цитата:

Сообщение от Igorsrt (Сообщение 502958)
я извиняюсь, а в чем здесь решение? что человеку в обязательном порядке нужно вводить 11 цифр а не 10?

Лучше так, 8 или 7, ВЫ не ошибетесь, а пользователю меньше геморроя.

Самое зло которое бывает, при копировании и вставке номера будет исчезать какая-то цифра, что зачастую даже на крупных порталах, где штат разрабов присутствует.

Igorsrt 31.01.2019 09:34

а я вот так попробовал:
$("input[name=phone]").mask('+7 (#99) 999-99-99',{
	translation:{
		'#':{
			pattern:/(9)/
		}
	}
});

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

Nexus 31.01.2019 09:51

Цитата:

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

Точно так же, как и в самом начале...

Удачи вам в вашем нелегком деле.

Igorsrt 31.01.2019 10:22

Цитата:

Сообщение от Nexus (Сообщение 502994)
Удачи вам в вашем нелегком деле.

Да уже сам задолбался, если честно... (
Сейчас почему-то не проверяется количество цифр - т.е. можно ввести неполный номер и он отправится..

Malleys 06.02.2019 02:23

У вас же есть кнопка «Заказать звонок». После того, как пользователь ввёл номер телефона, предполагается, что он нажмёт на эту кнопку. У вас есть время, чтобы успеть вывести сообщение о том, на какой номер будет совершён вызов. Будет ли?

Вам ни в коем случае нельзя мешать пользователю вводить данные, лучше напишите позднее, что не так с вводом! Пользователь даже может не заметить, что какой-либо символ не был введён!

Цитата:

Сообщение от Igorsrt
Можно ли сделать, что бы эта «8» игнорировалась (удалялась), если её вставляют в начало номера?

Trunk prefix может быть удалён (или заменён на «+7») при помощи регулярного выражения, после того, как номер прошёл проверку на действительность.

Код:

x (xxx  xx)x-xx-xx
x (xxx  x)xx-xx-xx
x (xxx)  xxx-xx-xx
^  ^^^  ^^^^^^^^^^
|  |||  местный
|  |||    номер
|  код
|  местности
|
код
страны

Как я понимаю, вам нужны исключительно номера абонентов из Российской Федерации (РФ), то номер телефона будет начинаться с «+7», но не с «+76» или с «+77» (Казахстан) и не с «+7840» или с «+7940» (Абхазия). Также вы можете указать рядом с полем ввода, что необходимо ввести номер, зарегистрированный в РФ, в таком случае могут быть разрешены номера без кода страны и с trunk prefix.

Местные номера в РФ могут состоять из 5, 6 или 7 цифр, но вам нужно, чтобы посетители вводили номер вместе с кодом местности. Национальный номер состоит из 10 цифр, в который входят код местности (3 цифры) и номер абонента (7 цифр).

Цитата:

Сообщение от Igorsrt
мне почему-то кажется, что все телефоны на 9 начинаются... но если не прав, то поправьте. Как тогда быть?

Вы абсолютно правы в случае номеров мобильных телефонов в РФ!

Цитата:

Сообщение от Igorsrt
что бы он позволял и 10 и 11 цифр ввести

В общем виде номер телефона в РФ можно представить так:
/^(?<country>\+?7|8|0)?(?<area>\d{3})(?<number>\d{7})$/

Группа area может быть выражена более точно так:
/^(?![89]40|97[0-1])(?:[349]\d{2}|8[1-7]\d)$/

https://en.wikipedia.org/wiki/Teleph...bers_in_Russia
https://en.wikipedia.org/wiki/List_o..._calling_codes

Вот пример целиком...
<form method="post">
	<input type="tel" autocomplete="tel" name="phone" placeholder="Ваш телефон∗" required>
	<p class="info"></p>
</form>

<script>
	
document.addEventListener("input", ({ target }) => {
	if(target.matches("input[type=tel]")) {
		const phone = target.value.trim()
			.replace(/[^\+\d]/g, "")
			.replace(/(.)\++/g, "$1");

		let match, message;

		if (match = phone.match(/^(\+?7|8|0)?((?![89]40|97[0-1])(?:[349]\d{2}|8[1-7]\d))(\d{7})$/)) {
			const [, country, area, number] = match;
			message = `
				<p>Мы позвоним вам по номеру +7 (${area}) ${number.replace(/(\d{2})(?=(?:\d{2})+$)/g, "$1-")}</p>
				<p>
					<button>Подтвердить</button>
					<button type="reset">Отменить</button>
				</p>
			`;
		} else {
			message = "Введён неверный номер!";
		}

		document.querySelector("input[type=tel] + .info").innerHTML = message;
		target.setCustomValidity(match ? "" : "Введён неверный номер");
	}
});

</script>


Цитата:

Сообщение от laimas
Пишите свой обработчик, задача которого просто проверять чтобы было 11 цифр в итоге и в начале 7 (с плюсом или нет, не важно) или 8

Достаточно 10 цифр, без плюса номер 7xxxxxxxxx нормализуется до +77xxxxxxxxx, но это номер не из РФ.

Цитата:

Сообщение от Igorsrt
Я за любое разумное решение данной проблемы )

Цитата:

Сообщение от j0hnik
Самое зло которое бывает, при копировании и вставке номера будет исчезать какая-то цифра, что зачастую даже на крупных порталах, где штат разрабов присутствует.

В input[type=tel] всё нормально вставляется.
Вполне корректными могут быть такие запросы...
«9161234567»
«916-123-45-67»
«8916-1-234-567»
«+7 (916) 123-45-67»
«Тел.: +79161234567»
«позвоните на +79161234567»

Во всяком случае формы с побочными эффектами должны, по моему мнению, сообщать, что же в результате произойдёт!

P. S. Используйте атрибут autocomplete="tel" и type="tel" дабы пользователям не производить лишних телодвижении на не той клавиатуре.


Часовой пояс GMT +3, время: 18:34.