Удаленная проверка jQuery работает только при 2-м нажатии

#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. Большое спасибо за ваше предложение. Теперь это работает! Форма была проверена дважды (я удалил обработчик щелчка). С наилучшими пожеланиями. Мэтт