Валидация формы работает не совсем так
Здравствуйте.
Есть форма, состоящая из ряда одинаковых блоков <div class="progblock"> <div class="strelka"><a href=""><img src="/template/img/ico/strelka.png" class="img-responsive"></a></div> <label class="bold_name"><input type="checkbox" name="public" class="public osnova" value="Программа 1"> Программа 1</label> <div class="napravlenie hides" style="display:none;"> <div class="checkbox col-xs-6 forma_obuchen"> <select name="ot_forma1" class="form-control"> <option value="">Форма обучения</option> <option value="Очно-заочная">Очно-заочная</option> <option value="Дистанционная">Дистанционная</option> </select> </div> <div class="checkbox col-xs-6 kolvo_uchenik"> <input type="number" name="ot_kolvo1" value="" class="form-control" placeholder="Число слушателей"> </div> </div> <div class="clearfix"></div> </div> Есть скрипт, отвечающий за сбор данных с формы и передачу их на следующий шаг, а также за валидацию формы. У нас при выборе каких-либо чекбоксов происходит разворачивание скрытого блока под чекбоксом и там уже пользователь выбирает форму обучения и количество слушателей. Вот без выбранных этих двух полей дальнейший шаг - открытие модального окна выполняться не должен. $(document).ready(function() { $('a.podtv').click(function(e) { e.preventDefault(); var arr= [].map.call($('input:checkbox:checked'),function(el) { var parent = $(el).parents('.progblock'); return {'name' : el.value, 'type' : $('select',parent).val(), 'val' : $('[type="number"]',parent).val()}}); var mass = JSON.stringify(arr, null, 4); // Блок валидации var es = $('input:checkbox:checked') var parents = $(es).parents('.progblock'); var selprogblock = $('select',parents).val(); var numprogblock = $('[type="number"]',parents).val(); // Проверяем выбрана ли форма обучения if (selprogblock == '') { alert('Выберите форму обучения!'); } // Проверяем выбрано ли количество слушателей else if (numprogblock == '') { alert('Введите количество слушателей!'); } else { for (var i = 0; i < arr.length; i++) { $(".info_users_prog").append('<p>' + arr[i].name + '</p><ul><li>' + arr[i].type + '</li><li>' + arr[i].val + '</li></ul>'); $(".parameter").append('<input type="hidden" name="names[]" value="' + arr[i].name + '">'); $(".parameter").append('<input type="hidden" name="types[]" value="' + arr[i].type + '">'); $(".parameter").append('<input type="hidden" name="vals[]" value="' + arr[i].val + '">'); $("#myModal").show("slow"); } } }); $('button.close').click(function(e) { $("#myModal").hide("slow"); arr = []; $('.info_users_prog').empty(); }); $('button.closer').click(function(e) { $("#myModal").hide("slow"); arr = []; $('.info_users_prog').empty(); $('.parameter').empty(); }); }); Но на практике форма состоит не из одного блока а из многих. И если хотя бы в одном из них данные по форме обучения и количеству слушателей выбраны, то на остальные валидация не реагирует и форма проходит валидацию. Как сделать чтобы проверялись все поля у выбранных чекбоксов? |
Помогите, пожалуйста. Все уже перепробовал, не получается правильно сделать валидацию все select и input из выбранных checkbox.
|
Полям обязательным к заполнению добавьте атрибут required и браузер сам не разрешит отправку формы при незаполненных. А уже скрпту получить коллекцию этих полей и проверить их заполнение после trim.
|
Цитата:
По сути это просто набор div'ов а все действо происходит по нажатию на ссылку с классом podtv А вот уже потом открывается модальное окно с формой, в которую переданы выбранные данные и там уже пользователь вводит имя, телефон и т.д. и отправляет. Мне же нужно, чтобы даже модалка не открывалась и вылезало сообщение если в каком-либо из выбранных чекбоксов не выбрана форма обучения или не проставлено количество слушателей. Если нужно, могу полный код выложить. |
Цитата:
alert('Введите количество слушателей!'); } А "помечаем" нужные нам элементы (которые обязательно должны быть выбраны), в атрибутах их же можно описать и правила/текст, чтобы не лепить на каждый блок свои проверки и не дай бог свои обработчики. В конечном же итоге сервер будут ожидать поля, которые судя по условию должны быть обязательно заполнены/выбраны, а уж в каком порядке это было сделано на клиенте, так это не так и важно. |
Цитата:
|
Точно также как например определить один обработчик на несколько элементов. То есть флажки или иное имеют один обработчик, который раскрывает следующие поля для выбора. А данным полям как-то <select name="ot_forma1" class="form-control"> атрибут required - <select name="ot_forma1" class="form-control" required>. Если запрашивается на раскрытие полей, то проверяется есть ли у запрашиваемого блока предыдущий и если есть, то получить все поля с атрибутом required, и открыть блок только в том случае, если эти поля заполнены/выбраны. Ну и при отправке формы уже все обязательные поля проверяются на заполнение/выбор.
Что сложного то? |
Вы имеете ввиду обработчик, который раскрывает поля при установке флажка? У меня сейчас это примитивный код:
$(document).ready(function() { $(".public").change(function() { if ($(this).prop("checked")) { $(this).parent().next(".hides").fadeIn().show(); return; } else { $(this).parent().next(".hides").fadeOut(300); } }); }) Сюда надо добавить что-то? |
Я прошу помощи, сам не могу понять как мне сделать так, чтобы он проверял не поля первого выбранного чекбокса, а все остальные выбранные тоже. Сейчас он проверяет только первый. Может как-то в массив нужно все добавлять для проверки?
|
Цитата:
|
Цитата:
<input type="checkbox" name="public" class="public osnova" value="Программа 1"> - я уж молчу о значении этого флажка, бог с ним, но как описано - выбирает пользователь флажок, ему показывается список: <select name="ot_forma1" class="form-control"> <option value="">Форма обучения</option> <option value="Очно-заочная">Очно-заочная</option> ..... в котором он обязательно должен выбрать нечто. Вопрос - зачем проверять обязательность выбора флажка (чем вы заморачиваетесь в коде), зачем его отправлять на сервер, если Программу 1 определяет сам список? Зачем все эти усложнения как html-структуры, так и соответствующего сценария ее обрабатывающего, а также избыточность данных для сервера? |
Цитата:
Мне нужно собрать все названия программ у выбранных флажков и проверить чтобы у выбранных же флажков было обязательно: а) выбрана форма обучения б) написано количество слушателей. Далее все эти данные передаются в форму, которая открывается в модальном окне и потом форма отправляется мне на почту. Поясните мне пожалуйста, как сделать эту задачу легче, буду крайне признателен. |
Цитата:
а) нет никаких у вас модальных окон, модальное окно, это к примеру alert("message"). Модальный диалог, в котором действительно может быть форма есть только у IE. То есть отправка у вас, это еще собственно говоря одна форма, в которую переписывается из другой... Зачем это нужно не понять. б) как отправляются данные на сервер не видно, но я сужу по именам полей в которых производится выбор - name="ot_forma1", и если "однотипные блоки" и отправка по именам, то я предполагаю, что в иных блоках так - name="ot_forma2" и т.д.? А если мое предположение верно, то выбор формы обучения у каждой из программ, это свой уникальный ключ. А если ключ уникален, то флажок самой программы вообще-то излишняя роскошь, ибо пришедшие на сервер ключи форм обучения с успехом могут идентифицировать чему они принадлежат. Данные, а тем более такие как у вас, хранят в базе. Но и хранить их можно по разному. Например каждая запись имеет поле уникального ключа которым как значением и оперируют флажки, не "Программа 1" и т.п. Поле формы обучения как ENUM значения, если у всех программ она одинакова и определяется раз и навсегда. Поле описания программы и еще какие либо данные. Поле содержащее количество слушателей программы. То есть в данном случае все описывается одной sql-таблицей, и у всех программ одни и те же имена полей, которые будут отождествляться с формой, и описаны в форме как ключи массива, а определение кому это принадлежит по значениям, так как они уникальны ибо это идентификаторы. А поступить с таким данными как у вас "ot_forma1", "ot_forma2", "public" не получится, хотя и можно сделать, но это будет сродни геморрою. Если формы обучения есть понятия не постоянные, могут изменяться, добавляться, то они описываются в связанной таблице, что также должно учитываться формой. |
Часовой пояс GMT +3, время: 10:05. |