css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
13 Мар
Мы уже пробовали создать ajax-форму, об этом можно было прочитать в статье jQuery Form – делаем ajax-форму. Но любая форма без проверки данных, вводимых пользователем – это серьезная брешь в безопасности ресурса.
Важно! Никогда не стоит полагаться на проверки данных на стороне клиента! Обязательно проводите проверку на сервере!
Поэтому сегодня я предлагаю познакомиться с плагином jQuery Validation, который позволит производить проверку вводимых данных «на лету» и, что немаловажно, очень хорошо взаимодействует с плагином jQuery Form. Ну а для начала просто посмотрите пример проверки данных в ajax форме…
Вы можете скачать исходный код примера и воспроизвести этот пример на своем сайте.
Ну а теперь начнем разбираться. Сразу скажу, что для того, чтобы подробно рассказать о плагине jQuery Validation, не хватит и нескольких статей. Поэтому поставим себе целью по окончании прочтения статьи (и тестирования примера конечно) иметь некий базовый набор знаний, который поможет решить проблемы в самых распространенных случаях. Если же понадобится что-то большее, то подробную информацию Вы сможете найти на странице плагина jQuery Validation.
Как обычно, сначала потребуется подключить библиотеку jQuery (jQuery Validation работает с версией 1.2.2 и выше). Понятно, что понадобится и jquery.form.js, и собственно query.validate.js – все это подключаем в разделе HEAD нужной страницы. Можно подключить и файл additional-methods.js, содержащий, как ясно из названия, дополнительные методы.
<script type="text/javascript" src="js/jquery-1.2.3.js"></script> <script type="text/javascript" src="js/jquery.form.js"></script> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript" src="js/additional-methods.js"></script>
Стилевые таблицы и HTML-код Вы сможете посмотреть в файле примера, там нет ничего необычного. Отмечу только, что стоит следовать следующим рекомендациям по разметке:
Каждый элемент input или select имеет «свой» элемент label с атрибутом for, значение которого одинаково со
значением атрибута id соответствующего элемента input или select. В общем, лучше на примере:
<label for="firstname">Имя</label> <input id="firstname" name="fname" type="text" />
Теперь приведу javascript-код. Несмотря на то, что выглядит он довольно страшно, ничего особенно сложного в нем нет.
<script type="text/javascript">
$(document).ready(function(){
// готовим опции для метода
// ajaxSubmit плагина jquery.form.js
var options = {
target: "#output",
timeout: 3000 // тайм-аут
};
$("#myForm").validate({
submitHandler: function(form) {
// вызываем метод ajaxSubmit
// плагина jquery.form.js
$(form).ajaxSubmit(options);
},
focusInvalid: false,
focusCleanup: true,
rules: {
Name: {
required: true,
minlength: 2,
maxlength: 12
},
Email: {
required: true,
email: true
},
// .............
// еще настройки
// см. в исх.кодах
// .............
Examine: {
required: true,
equal: 13
}
},
messages: {
Name: {
required: "Укажите свое имя!",
minlength: "Не менее 2 символов",
maxlength: "Не более 12 символов"
},
Email: {
required: "Нужно указать email адрес",
email: "Нужен корректный email адрес!"
},
// .............
// еще настройки
// см. в исх.кодах
// .............
Examine: {
required: "Надо решить этот пример!",
equal: "Вы в школе учились?"
}
},
errorPlacement: function(error, element) {
var er = element.attr("name");
error.appendTo( element.parent()
.find("label[@for="" + er + ""]")
.find("em") );
}
});
});
</script>
Начало кода уже должно быть Вам знакомо по предыдущей статье, а сейчас самое интересное для нас это пожалуй основной метод – validate,
$("#myForm").validate({
// список опций
});
который может принимать просто огромное количество опций (набор пар ключ/значение) и в соответствии с ними выполнять проверку выбранной формы. Метод validate устанавливает обработчики событий для submit, focus, keyup, blur и click, чтобы переключиться в проверку всей формы или ее отдельных полей.
Приведу наиболее востребованные опции с пояснениями:
submitHandler – когда форма корректно заполнена, вызывает обработчик для передачи формы. Заменяет собой передачу формы по умолчанию. В примере (см.выше) используется передача данных через метод ajaxSubmit() плагина jQuery Form.
ignore – отменяет проверку полей формы с указанным селектором. В примере ниже – отменяет проверку для всех элементов с классом «ignore«.
$("#myform").validate({
ignore: ".ignore"
});
rules – пары ключ/значение, описывающие правила проверки. Ключ – это значение атрибута name элемента (или группы элементов для элементов checkbox и radio). Значение – объект (или строка), содержащий пары правило/параметр. Правила могут быть считаны еще и из разметки (классы, атрибуты, метаданные). Эти способы можно комбинировать между собой.
$(".selector").validate({
rules: {
// поле name - обязательное
name: "required",
// для поля email
email: {
// заполнение обязательно
required: true,
// значение д.б. корректным
email: true
}
}
});
messages – пары ключ/значение, описывающие сообщения в процессе проверки. Ключ – это значение атрибута name элемента (или группы элементов для элементов checkbox и radio). Значение же его будет отображено для соответствующего элемента.
$(".selector").validate({
rules: {
name: "required",
email: {
required: true,
email: true
}
},
messages: {
// если не заполнено поле name
// user увидит сообщение
name: "Пожалуйста, представьтесь!",
email: {
// если не заполнено поле email
// user увидит сообщение
required: "Нужно указать e-mail!",
// если поле email некорректно
// user увидит сообщение
email: "E-mail д.б. корректным!"
}
}
});
onsubmit, onfocusout, onkeyup, onclick – отвечают за инициализацию проверки полей формы по соответствующему событию. По умолчанию все установлены в true. Любые из этих опций можно отключить, установив значение false.
errorPlacement – в качестве значения функция, принимающая два аргумента. Первый – ошибка как объект jQuery, второй – некорректный элемент как объект jQuery. С помощью этой опции сообщение об ошибке может быть выведено в целевой элемент в разметке страницы. Давайте разберем на примере:
errorPlacement: function(error, element) {
var er = element.attr("name");
error.appendTo( element.parent()
.find("label[@for="" + er + ""]")
.find("em") );
}
В переменную er получаем значение атрибута name элемента, в котором обнаружена ошибка. Сообщение об ошибке добавляем куда? Правильно – в целевой элемент, который еще надо найти. Находим «родителя» этого элемента, в нем обнаруживаем элемент label с атрибутом for, который имеет значение точно такое же, которое у нас уже хранится в переменной er (помните рекомендации по разметке?), находим в нем целевой элемент em. Вот туда и будет вставлен текст сообщения об ошибке.
А теперь давайте подробнее остановимся на rules и messages. Ну наверное больше все-таки на rules, поскольку правила проверки задаются именно здесь, а в messages определяются сообщения, которые будут выводиться в том случае, когда не выполняется требование, определенное в rules.
Методы проверки
Плагин jQuery Validation предоставляет целый набор стандартных методов проверки.
required( ) – делает элемент обязательным для заполнения. Возвращает false, если элемент пустой (текстовое поле), не отмечен (radio/checkbox) или ничего не выбрано (для select).
$("#myform").validate({
// здесь field - идентификатор
// соответствующего поля ввода
rules: { field: "required" }
});
remote(url) - запрашивает ресурс, расположенный на сервере через $.ajax (XMLHttpRequest) и передает пару ключ/значение, соответствующую атрибуту name проверяемого элемента в GET-запросе. Ответ сервера оценивается как данные в формате JSON и должен вернуть true для корректных данных, и false – для некорректных.
$("#myform").validate({
rules: {
email: {
required: true,
email: true,
remote: "check-email.php"
}
}
});
minlength(length) – элемент ввода будет требовать ввести количество символов не менее, чем указано в length. Работает с текстовыми полями ввода (в т.ч. с password), c selects и checkbox.
$("#myform").validate({
rules: {
field: {
required: true,
minlength: 3
}
}
});
maxlength(length) – элемент ввода будет требовать ввести количество символов не более, чем указано в length. Работает с текстовыми полями ввода (в т.ч. с password), c selects и checkbox.
$("#myform").validate({
rules: {
field: {
required: true,
maxlength: 4
}
}
});
rangelength(range) – элемент ввода будет требовать ввести количество символов, соответствующее диапазону, указанному в range.
$("#myform").validate({
rules: {
field: {
required: true,
rangelength: [2, 6]
}
}
});
min(value), max(value), range(range) – смысл тот же, только фигурирует уже не количество символов, а числа.
$("#myform").validate({
rules: {
field: {
required: true,
range: [13, 23]
}
}
});
equalTo(other) – требует, чтобы элемент соответствовал (был эквивалентен) другому элементу, указанному в other. Возвращает true, если это условие выполняется, и false в противном случае. Работает с текстовыми полями.
$("#myform").validate({
rules: {
password: "required",
password_again: {
equalTo: "#password"
}
}
});
email( ) – делает элемент ввода требующим корректно введенного e-mail адреса. Возвращает true, если адрес корректный, и false в противном случае. Работает с текстовыми полями.
$("#myform").validate({
rules: {
field: {
required: true,
email: true
}
}
});
url( ) – делает элемент ввода требующим корректно введенного URL (типа, начните с http://). Возвращает true, если URL корректный, и false в противном случае. Работает с текстовыми полями.
$("#myform").validate({
rules: {
field: {
required: true,
url: true
}
}
});
Честно говоря, два последних метода из стандартного набора мне не понравились, впрочем как и из дополнительного набора методов в файле additional-methods.js. Метод url() например признал валидным http://www.собаказлая.ru, а метод email( ) также пропускает кириллицу в адресе. Ну да ладно. Можно же дополнить плагин своим методом или доверить проверку валидности сценарию на сервере.
Я рассказал далеко не все, и поэтому в заключение хочу привести еще несколько ссылок на примеры:
http://jquery.bassistance.de/validate/demo/marketo/
http://jquery.bassistance.de/validate/demo/marketo/step2.htm
http://jquery.bassistance.de/validate/demo/milk/
http://jquery.bassistance.de/validate/demo/multipart/
Отзывов (112) на «jQuery Validation – проверка данных в ajax форме»
Очень интересная информация обязательно буду изучать. Спасибо.
Огромное спасибо за статью. У меня возник вопрос по поводу метода remote: может ли он отправлять данные на проверку не через GET, а через POST? Возможно ли такое сделать?
Если честно – не экспериментировал, но в документации четко оговорен метод передачи данных – GET. Но remote не догма, можно же использовать jQuery.ajax(options), чтобы сконфигурировать ajax-запрос нужным образом. Подробнее можно узнать в статье jQuery и Ajax: запросы
POST можно.. Сам думал над этим вопросом. Вот так:
$(document).ready(
function() {
$.ajaxSetup( { type: «POST»} );
}
);
Статья реально классная. Единственное, застрял на remote. Не выходит оформить ответ сервера типа «false» или «true» в виде JSON. Никто не подскажет?
Вопрос снимается) Нашел все что надо в примере http://jquery.bassistance.de/validate/demo/milk/index.html
Спасибо Gennady за статейку!
А как справится со следующей проблемо: у меня есть массив, ну, например с пятью значениями. Как сделать переменную, которая была бы равна (или не равна) каждому из этих значений одновременно. Я хочу сделать так, чтобы я вводил в какую-то строку слово и скрипт сразу же проверял равно ли оно одному из значений в массиве или нет и если что, выводил бы сообщение об ошибке.
Я уже приведённый пример оформил в пхп, и вопрос собственно в сторону пхп идёт, за что прошу прощения.
Тоесть ты хочешь делать проверку на php ? Тогда проверяешь in_array($input,$array). А вообще поищи форумы по этой теме, здесь все таки js
Т.е. Вы хотите делать эту проверку на сервере… Окончательную-то проверку все равно на сервере делать необходимо, но можно и в процессе. Ну например: выполнить ajax-запрос к файлу-обработчику на сервере по какому-либо событию, скажем по потере фокуса. Вы посмотрите статью jQuery Form – делаем ajax-форму, почитайте как jQuery работает с Ajax – при проверке данных на сервере Вам надо искать решение в этом направлении.
Спасибо большое, думаю это всё то что надо, как доберусь, начну пробовать=)
Чего-то перечитал всё, а in_array выходом не оказался.
Тогда немного переформулирую вопрос. Можно ли при помощи jQuery получить такую вещь, которая иногда используется при регистрации пользователей на некоторых сайтах/форумах – когда они выбирают имя пользователя, то им подсвечивается есть такое имя пользователя в базе данных или нет.
Безусловно можно, только просто библиотеки jQuery здесь будет недостаточно. По сути Вы хотите просто избавить пользователя от лишних перезагрузок, верно? Значит алгоритм примерно такой: пользователь вводит какие-то данные в поле ввода и как только ввод закончен, на сервер отправляется асинхронный запрос (вот тут Вам в помощь jQuery + Ajax), где введенные данные сравниваются с данными, которые есть в базе (тут можно использовать любой язык на котором пишутся серверные сценарии) и если имя пользователя уже существует возвращается соответствующий ответ от сервера. Примерно так….
З.Ы. Мне кажется Вы немного «зациклились» именно на этой статье. Попробуйте не брать ее за основу, а использовать именно вышеописанный алгоритм.
Да, именно хочу облегчить пользователю жизнь=).
Скорее не на статье, а на примере из статьи подзациклился…
Я пытался реализовать схему, по которой от сервера я получаю список того что уже есть в базе данных, а потом уже с помощью jQuery & Ajax уже сравнивается введённое значение с полученным от сервера массивом. Конечно я прикинул, что, например, в форуме, где больше десятка тысяч пользователей это будет слишком мощно, но в моём случае, сопоставление должно происходить в худшем случае с 50 значениями, а обычно не более 15-20.
Похоже уровень моих знаний не позволяет воплотить предложенную вами идею. Хотя покопать в эту сторону попробую.
Спасибо за совет=)
Забавно=). То что я спрашивал было обсуждено с 1 по 6 ответы. Почему-то ранее я не очнеь обратил внимание на метод remote, а когда обратил, думал на тему запроса. А в итоге все ответы были даны=))). Спасибо всем за участие=)))
помгите плиз. очень срочно надо!…
у мна есть формочка, но мне надо валидировать только несколько из ее текстовых полей; каждому нужному мне полю я даю id с именем правила(rules) по которому надо проводить проверку; при загрузке страници плагин «хочет» что бы у каждого елемента формы был id, в чем и состоит суть проблеммы(и пока это так форма не отправит данные).
Сообщение из firebug: has no id assigned.
а ты присваивай ИД не только нужным полям, но и ненужным тоже, и им правила либо пустые прописывай, либо попробуй вообще не прописывать.
Дайте им какие-нибудь id. Наличие id не будет означать, что это поле обязательно надо проверять…
это не позволительно в моей ситуации((
почему?
стили цсс привязаны чтоль? а ты кросс-стайл делай типа
input #id1 {}
или позаменяй ид на классы.
или не в этом дело?
Александр, заменяю id на class – не работает; или может что в самом validate.js поменять надо?!?
а можно поподробнее узнать, почему другим ид прописать нельзя и тд. желательно бы код с описанием что хотелось бы и зачем и что. иначе по идее мы гадаем в чём дело.
to Александр:
$(«.valid»).validate({
rules : {
field : {required : true, minlength: 1},
mail : {required : true, email : true},
number : {required : true},
check : {required : true}
}
});
другим прописать нельзя, они могут еще понадобится, не подскажите почему не работает когда полю прописывать клас с правилом?
что значит они могут ещё понадобится? ид для них может понадобится? или что? поставь им ид с любым именем и просто не проверяй его через жкьюри.
Да, и в посте я нашёл кусок:
ignore – отменяет проверку полей формы с указанным селектором. В примере ниже – отменяет проверку для всех элементов с классом «ignore».
$(«#myform»).validate({
ignore: «.ignore»
});
в данном случае вроде как класс стоит. попробуй это
у меня появился вопрос – а как сделать запрет, например, на ввод русских букв, или вообще букв, чтобы только цифры вводить. меня интересует имено в jQuery, просто на яваскрипте можно это через обработчик onKeyPress сделать, но писать лишнее в код не хочется.
Смотрите Events jQuery – есть keyup(), keydown(), keypress()… + регэксп’ы.
мм, спасибо, буду пробовать
Здраствуйте! Помогите пожалуйста в скрипте! есть форма(с классом .valid), имеющая одно поле(с классом .required number) туда можно вписать только число,-иначе – сообщение об ошибке. Как можна сделать без использования плагина?
$(‘.valid’).ready(function () {
$(‘.valid .required’).each(function () {
var classArray = $(this).attr(‘class’).split(‘ ‘);
$(classArray).each(function(i){
if (classArray[i] == ‘number’ && !( /\D/.test($(this).val()) ))
{
alert(‘not a number’);
}
});
});
});
Заранее, Спасибо!
По-моему Вы очень много лишнего написали… Вот HTML:
<form id="form"><input type="text" name="digit" value="" /><br />
<input type="submit" name="submit" value="Send" />
</form>
<p id="error"></p>
А вот как справиться с задачей, используя jQuery:
$(document).ready(function(){$("#form input[name='digit']").keyup(function() {
var digit = $(this).attr("value");
if(!/^\d{1,}$/.test(digit)) {
$("#error").text("Упссссс...");
} else {
$("#error").text("Нормуль...");
}
});
});
Gennady, спасибо Вам большое…Вы не могли бы еще помочь с регекспом для валидации правильности е-мейла и проверки поля на «непустость»? а лутше сразу скриптом, буду очень Вам благодарен. Спасибо
Возьмите файл jquery.validate.js и посмотрите в строке 886 регэксп для проверки email. Там же можете найти алгоритм проверки на «непустость» – для примера. А вообще тут можно использовать свойство length значения соответствующего поля, если больше нуля – значит что-то есть… Только внимательно отнеситесь к выбору событий по которым будет проверяться «непустость»…
Gennady, не могу проверить поле свойством length на пустость(условие length!=0 не работает), в следствии этого и те поля, которые я проверяю на коректность введенного е-мейла тоже(не принужденно) становятся обязательными для заполнения(тоесть когда в них ничего нету, они все равно становятся идентифицироваными как непрошедшие валидацию на коректность ввода). Вы могли бы мне подсказать в чем проблемма?
Дополняя код предыдущего примера…..
$(document).ready(function(){
$(«#form input[name='digit']«).keyup(function() {
var digit = $(this).attr(«value»);
var len = digit.length;
if(!/^\d{1,}$/.test(digit)) {
$(«#error»).text(«Упссссс…» + len);
} else {
$(«#error»).text(«Нормуль…» + len);
}
});
});
только надо не забыть, что пользователь мог сначала ввести что-либо, а потом убрать это что-то. Т.е. одной проверки по keyup() тут недостаточно, надо предусматривать проверку по blur() или submit(), в общем еще что-то.
А что касается валидации email – не смешивайте все проверки в одну кучу. Вешайте на нужное поле обработчик события, и в нем проверяйте только то, что нужно.
А можно как то еще сделать, что бы когда хотя бы один из поих полей формы имеет стиль .error(тоесть не прошло валидацию успешно или т.п.) блокировать кнопку Submit(имею введу то что бы ее не можна было нажать; а когда ниодно из полей не имеет такой стиль,-разрешить нажатие кнопки)?
Можно конечно. Смотрите статью jQuery API: Attributes – атрибуты. Обратите внимание на hasClass(class), а потом Вам понадобится attr(key, value). Ну, пожалуй еще понадобится статья jQuery API: Selectors – селекторы jQuery: селекторы форм и фильтры форм…
у меня появился следующий вопрос. если поставить в форму поле для загрузки файла, то можно ли после того, как выбрал файл с компьютера, реализовать такую вещь, что без перезагрузки страницы файл загружается на сервер, ну, и выдаёт сообщение, что файл загружен
блин, имел в виду одно, а читая получается другое=)
уточню. когда я выберу файл текстовый, он загрузится, и мне нужно чтобы он мне вернул содержимое этого файла не перезагружая страницу с формой.
Это скорее по теме PHP (ну или вообще в по теме серверного приложения). Делать такое не делал, но надо думать возможно. В обработчике на сервере предусмотреть чтение данных из файла по окончании его загрузки и вернуть эти данные в качестве ответа от сервера… Примерно так.
Спасибо, буду думать=)
А как можно сделать обертку для существующего метода?
Добавление нового осуществляется примерно так:
http://docs.jquery.com/Plugins/Validation/Validator/addMethod
jQuery.validator.addMethod(«domain», function(value, element) {
return this.optional(element) || /^http://mycorporatedomain.com/.test(value);
}, «Please specify the correct domain for your documents»);
Как из этого метода вызвать уже существующие методы проверки?
Таким образом Вы только определяете свой, пользовательский метод, который можно будет вызывать впоследствии, наряду с built-in методами, например:
$(«#myform»).validate({
rules: {
myHost: {
required: true,
domain: true // свой метод
},
myEmail: {
required: true,
email: true // built-in метод email()
}
}
});
где myHost и myEmail – идентификаторы полей формы.
Gennady, спасибо за быстрый ответ, но Вы немного не поняли мой вопрос. Вот определили мы свой метод, допустим он называется example, как в определении сделать, что бы он ссылался на проверку уже существующего метода – remote, т.е. что-то вроде такого:
jQuery.validator.addMethod(”example”, function(value, element, param) {return this.optional(element) || jQuery.validator.methods.remote(value, element, param);
}, “Fuck example!”);
Т.е. получается обертка дял стандартного метода. Зачем мне это надо – из-за скрещивания с php-фреймворком. Сколько я не пробовал – пока не получается, но это потому что я в JS слабоват.
P.S. Не плохо было бы разрешить вставлять в комментарии тэг позволяющий нормально отображать код, а то каша получается.
Думаю, что вряд ли… Т.е. либо надо глобально разбираться с кодом самого плагина (чего в общем-то не делал, почему – см. ниже), либо написать что-то свое (даже на его основе). Я например, очень мало где вообще использую плагины – много лишнего получается, проще написать что-то легкое, конкретно под себя, используя саму библиотеку.
У меня есть форма в которой множество полей. Для формы используется метод проверки полей описанный выше. Также в эту форму с помошью AJAXa подгружаются ещё несколько полей, имена которых не известны заранее, но которые также необходимо проверять.
Вопрос вот в чем, могу ли я в подгружаемом с помощью AJAX коде прописать JavaScript который бы дополнял rules и messages к функции validate описанной заранее? Обращаю внимание, первоначальные поля и подргужаемые AJAXом поля находятся в пределах одного тэга FORM.
Заранее спасибо!
Попробуйте вызывать метод validate() по событию ajaxComplete (или ajaxSuccess), т.е. в тот момент, когда у Вас подгрузились дополнительные поля формы. Но в любом случае Вам наверняка придется еще что-то помудрить, чтобы прописать правила для тех полей, имена которых не были известны.
Не могли бы вы показать, как должен быть устроен файл check-email.php
Заранее благодарю!
Если речь идет конкретно о проверке корректности e-mail адреса средствами php, то как правило используется регулярное выражение. А какое конкретно – тут уж дело каждого. Примеров в сети можно нарыть много, достаточно чуть погуглить на эту тему.
Главное сказать, что пхп должен выдавать либо true, либо false через оператор типа echo.
Я сначала тупил на этот счёт, поскольку описание невнимательно прочитал. Когда обратил на это внимание, всё стало на свои места.
Нет, речь идёт конкретно не о проверке email, а то как он принимает пару ключ/значение и как выдает true или false…
Что-то через echo не работает… может конечно я туплю…
Выкладывай код, посмотрим=)
if($_SERVER['HTTP_X_REQUESTED_WITH']==’XMLHttpRequest’) {
if(($Email==»Example@email.ru»)){
echo «false»;
}
else{
echo «true»;
}
}
УРА! Нашёл в примере, как надо :
$request = trim(strtolower($_REQUEST['email']));
$emails = array(‘glen@marketo.com’, ‘george@bush.gov’, ‘me@god.com’, ‘aboutface@cooper.com’, ’steam@valve.com’, ‘bill@gates.com’);
$valid = ‘true’;
foreach($emails as $email) {
if( strtolower($email) == $request )
$valid = «false»;
}
echo $valid;
Всем привет. Есть такое:
function valid_fiz() {
$(«#form_add_user»).validate({
rules: {
fio_full: {required: true,minlength: 2},
fio_sokr: {required: true,minlength: 2},
login: {required: true,minlength: 5},
pass_stat: {required: true,minlength: 6},
pass_vpn: {required: true,minlength: 6}
},
errorPlacement: function(error, element) {
var em = element.attr(«name»);
var title = $(«#d_»+em).attr(«class»);
$(«#error_»+em).html(error.attr(«text»));
$(«#d_error_»+em).show();
},
success: function(label) {
var em1 = label.attr(«for»);
$(«#d_error_»+em1).hide();
}
});
}
поле в форме такое:
ФИО полное
ъ
При сабмите еррор вставляется в спан, при заполнении поля, див скрывается.
Все работает в ИЕ7 и опера 9.25
а вот в ИЕ 6.0 не хочет
Как решить?
поле вот такое:
<fieldset>
ФИО полное<br>
<input type="text" name="fio_full" id="fio_full" class="container_wide" value="<? echo $_POST["fio_full"].$edit_name_full;?>"><br>
<div class="d_error_msg" id="d_error_fio_full"><span id="error_fio_full"></span></div>
</fieldset>
по предыдущему вопрос снят, проблема решена выводом ошибки через error.appendTo
новый вопрос:
А можно с помощью данного плагина проверить валидность одного из двух полей?
т.е. правильность ввода либо поля1 либо поля2 ?
С помощью именно этого плагина, насколько я его помню – нет. Но на самом деле плагин же использовать совсем необязательно. Можно нафантазировать что-то свое, а например правила проверки взять из исходников самого плагина. Плагин – это все-таки некая универсальная вещь, со своими достоинствами конечно, но и без недостатков. Я могу Вас уверить, что если Вы озадачитесь написанием кода именно под свою конкретную задачу – получится лучше, да и кода будет наверняка намного меньше.
Я в яве не очень силен, такое не смогу осилить.
Нет примерчика?
To Cramac – вообще-то это не Java, это JavaScript… Тут примерчиком вряд ли можно обойтись, для этого нужно от истоков идти…
Все же странный плагин. Не очень работоспособен.
а возможно вставить сообщение об ошибки в отдельную переменную?
из errorPlacement: function(error, element)
Да файлы не корректно отобразились. Я могу скинуть их на мыло. А ты выложишь как пример на своём сайте.
To Bond: к моему сожалению, я просто не имею столько времени, чтобы детально разбирать код. Когда что-то не работает в IE и работает во всех остальных браузерах, я обычно ищу где точку с запятой не поставил. В этом случае у меня например, даже FireBug ничего не говорит, однако действительно все браузеры отрабатывают, а IE – нет.
Добрый день Геннадий, очень приятно что Ваш сайт живой (рад быстрому ответу), спасибо.
Я скачал IE 8.0 там есть очень хороший отладчик, и есть возможность просмотра по предыдущим версиям IE (beta) и нашел ошибку.
Мой код, выше изложенный, можно удалить. Не каждый бы хотел в чужом коде разбираться.
Если не секрет – в чем же была ошибка? Да и за инфу про отладчик от IE8 – спасибо, не знал…
user_login.focus(); IE считает ошибкой
Привет всем. В ответе выше был пример отправки через methot=GET. А как сделать POST?. Куда его вставлять в данном примере.
Не очень понятно в каком именно примере… Вы просто попробуйте прочитать статью jQuery Form – делаем ajax-форму и думаю, все станет ясно.
У меня вопрос. Как изменить стиль вывода сообщения об ошибке – сделать фоновый цвет, выводить в строчку, сдвигать? В данном примере стиль не совсем подходит. Использование CSS над к сожалению ничего не дало.
Стилевое оформление сообщений об ошибке определяется CSS-правилами для label и label em. Очень просто.
У меня вопрос. Как правильно использовать ignore, для динамического изменнения списка проверяемых полей формы?
Нижеуказанный, метод не помог, полностью уничтожает все правилапроверки
if(nom==0){
$(«#orderForm»).validate(«ignore»,».ignore»); ignore: «»
}else{ $(«#orderForm»).validate({
ignore: «.ignore»
});
}
Bond, Gennady, что делать с IE? А то не работает валидация и сразу бросает на следующую страницу, которую сервер так просто не отдаст…
А что IE? Вы просто удостоверьтесь в том, что на самом-то деле все работает и в IE тоже – просто откройте эту страницу в нем и проверьте. Значит в Вашем коде есть какая-то бага.
Собственно jQuery тем и хороша, что снимает с разработчика головную боль, которая возникает при одной только мысли о совместимости кода с разными браузерами…
Я пробовал этот пример на jquery-1.3 и у меня он не заработал, на 1.2.6 все работает.
Не знаете в чем может быть причина?
у меня возникло два вопроса.
1) есть поле формы, которое нужно сверить с полем из базы данных, пускай будет поле user. Но значений этого поля много и у каждого из них есть свой id. проверяю введённое значение user я через remote, и он естественно берёт первое значение в таблице. как мне можно через remote (или ещё как) передать помимо введённого поля user данные из другого поля?
2) возможно ли проверять совместно два введённых поля? я попробовал установить один и тот же файл проверки на два поля через remote. не работает.
Опцию remote можно «настроить» так же, как Вы делаете, используя $.ajax(options). Вот в примере, определяем метод передачи данных как POST, ну url – тут понятно,а в опции data – дополнительные данные, причем они могут быть получены с помощью какой-либо функции. Почему бы тут не получить значения нужных полей?
$(«#myform»).validate({
rules: {
email: {
required: true,
email: true,
remote: {
url: «check-email.php»,
type: «post»,
data: {
otherfield: function() {
return $(«#somefield»).val();
}
}
}
}
}
});
ммм, не очень понял. то есть в check-email.php будет передано не только поле email, но и всё то, что мы можем передать через data?
а приём параметра будет принят в check-email.php посредством $_REQUEST['email'] и $_REQUEST['имя-поля-которое-укажем-в-data?']
Вы все поняли правильно. Правда на практике я это не использовал никогда – это по документации к плагину.
мммм, спасибо!!!
сегодня уже нет сил пробовать, завтра попробую и если чего да как – напишу. И если можно хотелось бы уточнить по поводу
data: {
otherfield: function() {
return $(”#somefield”).val();
}
otherfield может иметь любое имя, или оно всё таки должно иметь тоже имя, что и somefield?
как понимаю, в пхп файле буду использовать $_REQUEST[’somefield’], а не [’data’] или [’otherfield’]?
Нет, по идее имя должно быть $_REQUEST[’otherfield’], но можно еще попробовать поэксперементировать и передать в data не одну переменную, а несколько. Т.е. через запятую добавить еще переменную и посмотреть, что будет.
Самому, если честно, просто нет времени пробовать, но вообще интересно…
спасибо большое. завтра попробую варианты, если выйдет скажу как, если нет, скажу что перепробовал.
странно, конечно, но работать не хочет. была строчка
remote: «users/check.php»
заменяю если даже на простую
remote: {
url: «users/check.php»,
type: «post»
}
уже не работает.
у меня jQuery 1.2.6 и валидэйшан 1.4.
Решил пойти другим путём, добавлением нового правила для валидатора, в которое потом можно и будет через data добавить взятие значения другого поля. Но для начала надо правило сделать. Вроде бы написал, вроде бы работает, в плане того, что ответ присылает. Правда всегда false. Я не очень понимаю, что должен выдавать в ответ файл php. Изначально он у меня значение поля как $_REQUEST['name'] (или $_POST['name']), где name – имя моего поля формы. Ну и в качестве ответа выводил true или false. А тут я прямо в ступор встал N_N
jQuery.validator.addMethod(‘check_name’, function(name) {
var postURL = «users/check.php»;
$.ajax({
cache:false,
type: «POST»,
data: name,
url: postURL,
success: function(answer) {
result = (answer==’true’) ? true : false;
}
});
return result;
}, »);
Спасибо большое.
Да, я со всем этим заморачиваюсь, чтобы сопоставлялись поля пользователя и пароля и если они верны, то пользователь может что-то сделать дальше (в моём случае поменять имя и пароль). Может быть есть способ попроще это сделать? В плане через проверку форм jquery.
Установил Validation для формы.
Проверяю поля, делаю валидацию.
———————-
$(document).ready(function() {
var validator = $(«#f1″).validate({
rules: { pole0: {
required: true,
minlength: 2
},
pole1: {
required: true,
minlength: 2
},
pole2: {
required: true,
minlength: 2
}, и так далее…..
———————
…..
….
———————
В случае успешной валидации – всегда открывается следующая страница.
Все работает по валидации….
Подскажите, как можно добавить открытие в выпадающем окне…. ?
Если добавлять типа так:
то конечно, окно откроется сразу не дожидаясь до валидации…
Как это можно реализовать ?
Спасибо за ответ.
form id=’f1′ name=’f1′ method=’post’ action=’senddata’
продублирую ее….)
…..
….
форму вырезали когда добавлял вопрос….
А простая форма с выпадающем окном работает, но не ждет самой валидации (убрал скобки, а то код вырезается):
form id=’f1′ name=’f1′ method=’post’ action=’senddata’ onsubmit=»window.open(»,’Order Confirmation’,'width=600,height=600,scrollbars=yes’)»
есть удаленный скрипт. Как можно изменить принудительно название переменной (в примере pole0) ? Переменная pole0 передается на вызов remote:
—————–
pole0: {
required: true,
minlength: 9,
remote: {
url: «checkdocument.php»,
type: «get»
}
},
————-
To Sergey:
>> В случае успешной валидации – всегда открывается следующая страница.
Зачем? Вернее, что значит – открывается следующая страница? Зачем вообще тогда морочиться с AJAX?
Вы просто пример на этой странице посмотрите – заполнили форму верно – только тогда она отправится на сервер, где с данными будут проведены какие-либо операции, и сервер вернет ответ, который Вы вставляете в эту же страницу. Для творчества простор – хотите вместо формы, хотите рядом с формой, хотите, пусть какой-то блок с сообщением появится….
Скажите пожалуйста, а как нужно а верней как подключить файлы с папки localization, везде искал так и негде не нашол.
а подскажите пожалуйста, как задать на input type=file проверку с помощью remote? потому что requared работает, а ремут нет.
ЗЫ сервер в тестовом всегда возвращает false, но форма все равно отправляется
To Alexey:
Точно так же, как подключается любой внешний файл
<script type=»text/javascript» src=»js/messages_ru.js»></script>
Файлы локализаций лежат тут:
http://jquery.bassistance.de/validate/localization/
To Gennady:
Спасибо !
remote не работает в IE любой версии. Никто не сталкивался?
Самое интересное пример /js/jquery-validate/demo/milk/ из самого плагина тоже не работает! Версия 1.5.1. Может кто поделится одной из старых версий?
Здравствуйте Геннадий,
столкнулась с проблемой в использовании jquery.validation plugin.
на сайте есть форма редактирования данных клуба (clubid, clubname…), поля в этой форме я заполняю при помощи .$ajax{…}.
на этой форме у меня висит .validate(..),
clubname – проверяю с помощью remote на существование в базе (если у же есть такое название – false, если название свободно – true)
все отрабатывает отлично, в базу лезет ответ возвращет, НО remote при отправке данных берет их из кэша – и получается что clubname всегда отправляется как пустое значение (то есть он не видит тех значений который я подгружаю в форму ajax-ом).
можно ли как то избежать кэширования в этом случае
remote: {
cache: false
url: ….
} – не помогает
пример кода
ФОРМА
название клуба*
адрес*
ЗАГРУЗКА ДАННЫХ В ФОРМУ
$(«a[name='clubedit']«).click(function(){
$eid = $(this).attr(«id»);
$pos = $eid.indexOf(«_»);
$cid = $eid.substring($pos+1);
$.ajax({
cache: false,
data:»a=getclub&f_clubid=»+$cid,
url: «club.php»,
dataType: «json»,
success: function(json){
var club = json.club[0];
$(«#f_clubid»).val(club.clubid);
$(«#f_club_clubname»).val(club.clubname);
},
error: function(){
alert(«Возникла ошибка при получении данных.»);
}
});
});
ВАЛИДАЦИЯ
$(«#newclubform»).validate({
rules: {
f_club_clubname: {
required: true,
remote: {
cache: false,
type: «post»,
data: «a=validate_clubname&f_clubname=»+$(«#f_club_clubname»).val(),
url: «ajax.php»,
beforeSend: function(){
$(«#loading_clubname»).show();
},
complete: function(){
$(«#loading_clubname»).hide();
}
}
}
},
messages: {
f_club_clubname: {
required: «Введите название клуба»,
remote: «Клуб с таким названием уже существует»
}
},
errorPlacement: function(error, element) {
error.appendTo(element.parent().next());
},
submitHandler: function() {
/* … */
}
});
Марина, мне кажется (насколько я из кода понял) – это просто небольшое нарушение логики. Смотрите: загрузилась страница с JS-кодом, при этом к форме #newclubform подключен метод validate(), который при загрузке взял данные из еще пустых полей формы – вот он ими и оперирует. Вероятно Вам надо рассмотреть возможность вызывать метод validate() по какому-то событию. Например в опции success при успешной загрузке данных в форму.
Спасибо за помощь и быстрый ответ ) Я повесила .validate на success который загружает данные в форму, remote стал брать новое, загруженное значение (например club1), но если в форме это значение менять (например на club2) – отправляет remote опять же club1.
неужели придется каждый раз снова прицеплять .validate при возникновении событий onkeyup и onblur поля clubname?
это мой первый проект в котором я использую jquery и jquery.validation, возможно я что-то еще упустила из виду )) буду очень благодарна за помощь в этом вопросе
Да, идея с success плохая была. Я посмотрел документацию по плагину. Там есть такой пример использования remote:
$("#myform").validate({ rules: { email: { required: true, email: true, remote: { url: "check-email.php", type: "post", data: { username: function() { return $("#username").val(); } } } } } });Можно попробовать вернуться к началу и оформить код, как рекомендовано в примере.
Вот еще ссылка на документацию:
http://docs.jquery.com/Plugins/Validation/Methods
Огромное спасибо, Геннадий,
Сделала передачу данных как в примере – все заработало отлично.
Вот уж действительно иногда нужно просто следовать инструкции ))
Еще раз спасибо за помощь )
Скажите вот пытаюсь побороться с выводом ошибок..как сделать так чтобы ошибки выводились не в столбик а в одну строчку
Опция errorPlacement – callback-функция определенная в ней принимает аргументами текст ошибки и элемент в котором эта ошибка произошла. Просто напишите эту функцию так, чтобы она вставляла сообщения об ошибках в нужные элементы. Ну и CSS для оформления этих элементов.
ничего не понимаю, вроде сделал также как на примере, но вот только если много если несколько раз нажимаешь на «субмит» , то сообщение типа «Укажите свое имя!» каждый раз прописывается еще раз рядом… как это исправить?
вопрос снят, оказывается это было из-за того что форма в таблице была…
а можно делать проверку по образцу, например 23×500x150, т.е чтоб можно было ввести 3 разных числа через «x»?
Можно например дополнить файл additional-methods.js своей собственной проверкой. Пишите свое собственное регулярное выражение и добавляйте его.
у меня форма в таблице…
Имя
и в ней скрипт не работает, кто знает что нужно исправить?
Имя
хотел пример привести но что-то теги «tr» «tr» не отображаются((
Разбираться почему… Первое – проверять правильно ли «цепляете» метод к форме. Самое надежное – это указывать в селекторе идентификатор формы. Второе – проверить соблюдение требований к HTML-разметке формы (они в посте расписаны).
Лучше всего попробовать запустить плагин без таблицы и добиться, чтобы он у Вас заработал, а уж потом таблицу добавлять…
P.S. Кстати, зачем? Неужели верстка табличная???
У меня в форме есть select, в зависимости от выбора пользователя я вызываю validate с соответствующими правилами. По первому вызову правила устанавливаются, а последующие игнорируются. В чём может быть ошибка?
У вас в примере используется jquery-1.2.3.js, я пробовал использовать последний: jquery-1.3.2.js.
С ним не работает.
Подскажите, это единичный баг, это не стабильная версия или не поддерживаются прошлые версии?
To Виталик:
Вряд ли можно что-то посоветовать не видя кода… Мне кажется, что Вы определяете правила при загрузке, но не факт, что вызываете их в дальнейшем…
Извините, комментирование этой статьи завершено. Обсуждение статьи можно продолжить на форуме jQuery.
[...] друга. Среди них рекомендую к ознакомлению статью jQuery Validation – проверка данных в ajax форме и статью по решению некоторых вопросов валидации на [...]