Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Валидация формы JQuery (https://javascript.ru/forum/dom-window/65381-validaciya-formy-jquery.html)

K_arina 15.10.2016 18:08

Валидация формы JQuery
 
У меня есть файл .html и .css. Работаю в Brackets. При нажатии на кнопку на сайте, открывается типичная форма: имя, номер телефона, e-mail, и поле для текста. Все работает. Но нужно сделать проверку на корректность введенных данных с помощью библиотеки JQuery. Желательно отдельным js файлом (но сойдет и в html js функции).

P.S. С JS работаю только один день

laimas 15.10.2016 18:18

Ну так выбирайте плагин, подключайте.

А уж с конкретно выбранным какие либо проблемы, тогда вопрос.

K_arina 15.10.2016 18:35

Какой плагин?

K_arina 15.10.2016 18:36

Все варианты кода, которые я находила в инете, у меня не работают

laimas 15.10.2016 18:46

Цитата:

Сообщение от K_arina
Все варианты кода, которые я находила в инете, у меня не работают

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

Можно этот взять, можно иной. Иначе чего вы хотите услышать в ответ?

K_arina 15.10.2016 18:53

Задача в том, чтобы сделать все без плагина.


Есть некая кнопка, при нажатии которой появляется модальное окно с формой.

<div id="openModal" class="modalDialog">
        <div> <a href="#close" title="Закрыть" class="close">X Close </a>
            <form method="post" action="#">
                <input type="name" id="name" placeholder="Ваше имя!" required /><span id="validName"></span>
                
                <h1> <input name="submit" class="btn" type="submit" value=  "Ok!"  /></h1> </form>
             </div>
    </div>


Теперь мне нужно написать функцию для проверки валидности поля "Name" : поле должно состоять только из русских букв.

laimas 15.10.2016 18:57

<input type="name" id="name" placeholder="Ваше имя (только русские)" pattern="[а-яёА-ЯЁ]{2,}" required />

H1 для Ок, это круто. :)

K_arina 15.10.2016 18:57

<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $('#name').blur(function () {
                if ($(this).val() != '') {
                    var pattern = [а-я]/i;
                    if (pattern.test($(this).val())) {
                        $(this).css({
                            'border': '1px solid #569b44'
                        });
                        $('#valid').text('Верно');
                    }
                    else {
                        $(this).css({
                            'border': '1px solid #ff0000'
                        });
                        $('#valid').text('Не верно');
                    }
                }
                else {
                    $(this).css({
                        'border': '1px solid #ff0000'
                    });
                    $('#valid').text('Поле не должно быть пустым');
                }
            });
 });
    </script>

Пыталась так, но ничего не получается

K_arina 15.10.2016 19:00

Цитата:

Сообщение от laimas (Сообщение 431808)
<input type="name" id="name" placeholder="Ваше имя (только русские)" pattern="[а-яёА-ЯЁ]{2,}" required />

H1 для Ок, это круто. :)

Так просто??? Спасибо)

K_arina 15.10.2016 19:02

laimas,
Ой, а мы ж получается не используем JQuery?

laimas 15.10.2016 19:05

Цитата:

Сообщение от K_arina
Так просто???

Ну вы же пишите - required, а это доступно только в HTML5, а в нем также доступны и шаблоны.

Вот только изначально ваш вопрос звучит как нечто "хочу то, не знаю что".

А H1 должен быть на странице в количестве одна штука и не больше и никак не Ок в форме. ;)

K_arina 15.10.2016 19:07

Rise,
Правила валидации:
Поле Name {только русские буквы}
Поле Number {только цифры, регулярное выражение типа (___) ___ __ __}
E-mail {регулярное выражение типа smth@smth.smth}

Обязательно использовать JQuery

laimas 15.10.2016 19:08

Цитата:

Сообщение от K_arina
Ой, а мы ж получается не используем JQuery?

А почему именно jQuery?

