Проверка динамических полей на валидацию
Как проверить поля на валидацию, которые добавляются в форму динамически, раньше я получала value поля с помощью id и его проверяла. Теперь поля добавляются динамически и с помощью id не получается. Вот у меня есть html код который я написала, пока сделала без динамического добавления а просто создала 3 строки с полями по 3 поля в каждой строке age, exp, gender. Нужно проверить каждое поле каждой строки при этом поля одной строки между собой связаны. В итоге ошибка о неправильном заполнении должна вывестись в ячейку ниже input'а, id="num_error_message". Вот мой код, там есть пример с одним полем. Как можно сделать валидацию, для всех полей в таблице?
<html> <head><title>Test</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script type="text/javascript"> $(document).ready(function(e){ var error_num1; $('#pole').keypress('', function () { var pattern = /^\d+$/; var num = $("#pole").val(); if (pattern.test(num) && num !== '') { $("#num_error_message1").hide(); $("#pole").css("border-bottom","2px solid #34F458"); }else { $("#num_error_message1").html("Только цифры"); $("#num_error_message1").show(); $("#pole").css("border-bottom","2px solid #F90A0A"); error_num1 = true; } }); }); </script> </head> <body> <form method="POST" action="form.php"> <input id="pole"><br> <span class="error_form" id="num_error_message1"></span> <table border="0"> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> <td><span class="error_form" id="num_error_message"></span></td> </tr> <br> </table> <input type="submit" value="Отправить"> </form> </body> </html> |
Katy93,
<!DOCTYPE html> <html> <head><title>Test</title> <style type="text/css"> .err{ border-bottom: 2px solid #F90A0A; } .ok{ border-bottom: 2px solid #34F458; } </style> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> $(function(e){ $("form").on("input", "table input", function() { var error_message = "Только цифры"; var pattern = /^\d+$/; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) }); </script> </head> <body> <form method="POST" action="form.php"> <table border="0"> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><input type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <br> </table> <input type="submit" value="Отправить"> </form> </body> </html> |
Спасибо за помощь, а как проверить поля не только на цифры, а допустим на имя или email. Вот что у меня получилось, но я думаю это не совсем правильно.
<!DOCTYPE html> <html> <head><title>Test</title> <style type="text/css"> .err{ border-bottom: 2px solid #F90A0A; } .ok{ border-bottom: 2px solid #34F458; } </style> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> $(function(e){ /***************************************************/ //Проверка на число /***************************************************/ $("form").on("input", "table .age", function() { var error_message = "Только цифры"; var pattern = /^\d+$/; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) /***************************************************/ //Проверка на буквы /***************************************************/ $("form").on("input", "table .name", function() { var error_message = "Только буквы"; var pattern = /^[a-zA-Zа-яА-Я]*$/; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) /***************************************************/ //Проверка на email адрес /***************************************************/ $("form").on("input", "table .email", function() { var error_message = "Только email"; var pattern = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) }); </script> </head> <body> <form method="POST" action="form.php"> <table border="0"> <tr> <td><input class="age" type="text" value="" name="mass[age][]"></td> <td><input class="name" type="text" value="" name="mass[exp][]"></td> <td><input class="email" type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <tr> <td><input class="age" type="text" value="" name="mass[age][]"></td> <td><input class="name" type="text" value="" name="mass[exp][]"></td> <td><input class="email" type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <tr> <td><input class="age" type="text" value="" name="mass[age][]"></td> <td><input class="name" type="text" value="" name="mass[exp][]"></td> <td><input class="email" type="text" value="" name="mass[gender][]"></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> </tr> <br> </table> <input type="submit" value="Отправить"> </form> </body> </html> |
Katy93,
$(function(){ $("form").on("input", "table input", function() { var error_message = {"mass[age][]" : "Только цифры", "mass[exp][]" : "Только буквы", "mass[gender][]" : "Только email"}[this.name]; var pattern = {"mass[age][]" : /^\d+$/, "mass[exp][]" : /^[a-zA-Zа-яА-Я]*$/, "mass[gender][]" : /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/}[this.name];; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) }) |
Katy93, лучше так - поле формы определяет обязательно ли оно для заполнения и правила проверки, а скрипт занимается проверкой.
|
Цитата:
<!DOCTYPE html> <html> <head> <title>Form Validation</title> <style> .validable { border: 0 solid #888; border-bottom-width: 2px; padding: 0.5em; font: inherit; outline: none; } .validable:not(:placeholder-shown):invalid { border-bottom-color: #f90a0a; } .validable:valid { border-bottom-color: #34f458; } .validable ~ .error { display: none; } .validable:not(:placeholder-shown):invalid ~ .error { display: block; } form td { vertical-align: top; } </style> </head> <body> <form method="POST" action="form.php"> <table> <tr> <td> <input class="age validable" type="text" name="mass[age][]" placeholder="Возраст" pattern="\d{1,3}" required> <span class="error">Только цифры</span> </td> <td> <input class="name validable" type="text" name="mass[exp][]" placeholder="Имя" pattern="(?=\s*\S+)\D+" required> <span class="error">Только буквы</span> </td> <td> <input class="email validable" type="email" name="mass[gender][]" placeholder="Почта" required> <span class="error">Только email</span> </td> </tr> </table> <input type="submit" value="Отправить"> </form> </body> </html>Вы можете добавить динамически сколько угодно строк! |
Malleys, я проверила и всё равно не могу понять как работает без js скриптов. Я например взяла и сделала дубли ячеек и протестировала ввела в каждое поле и ошибка появляется снизу над полем где я ввожу и это при том, что я не указывала уникальный идентификатор. Разве для ошибки и поля не нужен уникальный id?
|
А ещё появляется сообщение с указанием, что я не правильно ввела строку например "Адрес электронной почты должен содержать символ "@". В адресе "katerina" отсутствует символ "@"." Никакие js библиотеки я не подключала и дополнительные настройки в библиотеках я не делала.
|
Кстати, что это за символ такой "ü" как его на клавиатуре поставить?
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Спасибо, что объяснили. Я всё же решила всё таки воспользоваться только проверки с цифрами:
<!DOCTYPE html> <html> <head><title>Test</title> <style type="text/css"> .err{ border-bottom: 2px solid #F90A0A; } .ok{ border-bottom: 2px solid #34F458; } </style> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> $(function(e){ $("form").on("input", "table input", function() { var error_message = "Только цифры"; var pattern = /^\d+$/; var num = this.value.trim(); var ok = pattern.test(num); $(this).removeClass("ok err"); if(num) { $(this).addClass(ok ? "ok" : "err"); } var index = $("form table input").index(this); $("form table .error_form").eq(index).html(ok || !num ? "" : error_message); }) }); </script> </head> <body> <form method="POST" action="form.php"> <table border="0"> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]"></td> <td><input type="text" value="" name="mass[exp][]"></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <br> </table> <input type="submit" value="Отправить"> </form> </body> </html> Изменила кое-что третье поле с выбором пола не обязательно сделала из него список. Можно как нибудь при отправке формы сообщать пользователю какие поля он ещё не заполнил? Например он создал несколько динамических полей и не заполнил их потом нажимает submit и ему выдаёт сообщение под каждым полем красным "Только цифры". И тут выбор у пользователя либо удалить лишнее либо заполнить их. |
Katy93,
может проще required добавить в input? |
Как пример ранее, со стилями? HTML 5 и CSS
|
Katy93,
<td><input type="text" value="" name="mass[age][]" required ></td> |
Проверила скрипт:
<!DOCTYPE html> <html> <head><title>Test</title> <style type="text/css"> .err{ border-bottom: 2px solid #F90A0A; } .ok{ border-bottom: 2px solid #34F458; } </style> </head> <body> <form method="POST" action="form.php"> <table border="0"> <tr> <td><input type="text" value="" name="mass[age][]" pattern="\d{1,3}" required></td> <td><input type="text" value="" name="mass[exp][]" pattern="\d{1,3}" required></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]" pattern="\d{1,3}" required></td> <td><input type="text" value="" name="mass[exp][]" pattern="\d{1,3}" required></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <tr> <td><input type="text" value="" name="mass[age][]" pattern="\d{1,3}" required></td> <td><input type="text" value="" name="mass[exp][]" pattern="\d{1,3}" required></td> <td><select id="gender1" name="driver[gender][]"> <option label="-"></option> <option value="1">Мужской</option> <option value="0">Женский</option> </select></td> </tr> <tr> <td><span class="error_form" ></span></td> <td><span class="error_form" ></span></td> <td></td> </tr> <br> </table> <input type="submit" value="Отправить"> </form> </body> </html> К сожалению не подходит дело в том что эта проверка работает только в том случае если нажата кнопка submit. А у меня до этой кнопки нужно ещё добраться. Дело в том что у меня постраничная форма, в начале большая часть скрыта стилями display: none;, при нажатии кнопки далее открывается новая часть формы $("#second").show();, а старая закрывается $("#first").hide();. Вообщем использовать html5 валидацию тут не получится. |
Сценарий, это:
1) разбудили проверить поля 2) проверяет поля: -если поле имеет атрибут required, то обязателен для заполнения -если имеет pattern, то проверяется по этому шаблону, иначе по типу поля -если поле не обязательно для заполнения, но заполнено, то проверяется по типу поля, но могут быть и пользовательские определения -сообщения об ошибках извлекаются из data атрибутов 3) сделал работу и спать Это в конкретном сценарии можно шаблоны определять, какие-то сообщения, а в вашем случае так поступать, это вырастить монстра. |
В каком моём случае, я что-то не совсем поняла?
|
Цитата:
var error_message = "Только цифры"; var pattern = /^\d+$/; тогда придется на каждый тип поля, писать код, хотя во многом то действия будут одни и те же, и в случае изменения условий придется код править вновь. И либо this.value.... либо сразу $(this), коли большую часть вы выполняете на JQ, и $(this).val(), с установкой $.valHooks, чтобы при проверке значения уже были очищены от крайних пробелов. |
И как же мне html 5 валидацию применить если она привязана только к submit, а submit доступно только будет на следующем этапе. Т.е. после нажатия кнопки "Следующая" или мне из этой кнопки (следующая) сделать submit, тогда получится несколько submit в одной форме.
|
В общем-то существуют и такие сценарии, когда сервер принимает данные порциями. Нет, нативная проверка полей будет при отправлении, но ведь кроме этого будут работать и css определения для полей. Хотя можно и отказаться от них, и сделать посредством метки к полю и ее :before, :after добавить иконки на поле слева, флажков справа при выполнении условий ввода, и прочих красивостей.
А пользовательская "до", что там у вас кнопка определенного этапа, вот она и должна запускать функцию проверки. А функция, по сути, простая как валенок - ее аргумент, это произвольное количество полей (или указание где их получить), которые она обходит в цикле и выполняет то о чем писалось выше. Завтра вам нужна будет другая форма, а функцию проверки при этом изменять не придется. |
|
Я нашла решение с помощью библиотеки jquery.validate.min.js. Мой код можно посмотреть по этой ссылке. https://codepen.io/Smith37/pen/qBEeRer
|
Проверку с помощью регулярных выражений например на цифры, позже решу этот вопрос.
|
Цитата:
Цитата:
validate последовательное заполнение формы |
Все эти плагины с "железной привязкой" жуть да и только.
|
Цитата:
Цитата:
|
Почему placeholder установленный на дате с помощью маски js постоянно дублируется до бесконечности?
Скриншот: ![]() Код: <!DOCTYPE html> <html lang="en"> <head> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script> <script src="jquery.maskedinput.js"></script> <style> #date { width: 500px; /* Ширина поля в пикселах */ } </style> </head> <body> <script type="text/javascript"> $(document).ready(function(e){ $("#Phone").mask("(999) 999-9999"); $("#date").mask("99.99.9999",{placeholder:"дд.мм.гггг"}); }); </script> <form id="cmaForm" action="" method="post"> <p><label>Phone Number:</label><input name="Phone" id="Phone" class="pageRequired" maxlength="254" title="Номер телефона"></p> <p><label>Date:</label> <input type="text" name="date" id="date" class="sum pageRequired" title="Дата"></p> <input type="submit" class="submitbutton" value="Submit"> </form> </html> </body> |
Цитата:
<!DOCTYPE html> <html lang="en"> <head> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.4.1/jquery.maskedinput.min.js"></script> <style> #date { width: 500px; /* Ширина поля в пикселах */ } </style> </head> <body> <script type="text/javascript"> $(document).ready(function(e){ $("#Phone").mask("(999) 999-9999"); $("#date").mask("99.99.9999",{placeholder:"дд.мм.гггг"}); }); </script> <form id="cmaForm" action="" method="post"> <p><label>Phone Number:</label><input name="Phone" id="Phone" class="pageRequired" maxlength="254" title="Номер телефона"></p> <p><label>Date:</label> <input type="text" name="date" id="date" class="sum pageRequired" title="Дата"></p> <input type="submit" class="submitbutton" value="Submit"> </form> </body> </html> |
С библиотекой, что-то не так подключила вашу версию.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.4.1/jquery.maskedinput.min.js"></script> Всё заработало. |
Кажется получилось сделать валидацию к постраничной форме. Только вот у меня проблема с датой. Никак не получается составить регулярное выражение такого формата дд.мм.гггг. Как сделать проверку на вводимую дату?
<!DOCTYPE html> <html> <meta charset="utf-8"> <head> </script> <style type="text/css"> #step2,#step3,#step4,#step5{ display: none; } </style> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script src="http://jqueryvalidation.org/files/dist/jquery.validate.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.maskedinput/1.4.1/jquery.maskedinput.min.js"></script> <script> $.validator.addMethod("minlenghtname", function (value, element) { return /^[a-zа-я]+$/i.test(value); }," не соответствует формату"); $.validator.addMethod("requiredname", function (value, element) { return value.length > 2; }," Заполните это поле!!!"); $.validator.addMethod("requirednum", function (value, element) { return /^\d+$/i.test(value); }," только числа"); $.validator.addMethod("requiredemail", function (value, element) { return /^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/i.test(value); }," Неправильный email"); $.validator.addMethod("checkMask", function(value, element) { return /\+\d{1}\(\d{3}\)\d{3}-\d{4}/g.test(value); },"Не верный формат телефона (+7(999)999-9999)"); $.validator.addMethod("checkData", function(value, element) { return value.match(/^\d\d?\.\d\d?\.\d\d\d\d$/); },"Please enter a date in the format dd.mm.yyyy."); $(function () { $("#Phone").mask("+7(999)999-9999"); $("#date").mask("99.99.9999",{placeholder:"dd.mm.yyyy"}); var v = $("#commentForm").validate({ rules: { fname: { requiredname: true, minlenghtname: true }, lname: { requiredname: true, minlenghtname: true }, num1:{ requirednum:true }, num2: { requirednum:true }, city: { minlenghtname: true }, country:{ minlenghtname: true }, email:{ requiredemail: true }, Phone:{ checkMask: true }, date:{ checkData: true } }, submitHandler: function() { alert("Submitted, thanks!"); } }) $(".next1").click(function() { if (v.form()) { $("#step2").show(); $("#step1").hide(); $("#progressText").html("Шаг 2 из 4"); } }); $(".next2").click(function() { if (v.form()) { $("#step3").show(); $("#step2").hide(); $("#progressText").html("Шаг 3 из 4"); } }); $(".next3").click(function() { if (v.form()) { $("#step4").show(); $("#step3").hide(); $("#progressText").html("Шаг 4 из 4"); } }); }); </script> </head> <body> <div id="progressText">Шаг 1 из 4</div> <form class="cmxform" id="commentForm" method="get" action=""> <ul id="stepForm"> <li id="step1"> <p><label>Имя:</label><input class="left" id="fname" name="fname"></p> <p><label>Фамилия:</label><input class="left" id="lname" name="lname"></p> <p class="buttonWrapper"> <input name="formNext1" type="button" class="next1 nextbutton" value="Next" alt="Next" title="Next"> </p> </li> <li id="step2"> <p><label>Номер 1:</label><input class="left" id="num1" name="num1" maxlength="11"></p> <p><label>Номер 2:</label><input class="left" id="num2" name="num2" maxlength="16" ></p> <p class="buttonWrapper"> <input name="formNext1" type="button" class="next2 nextbutton" value="Next" alt="Next" title="Next"> </p> </li> <li id="step3"> <p><label>Город:</label><input class="left" id="city" name="city"></p> <p><label>Страна:</label><input class="left" id="country" name="country"></p> <input name="formNext1" type="button" class="next3 nextbutton" value="Next" alt="Next" title="Next"> </li> <li id="step4"> <p><label>Email адрес:</label><input name="email" id="email" class="email" title="Неправильный email"></p> <p><label>Номер телефона:</label><input name="Phone" id="Phone" class="phone" maxlength="254" title="Введите телефон"></p> <p><label>Дата:</label> <input type="text" name="date" id="date" class="date" title="Введите дату"></p> <input type="submit" class="submitbutton" value="Submit"> </li> </ul> </form> </center> </body> </html> |
Цитата:
|
Получилось но не совсем так как я хотела.
Ввожу я дату например 06.02.2020, так работает. Потом пытаюсь ввести 30.02.2020 пишет "введите дату". Тогда я начинаю проверять разные числа первое число если ввожу 01-12 ошибка исчезает во втором числе допустимо от 01 до 31. Вообщем я так поняла что вместо даты которую я хотела dd.mm.yyyy получилось вот такая mm.dd.yyyy. т.е первый месяц, потом число потом год. Как это исправить, чтобы первое было число потом месяц, год. $.validator.addMethod("checkData", function(value, element) { return /^\d{1,2}\.\d{1,2}\.\d{4}$/i.test(value); },"Введите дату."); .... $("#Phone").mask("+7(999)999-9999"); $("#date").mask("99.99.9999",{placeholder:"dd.mm.yyyy"}); .... |
Часовой пояс GMT +3, время: 18:40. |