Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   валидация номера телефона (https://javascript.ru/forum/jquery/70246-validaciya-nomera-telefona.html)

Capitalist 22.08.2017 09:53

валидация номера телефона
 
Друзья, вконтактной форме есть несклько полей ввода в однужно одном из них нужно добавить проверку ввода номера телефона.
Использую маску и плагин валидации jquery
Функция валидации
$.validator.addMethod('phonemask', function (value, element) {
    return this.optional(element) || /\([0-9]{3}\)\s[0-9]{3}-[0-9]{2}-[0-9]{2}/.test(value);
});


C проверкой других полей на наличие в них текста все понятно
$(AllInputs).each(function() {
if($.trim(this.value) == '') {
                InputFiled = $(this).parent().find('.label-required').html();
                mistake += '- ' + InputFiled + '\n';
            }
        });
if(mistake.length > 0) {
            alert('Fill the fields please:\n' + mistake);
            return false;


А вот как вшить сюда проверку input с классом .phone по указанной максе уже голову сломал
Подскажите, чем можете )

ksa 22.08.2017 10:03

Цитата:

Сообщение от Capitalist
А вот как вшить сюда проверку input с классом .phone

Как вариант...
if ($(this).hasClass('phone ')) {/*...*/};

Capitalist 22.08.2017 10:18

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

if(mistake.length > 0) {
	            alert('Fill the fields please:\n' + mistake);
	            return false;

ksa 22.08.2017 10:53

Цитата:

Сообщение от Capitalist
Нужно создать еще одну переменную например mistake1 или как-то можно записхать в ту же mistake?

Можно в отдельный,
а можно и в общий...
(с) В.Высоцкий

mistake можно сделать объектом или массивом из двух пустых массивов... В те массивы потом добавлять сообщения...
По окончании проверки, проверять какого типа есть сообщения и задавать им соответствующий заголовок. Потом собственно добавлять те сообщения.

Capitalist 22.08.2017 11:34

А могу ли я просто сравнивать значение input (.phone).val() == '/\([0-9]{3}\)\s[0-9]{3}-[0-9]{2}-[0-9]{2}' ? обойтись без функции из первого сообщения.

Будет ли так работать?

ksa 22.08.2017 11:40

Capitalist, ты понимаешь что пишешь? :)

Цитата:

Сообщение от Capitalist
input (.phone).val()

Вообще даст ошибку...

Сравнивать строку с номером телефона со строкой, в которой написано регулярное выражение не имеет смысла... :no:

laimas 22.08.2017 12:21

Capitalist,
во-первых /\(\d{3}\)\s\d{3}-\d{2}-\d{2}/
во-вторых шаблон можно прописать в атрибут pattern и браузер поддерживающий его при вводе в поле будет произведет нативную проверку
в третьих, поле может иметь атрибут required, и сценарий может производить проверку заполнения таких полей, если браузер не поддерживает нативной и если поле имеет pattern, то по нему и проверять
в четвертых, достаточно проверки булева значения - if(!$.trim(this.value)) ...

рони 22.08.2017 17:09

мысли вслух: есть $.validator ... зачем ещё какие-то проверки?

Capitalist 23.08.2017 16:04

laimas, о спасибо большое.
во-первых и во-вторых сделал, работает
"если браузер не поддерживает нативной" это прямо условие можно такое задать?

if(!$.trim(this.value)) - как я понимаю если после удаления пробелов в начале и конце строки, строка не пустая = true то ищем input с pattern? как проверить что строка с регулярным выражением в pattern совпадает?
понимаю что в случае несоответствия выражения с pattern получаем mistake1
меня бы больше устроил как раз предложенный вариант так как заодно в поле эмейл тоже сделал pattern, все прекрасно



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

laimas 23.08.2017 17:00

Цитата:

Сообщение от Capitalist
"если браузер не поддерживает нативной" это прямо условие можно такое задать?

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

if(!"required" in document.createElement("input")) {
    //нет поддержки, проверка скриптом
}


Но, например, Apple давно забросил поддержку своего Safari под Windows и хотя этот браузер отвечает, что поддерживается "required", в тоже время с чистой совестью отправит форму и пустым таким полем. То есть кроме этого нужно еще и браузер, и ОС проверить.

Цитата:

Сообщение от Capitalist
if(!$.trim(this.value)) - как я понимаю если после удаления пробелов в начале и конце строки, строка не пустая = true

Наоборот, это условие вернет true, если строка пустая (false), то есть сообщение - "Заполнить!".

А если нет, обязательное поле заполнено, то проверка согласно условию заполнения. В случае если условие описывается шаблоном рег. выражения (это можно узнать как this.pattern), то конструктором RegExp создаем объект регулярного выражения и проверяем:

var re = new RegExp(f[i].pattern);
if(!re.this.value)) {
    //значение не соответствует рег. выражению
}