1) - пост выше о HTML5
2) - нужна поддержка старых браузеров? Тогда и нужен будет JS. Обязательно JQuery? Не проблема, и если не хотите плагинов, то можно использовать для проверки правила прописанные в pattern при отправке формы используя JQ.

laimas 15.10.2016 19:10

Цитата:

Сообщение от K_arina
Поле Number {только цифры, регулярное выражение типа (___) ___ __ __}

Это уже не Number будет, так как по условию это не только цифры.

K_arina 15.10.2016 19:10

Цитата:

Сообщение от laimas (Сообщение 431814)
А почему именно jQuery?

1) - пост выше о HTML5
2) - нужна поддержка старых браузеров? Тогда и нужен будет JS. Обязательно JQuery? Не проблема, и если не хотите плагинов, то можно использовать для проверки правила прописанные в pattern при отправке формы используя JQ.


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

K_arina 15.10.2016 19:12

laimas,
Почему не только цифры? Это номер телефона, просто поле должно быть с маскировкой и проверкой.

laimas 15.10.2016 19:19

Цитата:

Сообщение от K_arina
Почему не только цифры? Это номер телефона, просто поле должно быть с маскировкой и проверкой.

Потому, что есть в HTML5 поле и типа number, а в нем разрешен ввод только чисел, и это поле имеет (не у всех версий браузеров) стрелочки для набора.

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

<input name="name" required="" pattern="[а-яёА-ЯЁ]{2,12}" />
<input name="phone" required="" pattern="^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$" />
<input name="email" type="email" required="" pattern="^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$" />

K_arina 15.10.2016 19:35

Rise,
Мне и нужно не через pattern, а через функции и js. Так ведь можно проверить????

laimas 15.10.2016 20:05

Цитата:

Сообщение от K_arina
Мне и нужно не через pattern, а через функции и js. Так ведь можно проверить????

Можно:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script> 
$(function() {
    $('#formcheck').submit(function() {
        var err = [], p = [
                            [/[а-яёА-ЯЁ]{2,12}/, 'Ввод имени некорректный'],
                            [/^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$/, 'Ввод телефона некорректный'], 
                            [/^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$/, 'Ввод электронного адреса некорректный']
                         ];
        $(this).find('input').each(function(i, e) {
            var v = $.trim(e.value);
            if(!v || !(p[i][0]).test(v)) err.push(p[i][1])
        })
        if(err.length) {
            alert(err.join('\n'));
            return false;
        }
    })
});
</script>     
</head> 
<body>
<form id="formcheck">
<input name="name" />
<input name="phone" />
<input name="email" />
<button>GO</button>
</form>
</body> 
</html>


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

