#jquery #validation
#jquery #проверка
Вопрос:
Я пытаюсь настроить удаленную проверку с помощью плагина проверки jQuery 1.8.0 (и jQuery 1.5.2).
Это нормально работает для «required» и «maxlength», но удаленная проверка работает ТОЛЬКО после 2-го щелчка (проверки), или если какая-либо из других ошибок была вызвана ранее.
Проверка выполняется правильно и отображается сообщение об ошибке, но в первый раз проверка возвращает значение true (даже если отображается ошибка). Это проблема, поскольку форма будет отправлена с ошибкой.
Вот мой код (упрощенный):
<script type="text/javascript">
$(function() {
$( "#check" ).click(function(){
var valid = $("#myForm").validate(
{rules: {
groupName:{
required:true,
maxlength:40,
remote: {
url: 'ajaxCheck.php', // returns always a dummy string: "Simulate an error message" (JSON encoded)
type: "post",
data: {
groupName: function() {
return $("#groupName").val()
}
}
}
}
}
}
).form();
alert(valid); // Returns true at the first call, and then false
});
});
</script>
<form id="myForm" action="">
<label for="groupName">Group name</label>
<input type="text" maxlength="40" size="45" value="my test" id="groupName" name="groupName">
</form>
<input type="button" value="Check form" id="check" >
В ajaxCheck.php содержит:
require_once ('Zend/Json/Encoder.php');
echo Zend_Json_Encoder::encode("Simulate an error message");
Ответ JSON, похоже, правильно закодирован (проверено с помощью Firebug).
Есть идеи, что я делаю не так?
Я пробовал также jQuery 1.6, но в IE8 возникли другие проблемы.
Комментарии:
1. Да, ссылка на плагин проверки jQuery[/link]
Ответ №1:
Вы не ждете, пока произойдет проверка, прежде чем использовать возвращаемое значение. Причина в том, что для проверки требуется ajax-запрос, а вы его не ждете. Правильный способ сделать это — включить любой код, который вы хотите запустить после проверки, в обратный вызов. В плагине проверки есть invalidHandler
, который вызывается, когда проверка завершается неудачей. Вы используете его, добавляя его в объект options, который вы передаете validate()
вот так:
$(function() {
$( "#check" ).click(function(){
var valid = $("#myForm").validate(
{rules: {
groupName:{
required:true,
maxlength:40,
remote: {
url: 'ajaxCheck.php', // returns always a dummy string: "Simulate an error message" (JSON encoded)
type: "post",
data: {
groupName: function() {
return $("#groupName").val()
}
}
}
}
},
invalidHandler: function(form, validator){
alert('invalid input'); //note this is called ONLY IF validation fails
}
}
).form();
});
});
Плагин проверки имеет ряд обратных вызовов, которые вызываются на основе результатов проверки. Взгляните на них здесь (нажмите «параметры» и найдите функции, которые являются «обратными вызовами».)
Комментарии:
1. Спасибо. Я пробовал этот код, но теперь я немного запутался. Если я проверяю форму с пустым полем, дважды отображается сообщение «неверный ввод» (запускается ли этот обработчик для каждой ошибки? (обязательная и удаленная ошибка в данном случае).
2. прежде всего: что это за
.form()
функция, которую вы вызываете в форме? Отправляет ли он форму?3. я не думаю, что это проблема с запуском invalidHandler для каждой ошибки, но, скорее всего, проверка выполняется дважды по какой-то причине. Возможно, эта
form()
функция вызывает дополнительную проверку? Я не уверен. Вы могли бы попробовать установить onsubmit формы = для функции проверки и избавиться от обработчика нажатия на эту кнопку.4. Большое спасибо за ваше предложение. Теперь это работает! Форма была проверена дважды (я удалил обработчик щелчка). С наилучшими пожеланиями. Мэтт