Вот только почему ваш телефон начинается с (XXX), видимо плагин подставляет первую цифру. Если же проверять по pattern, то в нем должен быть описан полный формат номера.

laimas 23.08.2017 17:00

Цитата:

Сообщение от Capitalist
"если браузер не поддерживает нативной" это прямо условие можно такое задать?

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

if(!"required" in document.createElement("input")) {
    //нет поддержки, проверка скриптом
}


Но, например, Apple давно забросил поддержку своего Safari под Windows и хотя этот браузер отвечает, что поддерживается "required", в тоже время с чистой совестью отправит форму и с пустым таким полем. То есть кроме этого нужно еще и браузер, и ОС проверить.

Цитата:

Сообщение от Capitalist
if(!$.trim(this.value)) - как я понимаю если после удаления пробелов в начале и конце строки, строка не пустая = true

Наоборот, это условие вернет true, если строка пустая (false), то есть сообщение - "Заполнить!".

А если нет, обязательное поле заполнено, то проверка согласно условию заполнения. В случае если условие описывается шаблоном рег. выражения (это можно узнать как this.pattern), то конструктором RegExp создаем объект регулярного выражения и проверяем:

var re = new RegExp(this.pattern);
if(!re.this.value)) {
    //значение не соответствует рег. выражению
}


Вот только почему ваш телефон начинается с (XXX), видимо плагин подставляет первую цифру. Если же проверять по pattern, то в нем должен быть описан полный формат номера.

Capitalist 23.08.2017 17:55

Ух представлял все проще

Цитата:

Наоборот, это условие вернет true, если строка пустая (false), то есть сообщение - "Заполнить!".
А я использую mask jquery, в моем случае строка не может быть никак пустой. по этой причине у меня и встал вопрос валидации изначально. эту проверку можно опустить?

Проверка сафари - как-то так?

var Sb = navigator.userAgent.toLowerCase();
if (Sb.indexOf("safari/") !== -1 &&  
    Sb.indexOf("windows") !== -1 
    ) {
}

Узнал я что сафари, а в случае сафари проверка какаято другая? Даже не представляю

Цитата:

Вот только почему ваш телефон начинается с (XXX), видимо плагин подставляет первую цифру. Если же проверять по pattern, то в нем должен быть описан полный формат номера.
Может пользователь написать, если же он не поставит плагин автоматом поставит 8

pattern="/8\s\([0-9]{3}\)\s\[0-9]{3}-[0-9]{2}-[0-9]{2}/"

laimas 23.08.2017 18:14

<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body>
<form>
<input style="width:300px" required="" pattern="8\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}" placeholder="Используйте формат: 8 (NNN) NNN-NN-NN" />
<button>Send</button>
</form>
</body>
</html>


Попробуйте отправить эту форму с пустым полем или отличным от указанного формата.

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

Хотя это мое мнение, вы поступайте так как считаете нужным.

У вас есть плагин проверки ввода номера, просто прочтите в документации о его методах, а то сдается мне запутаетесь в скриптах и ...

Capitalist 23.08.2017 18:37

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

я изначально может не так понял
должно быть так: если отсутствует нативная проверка ИЛИ браузер сафари и ос windows, то выпаолняем скрипт.... ? никакого отдельного скрипта для сафари не пишется? (если пишется то не стоит объяснять, не пойму)
если не пишется, то проверка сафари будет примерно методом как я указал в предыдущем посте?

laimas 23.08.2017 18:49

Цитата:

Сообщение от Capitalist
должно быть так: если отсутствует нативная проверка ИЛИ браузер сафари и ос windows, то выпаолняем скрипт.... ?

Да.

Цитата:

Сообщение от Capitalist
икакого отдельного скрипта для сафари не пишется?

Да, то есть все браузеры "инвалиды" и Safari for Widows будут проверяться одним js-сценарием.


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