PS. Хотя, если обязательно JQ, то var v = $.trim(e.value); нужно заменить на var v = $(this).val();, а до $(function() { прописать следующее:

$.valHooks.input = {
    get: function(e) {
        return $.trim(e.value)
    }
};

K_arina 15.10.2016 21:44

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="jquery.maskedinput.js"></script>
    <script src="script.js"></script>
    <script scr="jquery-3.1.1.js"></script>
    
    
  <script type="text/javascript">
<script> 
$.valHooks.input = {
    get: function(e) {
        return $.trim(e.value)
    }
};

$(function() {
    $('#formcheck').submit(function() {
        var err = [], p = [
                            [/[а-яёА-ЯЁ]{2,12}/, 'Ввод имени некорректный'],
                            [/^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$/, 'Ввод телефона некорректный'], 
                            [/^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$/, 'Ввод электронного адреса некорректный']
                         ];
        $(this).find('input').each(function(i, e) {
            v = $(this).val();
            if(!v || !(p[i][0]).test(v)) err.push(p[i][1])
        })
        if(err.length) {
            alert(err.join('\n'));
            return false;
        }
    })
});
    
</script>
    <script type="text/javascript">

jQuery(function($) {

$.mask.definitions['~']='[+-]';



$('#phone').mask('(999) 999-9999');



});</script>


Добавила маску для телефона и код перестал работать:( Как исправить?
PS Сама маска работает

laimas 15.10.2016 22:04

jQuery(function($) - это уже объявлено в коде, $(function(), повторений не надо.
Это

$.mask.definitions['~']='[+-]';
$('#phone').mask('(999) 999-9999');

убрать, а шаблон /^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$/ заменить на /^\(\d{3}\)\s{1}\d{3}-\d{3}$/

PS. Или вы используете плагин, который форматирует ввод номера?

K_arina 15.10.2016 22:36

laimas,
Хотела чтобы у поля телефона была такая вот подсказка +38 (___) ___ __ __ , которая не исчезает после клика по заполняемому полю.
И да, прочитала информацию про плагин Masked Input и захотелось его применить)

laimas 15.10.2016 22:41

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

$(function() {
    
    $.mask.definitions['~']='[+-]';
    $('#phone').mask('(999) 999-9999');

    
    $('#formcheck').submit(function() ....


а шаблон проверки телефона должен быть таким:

/^\+38\s{1}\(\d{3}\)\s{1}\d{3}-\d{3}$/

K_arina 15.10.2016 22:49

laimas,Исправила, но не работает. Может много скриптов подключила? Или ошибка где-то, не могу найти.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="jquery.maskedinput.js"></script>
<script src="script.js"></script>
<script scr="jquery-3.1.1.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script>
    $(function () {
        $.mask.definitions['~'] = '[+-]';
        $('#phone').mask('(999) 999-9999');
        $('#formcheck').submit(function () {
            var err = []
                , p = [

                    [/[а-яёА-ЯЁ]{2,12}/, 'Ввод имени некорректный'],
                    [/^\+38\s{1}\(\d{3}\)\s{1}\d{3}-\d{3}$/, 'Ввод телефона некорректный'],

                    [/^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$/, 'Ввод электронного адреса некорректный']

                         ];
            $(this).find('input').each(function (i, e) {
                var v = $.trim(e.value);
                if (!v || !(p[i][0]).test(v)) err.push(p[i][1])
            })
            if (err.length) {
                alert(err.join('\n'));
                return false;
            }
        })
    });
</script>

laimas 15.10.2016 23:02

Цитата:

Сообщение от K_arina
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="jquery.maskedinput.js"></script>
<script src="script.js"></script>
<script scr="jquery-3.1.1.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>

Должно быть так - две версии JQ подключать не надо, выберите одну из них, если нужна поддержка IE8, то можно 1.8.2, а лучше тогда 1.8.3, если нет, то 1.9.0. А у вас их подключается целых три.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="jquery.maskedinput.js"></script>
<script src="script.js"></script>


PS. Если плагин maskedinput.js требует конкретной версии (не ниже какой-то), то подключайте таковую.

K_arina 16.10.2016 10:33

А как сделать так, чтобы вместо отдельного сообщения уведомление об ошибке выводилось возле каждого поля формы? Это вместо p нужно присвоить объект? Как это сделать?

laimas 16.10.2016 11:50

Цитата:

Сообщение от K_arina
Это вместо p нужно присвоить объект?

Нет, переменная p может быть и массивом с вложенными массивами, это не так и важно, что она не объект. Нужно только иметь ввиду следующее - у меня кнопка отправки формы, это BUTTON, и так как я получаю коллекцию проверяемых полей $(this).find('input') не породит проблем. Но если вместо BUTTON будет INPUT типа submit, то возникнет ошибка - форма будет отправляться. В этом случае можно либо получать срез массива коллекции:

$(this).find('input').slice(0, -1).each(function(i, e) {
    .....


либо получать поля ввода типа text, указав соответствующим полям этот тип:

$(this).find('input[type="text"]').each(function(i, e) {
    .....


Эта переменная описывает правила проверки (шаблоны) и тексты сообщений об ошибках. Но ведь если поставлено задание посредством JQ, и если без использования pattern, то значит и required, и placeholder не должны применяться по идее. А значит проверку поля нужно производить раздельно: 1) поле заполнено?; 2) поле заполнено корректно?, а переменная p должна еще содержать для каждого поля сообщения об обязательном заполнении поля, и также текст подсказки что разрешено вводить в него.

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

warren buffet 16.10.2016 21:25

K_arina, зачем паттерны с подсказками в каком-то массиве? Запиши их прямо в атрибуты полей и проверяй поле за полем на высоком уровне абстракции.

warren buffet 16.10.2016 21:29

Цитата:

Сообщение от Rise
Атрибуты pattern и required в Safari например как следует не поддерживаются


Это если захотеть браузерную валидацию, а она недоделана и вообще мутная. То есть берем var p=el.getAttribute('pattern'); и юзаем в своем скрипте и стопудово в Сафари оно сработает. Аналогично с required и в этот атрибут еще можно записать min-length если в паттерне нету.

warren buffet 16.10.2016 21:40

Вот тут сделано так было http://javascript.ru/forum/dom-windo...tml#post431819 и вот как надо было продолжить

<form id="feedback" method="post">

<input name="name" required="required"
    pattern="[а-яёА-ЯЁ]{2,12}"
    e="Соблюдайте формат имени: от 2 до 12 русских букаф" />

<input name="phone" required="required"
    pattern="^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$"
    e="Неправильно набран номер, неправильно набран номер, бип-бип-бип" />

<input name="email" type="email" required="required"
    pattern="^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$" 
    e="Соблюдайте формат имейл: some@example.com" />

</form>


Теперь написать скрипт в несколько строк дело нескольких минут, поскольку все самоочевидно.

laimas 17.10.2016 04:59

Цитата:

Сообщение от warren buffet
Теперь написать скрипт в несколько строк дело нескольких минут, поскольку все самоочевидно.

Зачем писать то, что уже было написано, предложено и отвергнуто? Ты чего-то нового предложил?

Ежику понятно, что гораздо лучше когда сам браузер справится без всяких скриптов, а то что Safari не поддерживает, так это проблемы яблочников и самого Яблока, что есть вопрос сугубо философский и для темы не более мусора.

warren buffet 17.10.2016 07:38

Цитата:

Сообщение от laimas
а то что Safari не поддерживает

Сафаря не поддерживает .getAttribute() ?

warren buffet 17.10.2016 07:51

Напомню разницу между html и xml

xml без модели документа - голимая абстракция.

модель для html пишется по риквестам на w3c.org, называется спецификация и реализуется браузером

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

Например пресловутые атрибуты data- Кто вас заставляет использовать их как свойства - element.dataset.foo - ? Никто не заставляет, можешь получать значение через element.getAttribute('data-foo');

Тогда зачем такие длинные названия? Именно, вообще не нужны. Однако, возможен конфликт твоей модели и спецификации, например используя атрибут onclick появляется риск получить неожиданное поведение элемента. Используй короткие названия, 27 букв латинского алфавита - скорее всего более чем достаточно, а применительно к бесконечному числу моделей (контекста) хватит нескольких.

Тогда зачем писать pattern и required? Можно p и r. Просто на будущее. Скажем браузерная валидация начнет работать нормально и не придется переделывать шаблоны и html - там уже pattern и required. Просто убьем лишнее в скриптах и ура.

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

У меня год на одном сайте использовался тег val, который на самом деле var. Все работало как из пушки - и стили применялись и скрипты само собой его находили.

warren buffet 17.10.2016 08:00

Аналогично с объектами. В объект - который элемент - можно вштырить какие угодно свойства и методы. Он же объект, а мы на жабе скрипучей кодим, а ей почти все похеру. Свобода обуславливает культуру. Один молится на спецификацию не смея отползти от алтаря, другой пишет библиотеку prototype. Это две крайности. Так вот, умные судят по мере, а дураки о крайностях. Используйте свободу html и js по мере.

laimas 17.10.2016 08:07

Цитата:

Сообщение от warren buffet
Сафаря не поддерживает .getAttribute() ?

А там что речь о методе? В контексте темы речь идет о том, что яблочный браузер не поддерживает атрибуты pattern и required. Или это не понятно? Чего такую длинную портянку писать, никто тебе не запрещает иметь пользовательские атрибуты, а молиться на них или на рекомендованные W3C, это уж твое личное дело.

И хватит мусорить в темах, уважать надо автора.

warren buffet 17.10.2016 08:10

Цитата:

Сообщение от laimas
В контексте темы


Вот какой контекст

Цитата:

нужно сделать проверку на корректность введенных данных с помощью библиотеки JQuery.

Про сафарю походя сказал один профессор, а ты в ужасе сразу потер паттерны и приуныл.

laimas 17.10.2016 08:16

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

У меня есть свое мнение вообще о браузерах, но это не повод гадить этим мнением чужие темы.

warren buffet 17.10.2016 08:50

В общем вот рабочий пример, проще буквально некуда, но в нем есть все, что нужно для счастья.

<!DOCTYPE html>
<html lang="ru" dir="ltr">
<head>
<meta charset="utf-8">
</head>
<body>

<br/>

<style>
.errlog{
	outline:1px solid #eee;
}
</style>

<form id="feedback" method="get" action="" novalidate autocomplete="off">

	<label>Ваше русское имя
	<input name="fullname" required="required" type="text" placeholder="ФИО"
		pattern="[а-яёА-ЯЁ]{2,12}"
		e="Соблюдайте формат имени: от 2 до 12 русских букаф" /></label>
<br/><br/>
	<label>Номер телефона
	<input name="phone" required="required" type="tel"  placeholder="+7(777)777-77-77"
		pattern="^(?:\+7|8)[\s|-]*[\(]?\d{3}?[\)]?[\s|-]*\d{3}[\s|-]*\d{2}[\s|-]*\d{2}$"
		e="Неправильно набран номер, неправильно набран номер, бип-бип-бип" /></label>
<br/><br/>
	<label>Электронный адрес
	<input name="email" type="email" required="required" type="email"  placeholder="МЫЛО"
		pattern="^[a-z0-9_\.\-]+@[a-z0-9_\.\-]+\.[a-z\.]{2,6}$" 
		e="Соблюдайте формат имейл: some@example.com" /></label>
<br/><br/>
	<input type="submit" value="PostIt"/>
	
<br/><br/>
	<div class="errlog"></div>
	
</form>

<script>

var Form = new function(){

	var form=document.getElementById('feedback'),
	fields=form.elements,
	errout=form.querySelector('.errlog'),errlog,
	
	validate=function(ev){
		
		errout.innerHTML='';
		errlog=[];
		
		for(var i=0;i<fields.length;i++){
		
			var f=fields[i];
				p=f.getAttribute('pattern'),
				r=f.getAttribute('required'),
				v=f.value;
				
			if(f.name && r && p && !new RegExp(p).test(v))
				errlog.push(f.parentNode.textContent+': '+f.getAttribute('e'));
		}
		
		if(errlog.length) {
			ev.preventDefault();
			errout.innerHTML='<ul><li>'+errlog.join('</li><li>')+'</li></ul>';
		}
		
		/* below line just for test purpose */
		else {ev.preventDefault(); alert('Поздравляем! Все заполнено правильно!');}
	};
	
	form.addEventListener('submit',validate);
	
	
	this.form=form;

};

</script>

</body>
</html>

laimas 17.10.2016 09:26

warren buffet,
ты читаешь, что просьба была именно на JQ? А значит не getElementById, addEventListener, getAttribute.... Ты вообще для чего это все пишешь?

warren buffet 17.10.2016 17:50

Ты же опровергал такое ТЗ, нес там что-то о браузерной валидации, а теперь про ТЗ вспомнил?

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

Чего там хотел ТС - фиолетово. Главное - сделана рабочая иллюстрация простого и даже очевидного решения в рамках простой задачи.

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

А такие вот простые вещи когда там текстовые поля не требуют никакой сложности сервисной проверки.

ЗЫ тебе придурку хотел сказать спасибо за паттерны, но ты ж такой злой, что даже спасибо не дашь сказать. )))


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